changeset 232:842ac79d0b67

example_crates: Update generated code
author Lewin Bormann <lbo@spheniscida.de>
date Thu, 04 Mar 2021 12:03:36 +0100
parents f967f5fc21fb
children 3b7daccab9ef
files example_crates/calendar_example/src/calendar_v3_types.rs example_crates/drive_example/src/drive_v3_types.rs example_crates/gcs_example/src/storage_v1_types.rs example_crates/youtube_example/src/youtube_v3_types.rs
diffstat 4 files changed, 20630 insertions(+), 20644 deletions(-) [+]
line wrap: on
line diff
--- a/example_crates/calendar_example/src/calendar_v3_types.rs	Thu Mar 04 12:03:20 2021 +0100
+++ b/example_crates/calendar_example/src/calendar_v3_types.rs	Thu Mar 04 12:03:36 2021 +0100
@@ -21,18 +21,6 @@
 /// Scopes of this API. Convertible to their string representation with `AsRef`.
 #[derive(Debug, Clone, Copy)]
 pub enum CalendarScopes {
-    /// View your Calendar settings
-    ///
-    /// URL: https://www.googleapis.com/auth/calendar.settings.readonly
-    CalendarSettingsReadonly,
-    /// See and download any calendar you can access using your Google Calendar
-    ///
-    /// URL: https://www.googleapis.com/auth/calendar.readonly
-    CalendarReadonly,
-    /// View events on all your calendars
-    ///
-    /// URL: https://www.googleapis.com/auth/calendar.events.readonly
-    CalendarEventsReadonly,
     /// See, edit, share, and permanently delete all the calendars you can access using Google Calendar
     ///
     /// URL: https://www.googleapis.com/auth/calendar
@@ -41,211 +29,42 @@
     ///
     /// URL: https://www.googleapis.com/auth/calendar.events
     CalendarEvents,
+    /// View events on all your calendars
+    ///
+    /// URL: https://www.googleapis.com/auth/calendar.events.readonly
+    CalendarEventsReadonly,
+    /// View your calendars
+    ///
+    /// URL: https://www.googleapis.com/auth/calendar.readonly
+    CalendarReadonly,
+    /// View your Calendar settings
+    ///
+    /// URL: https://www.googleapis.com/auth/calendar.settings.readonly
+    CalendarSettingsReadonly,
 }
 
 impl std::convert::AsRef<str> for CalendarScopes {
     fn as_ref(&self) -> &'static str {
         match self {
+            CalendarScopes::Calendar => "https://www.googleapis.com/auth/calendar",
+            CalendarScopes::CalendarEvents => "https://www.googleapis.com/auth/calendar.events",
+            CalendarScopes::CalendarEventsReadonly => {
+                "https://www.googleapis.com/auth/calendar.events.readonly"
+            }
+            CalendarScopes::CalendarReadonly => "https://www.googleapis.com/auth/calendar.readonly",
             CalendarScopes::CalendarSettingsReadonly => {
                 "https://www.googleapis.com/auth/calendar.settings.readonly"
             }
-            CalendarScopes::CalendarReadonly => "https://www.googleapis.com/auth/calendar.readonly",
-            CalendarScopes::CalendarEventsReadonly => {
-                "https://www.googleapis.com/auth/calendar.events.readonly"
-            }
-            CalendarScopes::Calendar => "https://www.googleapis.com/auth/calendar",
-            CalendarScopes::CalendarEvents => "https://www.googleapis.com/auth/calendar.events",
         }
     }
 }
 
 #[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct Setting {
-    /// Type of the resource ("calendar#setting").
-    #[serde(rename = "kind")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub kind: Option<String>,
-    /// Value of the user setting. The format of the value depends on the ID of the setting. It must always be a UTF-8 string of length up to 1024 characters.
-    #[serde(rename = "value")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub value: Option<String>,
-    /// ETag of the resource.
-    #[serde(rename = "etag")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub etag: Option<String>,
-    /// The id of the user setting.
-    #[serde(rename = "id")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub id: Option<String>,
-}
-
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct EventAttachment {
-    /// Attachment title.
-    #[serde(rename = "title")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub title: Option<String>,
-    /// Internet media type (MIME type) of the attachment.
-    #[serde(rename = "mimeType")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub mime_type: Option<String>,
-    /// URL link to the attachment.
-    /// For adding Google Drive file attachments use the same format as in alternateLink property of the Files resource in the Drive API.
-    /// Required when adding an attachment.
-    #[serde(rename = "fileUrl")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub file_url: Option<String>,
-    /// URL link to the attachment's icon. Read-only.
-    #[serde(rename = "iconLink")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub icon_link: Option<String>,
-    /// ID of the attached file. Read-only.
-    /// For Google Drive files, this is the ID of the corresponding Files resource entry in the Drive API.
-    #[serde(rename = "fileId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub file_id: Option<String>,
-}
-
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct FreeBusyRequest {
-    /// DateTime: The start of the interval for the query formatted as per RFC3339.
-    #[serde(rename = "timeMin")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub time_min: Option<DateTime<Utc>>,
-    /// Maximal number of calendar identifiers to be provided for a single group. Optional. An error is returned for a group with more members than this value. Maximum value is 100.
-    #[serde(rename = "groupExpansionMax")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub group_expansion_max: Option<i32>,
-    /// Time zone used in the response. Optional. The default is UTC.
-    #[serde(rename = "timeZone")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub time_zone: Option<String>,
-    /// DateTime: The end of the interval for the query formatted as per RFC3339.
-    #[serde(rename = "timeMax")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub time_max: Option<DateTime<Utc>>,
-    /// List of calendars and/or groups to query.
-    #[serde(rename = "items")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub items: Option<Vec<FreeBusyRequestItem>>,
-    /// Maximal number of calendars for which FreeBusy information is to be provided. Optional. Maximum value is 50.
-    #[serde(rename = "calendarExpansionMax")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub calendar_expansion_max: Option<i32>,
-}
-
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct FreeBusyResponse {
-    /// DateTime: The start of the interval.
-    #[serde(rename = "timeMin")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub time_min: Option<DateTime<Utc>>,
-    /// List of free/busy information for calendars.
-    #[serde(rename = "calendars")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub calendars: Option<HashMap<String, FreeBusyCalendar>>,
-    /// Type of the resource ("calendar#freeBusy").
-    #[serde(rename = "kind")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub kind: Option<String>,
-    /// DateTime: The end of the interval.
-    #[serde(rename = "timeMax")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub time_max: Option<DateTime<Utc>>,
-    /// Expansion of groups.
-    #[serde(rename = "groups")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub groups: Option<HashMap<String, FreeBusyGroup>>,
-}
-
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct Colors {
-    /// A global palette of calendar colors, mapping from the color ID to its definition. A calendarListEntry resource refers to one of these color IDs in its color field. Read-only.
-    #[serde(rename = "calendar")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub calendar: Option<HashMap<String, ColorDefinition>>,
-    /// DateTime: Last modification time of the color palette (as a RFC3339 timestamp). Read-only.
-    #[serde(rename = "updated")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub updated: Option<DateTime<Utc>>,
-    /// A global palette of event colors, mapping from the color ID to its definition. An event resource may refer to one of these color IDs in its color field. Read-only.
-    #[serde(rename = "event")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub event: Option<HashMap<String, ColorDefinition>>,
-    /// Type of the resource ("calendar#colors").
-    #[serde(rename = "kind")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub kind: Option<String>,
-}
-
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct ConferenceParameters {
-    #[serde(rename = "addOnParameters")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub add_on_parameters: Option<ConferenceParametersAddOnParameters>,
-}
-
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct Calendar {
-    /// Identifier of the calendar. To retrieve IDs call the calendarList.list() method.
-    #[serde(rename = "id")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub id: Option<String>,
-    /// Description of the calendar. Optional.
-    #[serde(rename = "description")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub description: Option<String>,
-    /// Type of the resource ("calendar#calendar").
-    #[serde(rename = "kind")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub kind: Option<String>,
-    /// Geographic location of the calendar as free-form text. Optional.
-    #[serde(rename = "location")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub location: Option<String>,
-    /// Title of the calendar.
-    #[serde(rename = "summary")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub summary: Option<String>,
-    /// ETag of the resource.
-    #[serde(rename = "etag")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub etag: Option<String>,
-    /// The time zone of the calendar. (Formatted as an IANA Time Zone Database name, e.g. "Europe/Zurich".) Optional.
-    #[serde(rename = "timeZone")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub time_zone: Option<String>,
-    #[serde(rename = "conferenceProperties")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub conference_properties: Option<ConferenceProperties>,
-}
-
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct CalendarList {
+pub struct Acl {
     /// ETag of the collection.
     #[serde(rename = "etag")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub etag: Option<String>,
-    /// Calendars that are present on the user's calendar list.
-    #[serde(rename = "items")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub items: Option<Vec<CalendarListEntry>>,
-    /// Token used to access the next page of this result. Omitted if no further results are available, in which case nextSyncToken is provided.
-    #[serde(rename = "nextPageToken")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub next_page_token: Option<String>,
-    /// Token used at a later point in time to retrieve only the entries that have changed since this result was returned. Omitted if further results are available, in which case nextPageToken is provided.
-    #[serde(rename = "nextSyncToken")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub next_sync_token: Option<String>,
-    /// Type of the collection ("calendar#calendarList").
-    #[serde(rename = "kind")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub kind: Option<String>,
-}
-
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct Acl {
     /// List of rules on the access control list.
     #[serde(rename = "items")]
     #[serde(skip_serializing_if = "Option::is_none")]
@@ -254,10 +73,6 @@
     #[serde(rename = "kind")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub kind: Option<String>,
-    /// ETag of the collection.
-    #[serde(rename = "etag")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub etag: Option<String>,
     /// Token used to access the next page of this result. Omitted if no further results are available, in which case nextSyncToken is provided.
     #[serde(rename = "nextPageToken")]
     #[serde(skip_serializing_if = "Option::is_none")]
@@ -268,66 +83,9 @@
     pub next_sync_token: Option<String>,
 }
 
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct Events {
-    /// DateTime: Last modification time of the calendar (as a RFC3339 timestamp). Read-only.
-    #[serde(rename = "updated")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub updated: Option<DateTime<Utc>>,
-    /// Token used to access the next page of this result. Omitted if no further results are available, in which case nextSyncToken is provided.
-    #[serde(rename = "nextPageToken")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub next_page_token: Option<String>,
-    /// Token used at a later point in time to retrieve only the entries that have changed since this result was returned. Omitted if further results are available, in which case nextPageToken is provided.
-    #[serde(rename = "nextSyncToken")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub next_sync_token: Option<String>,
-    /// The user's access role for this calendar. Read-only. Possible values are:  
-    /// - "none" - The user has no access.
-    /// - "freeBusyReader" - The user has read access to free/busy information.
-    /// - "reader" - The user has read access to the calendar. Private events will appear to users with reader access, but event details will be hidden.
-    /// - "writer" - The user has read and write access to the calendar. Private events will appear to users with writer access, and event details will be visible.
-    /// - "owner" - The user has ownership of the calendar. This role has all of the permissions of the writer role with the additional ability to see and manipulate ACLs.
-    #[serde(rename = "accessRole")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub access_role: Option<String>,
-    /// Type of the collection ("calendar#events").
-    #[serde(rename = "kind")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub kind: Option<String>,
-    /// List of events on the calendar.
-    #[serde(rename = "items")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub items: Option<Vec<Event>>,
-    /// Description of the calendar. Read-only.
-    #[serde(rename = "description")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub description: Option<String>,
-    /// Title of the calendar. Read-only.
-    #[serde(rename = "summary")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub summary: Option<String>,
-    /// ETag of the collection.
-    #[serde(rename = "etag")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub etag: Option<String>,
-    /// The time zone of the calendar. Read-only.
-    #[serde(rename = "timeZone")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub time_zone: Option<String>,
-    /// The default reminders on the calendar for the authenticated user. These reminders apply to all events on this calendar that do not explicitly override them (i.e. do not have reminders.useDefault set to True).
-    #[serde(rename = "defaultReminders")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub default_reminders: Option<Vec<EventReminder>>,
-}
-
 /// The scope of the rule.
 #[derive(Serialize, Deserialize, Debug, Clone, Default)]
 pub struct AclRuleScope {
-    /// The email address of a user or group, or the name of a domain, depending on the scope type. Omitted for type "default".
-    #[serde(rename = "value")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub value: Option<String>,
     /// The type of the scope. Possible values are:  
     /// - "default" - The public scope. This is the default value.
     /// - "user" - Limits the scope to a single user.
@@ -336,6 +94,10 @@
     #[serde(rename = "type")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub type_: Option<String>,
+    /// The email address of a user or group, or the name of a domain, depending on the scope type. Omitted for type "default".
+    #[serde(rename = "value")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub value: Option<String>,
 }
 
 #[derive(Serialize, Deserialize, Debug, Clone, Default)]
@@ -344,6 +106,10 @@
     #[serde(rename = "etag")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub etag: Option<String>,
+    /// Identifier of the ACL rule.
+    #[serde(rename = "id")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub id: Option<String>,
     /// Type of the resource ("calendar#aclRule").
     #[serde(rename = "kind")]
     #[serde(skip_serializing_if = "Option::is_none")]
@@ -361,49 +127,65 @@
     #[serde(rename = "scope")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub scope: Option<AclRuleScope>,
-    /// Identifier of the ACL rule.
-    #[serde(rename = "id")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub id: Option<String>,
-}
-
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct TimePeriod {
-    /// DateTime: The (inclusive) start of the time period.
-    #[serde(rename = "start")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub start: Option<DateTime<Utc>>,
-    /// DateTime: The (exclusive) end of the time period.
-    #[serde(rename = "end")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub end: Option<DateTime<Utc>>,
 }
 
 #[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct ConferenceRequestStatus {
-    /// The current status of the conference create request. Read-only.
-    /// The possible values are:  
-    /// - "pending": the conference create request is still being processed.
-    /// - "success": the conference create request succeeded, the entry points are populated.
-    /// - "failure": the conference create request failed, there are no entry points.
-    #[serde(rename = "statusCode")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub status_code: Option<String>,
+pub struct Calendar {
+    #[serde(rename = "conferenceProperties")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub conference_properties: Option<ConferenceProperties>,
+    /// Description of the calendar. Optional.
+    #[serde(rename = "description")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub description: Option<String>,
+    /// ETag of the resource.
+    #[serde(rename = "etag")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub etag: Option<String>,
+    /// Identifier of the calendar. To retrieve IDs call the calendarList.list() method.
+    #[serde(rename = "id")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub id: Option<String>,
+    /// Type of the resource ("calendar#calendar").
+    #[serde(rename = "kind")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub kind: Option<String>,
+    /// Geographic location of the calendar as free-form text. Optional.
+    #[serde(rename = "location")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub location: Option<String>,
+    /// Title of the calendar.
+    #[serde(rename = "summary")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub summary: Option<String>,
+    /// The time zone of the calendar. (Formatted as an IANA Time Zone Database name, e.g. "Europe/Zurich".) Optional.
+    #[serde(rename = "timeZone")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub time_zone: Option<String>,
 }
 
 #[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct ConferenceSolution {
-    #[serde(rename = "key")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub key: Option<ConferenceSolutionKey>,
-    /// The user-visible name of this solution. Not localized.
-    #[serde(rename = "name")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub name: Option<String>,
-    /// The user-visible icon for this solution.
-    #[serde(rename = "iconUri")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub icon_uri: Option<String>,
+pub struct CalendarList {
+    /// ETag of the collection.
+    #[serde(rename = "etag")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub etag: Option<String>,
+    /// Calendars that are present on the user's calendar list.
+    #[serde(rename = "items")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub items: Option<Vec<CalendarListEntry>>,
+    /// Type of the collection ("calendar#calendarList").
+    #[serde(rename = "kind")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub kind: Option<String>,
+    /// Token used to access the next page of this result. Omitted if no further results are available, in which case nextSyncToken is provided.
+    #[serde(rename = "nextPageToken")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub next_page_token: Option<String>,
+    /// Token used at a later point in time to retrieve only the entries that have changed since this result was returned. Omitted if further results are available, in which case nextPageToken is provided.
+    #[serde(rename = "nextSyncToken")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub next_sync_token: Option<String>,
 }
 
 /// The notifications that the authenticated user is receiving for this calendar.
@@ -417,30 +199,6 @@
 
 #[derive(Serialize, Deserialize, Debug, Clone, Default)]
 pub struct CalendarListEntry {
-    /// The color of the calendar. This is an ID referring to an entry in the calendar section of the colors definition (see the colors endpoint). This property is superseded by the backgroundColor and foregroundColor properties and can be ignored when using these properties. Optional.
-    #[serde(rename = "colorId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub color_id: Option<String>,
-    /// The default reminders that the authenticated user has for this calendar.
-    #[serde(rename = "defaultReminders")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub default_reminders: Option<Vec<EventReminder>>,
-    /// Whether the calendar is the primary calendar of the authenticated user. Read-only. Optional. The default is False.
-    #[serde(rename = "primary")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub primary: Option<bool>,
-    /// Geographic location of the calendar as free-form text. Optional. Read-only.
-    #[serde(rename = "location")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub location: Option<String>,
-    /// Whether this calendar list entry has been deleted from the calendar list. Read-only. Optional. The default is False.
-    #[serde(rename = "deleted")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub deleted: Option<bool>,
-    /// The time zone of the calendar. Optional. Read-only.
-    #[serde(rename = "timeZone")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub time_zone: Option<String>,
     /// The effective access role that the authenticated user has on the calendar. Read-only. Possible values are:  
     /// - "freeBusyReader" - Provides read access to free/busy information.
     /// - "reader" - Provides read access to the calendar. Private events will appear to users with reader access, but event details will be hidden.
@@ -449,14 +207,29 @@
     #[serde(rename = "accessRole")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub access_role: Option<String>,
+    /// The main color of the calendar in the hexadecimal format "#0088aa". This property supersedes the index-based colorId property. To set or change this property, you need to specify colorRgbFormat=true in the parameters of the insert, update and patch methods. Optional.
+    #[serde(rename = "backgroundColor")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub background_color: Option<String>,
+    /// The color of the calendar. This is an ID referring to an entry in the calendar section of the colors definition (see the colors endpoint). This property is superseded by the backgroundColor and foregroundColor properties and can be ignored when using these properties. Optional.
+    #[serde(rename = "colorId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub color_id: Option<String>,
+    #[serde(rename = "conferenceProperties")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub conference_properties: Option<ConferenceProperties>,
+    /// The default reminders that the authenticated user has for this calendar.
+    #[serde(rename = "defaultReminders")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub default_reminders: Option<Vec<EventReminder>>,
+    /// Whether this calendar list entry has been deleted from the calendar list. Read-only. Optional. The default is False.
+    #[serde(rename = "deleted")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub deleted: Option<bool>,
     /// Description of the calendar. Optional. Read-only.
     #[serde(rename = "description")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub description: Option<String>,
-    /// The notifications that the authenticated user is receiving for this calendar.
-    #[serde(rename = "notificationSettings")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub notification_settings: Option<CalendarListEntryNotificationSettings>,
     /// ETag of the resource.
     #[serde(rename = "etag")]
     #[serde(skip_serializing_if = "Option::is_none")]
@@ -465,575 +238,46 @@
     #[serde(rename = "foregroundColor")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub foreground_color: Option<String>,
-    /// Type of the resource ("calendar#calendarListEntry").
-    #[serde(rename = "kind")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub kind: Option<String>,
-    /// Title of the calendar. Read-only.
-    #[serde(rename = "summary")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub summary: Option<String>,
     /// Whether the calendar has been hidden from the list. Optional. The attribute is only returned when the calendar is hidden, in which case the value is true.
     #[serde(rename = "hidden")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub hidden: Option<bool>,
-    #[serde(rename = "conferenceProperties")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub conference_properties: Option<ConferenceProperties>,
+    /// Identifier of the calendar.
+    #[serde(rename = "id")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub id: Option<String>,
+    /// Type of the resource ("calendar#calendarListEntry").
+    #[serde(rename = "kind")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub kind: Option<String>,
+    /// Geographic location of the calendar as free-form text. Optional. Read-only.
+    #[serde(rename = "location")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub location: Option<String>,
+    /// The notifications that the authenticated user is receiving for this calendar.
+    #[serde(rename = "notificationSettings")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub notification_settings: Option<CalendarListEntryNotificationSettings>,
+    /// Whether the calendar is the primary calendar of the authenticated user. Read-only. Optional. The default is False.
+    #[serde(rename = "primary")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub primary: Option<bool>,
     /// Whether the calendar content shows up in the calendar UI. Optional. The default is False.
     #[serde(rename = "selected")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub selected: Option<bool>,
-    /// Identifier of the calendar.
-    #[serde(rename = "id")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub id: Option<String>,
+    /// Title of the calendar. Read-only.
+    #[serde(rename = "summary")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub summary: Option<String>,
     /// The summary that the authenticated user has set for this calendar. Optional.
     #[serde(rename = "summaryOverride")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub summary_override: Option<String>,
-    /// The main color of the calendar in the hexadecimal format "#0088aa". This property supersedes the index-based colorId property. To set or change this property, you need to specify colorRgbFormat=true in the parameters of the insert, update and patch methods. Optional.
-    #[serde(rename = "backgroundColor")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub background_color: Option<String>,
-}
-
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct FreeBusyGroup {
-    /// List of calendars' identifiers within a group.
-    #[serde(rename = "calendars")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub calendars: Option<Vec<String>>,
-    /// Optional error(s) (if computation for the group failed).
-    #[serde(rename = "errors")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub errors: Option<Vec<Error>>,
-}
-
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct EventReminder {
-    /// The method used by this reminder. Possible values are:  
-    /// - "email" - Reminders are sent via email.
-    /// - "popup" - Reminders are sent via a UI popup.  
-    /// Required when adding a reminder.
-    #[serde(rename = "method")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub method: Option<String>,
-    /// Number of minutes before the start of the event when the reminder should trigger. Valid values are between 0 and 40320 (4 weeks in minutes).
-    /// Required when adding a reminder.
-    #[serde(rename = "minutes")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub minutes: Option<i32>,
-}
-
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct ConferenceSolutionKey {
-    /// The conference solution type.
-    /// If a client encounters an unfamiliar or empty type, it should still be able to display the entry points. However, it should disallow modifications.
-    /// The possible values are:  
-    /// - "eventHangout" for Hangouts for consumers (http://hangouts.google.com)
-    /// - "eventNamedHangout" for classic Hangouts for Google Workspace users (http://hangouts.google.com)
-    /// - "hangoutsMeet" for Google Meet (http://meet.google.com)
-    /// - "addOn" for 3P conference providers
-    #[serde(rename = "type")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub type_: Option<String>,
-}
-
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct ColorDefinition {
-    /// The background color associated with this color definition.
-    #[serde(rename = "background")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub background: Option<String>,
-    /// The foreground color that can be used to write on top of a background with 'background' color.
-    #[serde(rename = "foreground")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub foreground: Option<String>,
-}
-
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct FreeBusyRequestItem {
-    /// The identifier of a calendar or a group.
-    #[serde(rename = "id")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub id: Option<String>,
-}
-
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct Error {
-    /// Specific reason for the error. Some of the possible values are:  
-    /// - "groupTooBig" - The group of users requested is too large for a single query.
-    /// - "tooManyCalendarsRequested" - The number of calendars requested is too large for a single query.
-    /// - "notFound" - The requested resource was not found.
-    /// - "internalError" - The API service has encountered an internal error.  Additional error types may be added in the future, so clients should gracefully handle additional error statuses not included in this list.
-    #[serde(rename = "reason")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub reason: Option<String>,
-    /// Domain, or broad category, of the error.
-    #[serde(rename = "domain")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub domain: Option<String>,
-}
-
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct Settings {
-    /// Etag of the collection.
-    #[serde(rename = "etag")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub etag: Option<String>,
-    /// Type of the collection ("calendar#settings").
-    #[serde(rename = "kind")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub kind: Option<String>,
-    /// Token used to access the next page of this result. Omitted if no further results are available, in which case nextSyncToken is provided.
-    #[serde(rename = "nextPageToken")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub next_page_token: Option<String>,
-    /// List of user settings.
-    #[serde(rename = "items")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub items: Option<Vec<Setting>>,
-    /// Token used at a later point in time to retrieve only the entries that have changed since this result was returned. Omitted if further results are available, in which case nextPageToken is provided.
-    #[serde(rename = "nextSyncToken")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub next_sync_token: Option<String>,
-}
-
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct EventAttendee {
-    /// Whether the attendee is the organizer of the event. Read-only. The default is False.
-    #[serde(rename = "organizer")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub organizer: Option<bool>,
-    /// The attendee's name, if available. Optional.
-    #[serde(rename = "displayName")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub display_name: Option<String>,
-    /// The attendee's Profile ID, if available. It corresponds to the id field in the People collection of the Google+ API
-    #[serde(rename = "id")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub id: Option<String>,
-    /// Whether this is an optional attendee. Optional. The default is False.
-    #[serde(rename = "optional")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub optional: Option<bool>,
-    /// Whether the attendee is a resource. Can only be set when the attendee is added to the event for the first time. Subsequent modifications are ignored. Optional. The default is False.
-    #[serde(rename = "resource")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub resource: Option<bool>,
-    /// The attendee's response comment. Optional.
-    #[serde(rename = "comment")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub comment: Option<String>,
-    /// Whether this entry represents the calendar on which this copy of the event appears. Read-only. The default is False.
-    #[serde(rename = "self")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub self_: Option<bool>,
-    /// The attendee's response status. Possible values are:  
-    /// - "needsAction" - The attendee has not responded to the invitation.
-    /// - "declined" - The attendee has declined the invitation.
-    /// - "tentative" - The attendee has tentatively accepted the invitation.
-    /// - "accepted" - The attendee has accepted the invitation.
-    #[serde(rename = "responseStatus")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub response_status: Option<String>,
-    /// Number of additional guests. Optional. The default is 0.
-    #[serde(rename = "additionalGuests")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub additional_guests: Option<i32>,
-    /// The attendee's email address, if available. This field must be present when adding an attendee. It must be a valid email address as per RFC5322.
-    /// Required when adding an attendee.
-    #[serde(rename = "email")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub email: Option<String>,
-}
-
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct EventDateTime {
-    /// The time zone in which the time is specified. (Formatted as an IANA Time Zone Database name, e.g. "Europe/Zurich".) For recurring events this field is required and specifies the time zone in which the recurrence is expanded. For single events this field is optional and indicates a custom time zone for the event start/end.
+    /// The time zone of the calendar. Optional. Read-only.
     #[serde(rename = "timeZone")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub time_zone: Option<String>,
-    /// The date, in the format "yyyy-mm-dd", if this is an all-day event.
-    #[serde(rename = "date")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub date: Option<String>,
-    /// DateTime: The time, as a combined date-time value (formatted according to RFC3339). A time zone offset is required unless a time zone is explicitly specified in timeZone.
-    #[serde(rename = "dateTime")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub date_time: Option<DateTime<Utc>>,
-}
-
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct EntryPoint {
-    /// The access code to access the conference. The maximum length is 128 characters.
-    /// When creating new conference data, populate only the subset of {meetingCode, accessCode, passcode, password, pin} fields that match the terminology that the conference provider uses. Only the populated fields should be displayed.
-    /// Optional.
-    #[serde(rename = "accessCode")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub access_code: Option<String>,
-    /// The meeting code to access the conference. The maximum length is 128 characters.
-    /// When creating new conference data, populate only the subset of {meetingCode, accessCode, passcode, password, pin} fields that match the terminology that the conference provider uses. Only the populated fields should be displayed.
-    /// Optional.
-    #[serde(rename = "meetingCode")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub meeting_code: Option<String>,
-    /// The PIN to access the conference. The maximum length is 128 characters.
-    /// When creating new conference data, populate only the subset of {meetingCode, accessCode, passcode, password, pin} fields that match the terminology that the conference provider uses. Only the populated fields should be displayed.
-    /// Optional.
-    #[serde(rename = "pin")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub pin: Option<String>,
-    /// The password to access the conference. The maximum length is 128 characters.
-    /// When creating new conference data, populate only the subset of {meetingCode, accessCode, passcode, password, pin} fields that match the terminology that the conference provider uses. Only the populated fields should be displayed.
-    /// Optional.
-    #[serde(rename = "password")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub password: Option<String>,
-    /// The passcode to access the conference. The maximum length is 128 characters.
-    /// When creating new conference data, populate only the subset of {meetingCode, accessCode, passcode, password, pin} fields that match the terminology that the conference provider uses. Only the populated fields should be displayed.
-    #[serde(rename = "passcode")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub passcode: Option<String>,
-    /// The type of the conference entry point.
-    /// Possible values are:  
-    /// - "video" - joining a conference over HTTP. A conference can have zero or one video entry point.
-    /// - "phone" - joining a conference by dialing a phone number. A conference can have zero or more phone entry points.
-    /// - "sip" - joining a conference over SIP. A conference can have zero or one sip entry point.
-    /// - "more" - further conference joining instructions, for example additional phone numbers. A conference can have zero or one more entry point. A conference with only a more entry point is not a valid conference.
-    #[serde(rename = "entryPointType")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub entry_point_type: Option<String>,
-    /// The label for the URI. Visible to end users. Not localized. The maximum length is 512 characters.
-    /// Examples:  
-    /// - for video: meet.google.com/aaa-bbbb-ccc
-    /// - for phone: +1 123 268 2601
-    /// - for sip: 12345678@altostrat.com
-    /// - for more: should not be filled  
-    /// Optional.
-    #[serde(rename = "label")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub label: Option<String>,
-    /// The CLDR/ISO 3166 region code for the country associated with this phone access. Example: "SE" for Sweden.
-    /// Calendar backend will populate this field only for EntryPointType.PHONE.
-    #[serde(rename = "regionCode")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub region_code: Option<String>,
-    /// Features of the entry point, such as being toll or toll-free. One entry point can have multiple features. However, toll and toll-free cannot be both set on the same entry point.
-    #[serde(rename = "entryPointFeatures")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub entry_point_features: Option<Vec<String>>,
-    /// The URI of the entry point. The maximum length is 1300 characters.
-    /// Format:  
-    /// - for video, http: or https: schema is required.
-    /// - for phone, tel: schema is required. The URI should include the entire dial sequence (e.g., tel:+12345678900,,,123456789;1234).
-    /// - for sip, sip: schema is required, e.g., sip:12345678@myprovider.com.
-    /// - for more, http: or https: schema is required.
-    #[serde(rename = "uri")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub uri: Option<String>,
-}
-
-/// Source from which the event was created. For example, a web page, an email message or any document identifiable by an URL with HTTP or HTTPS scheme. Can only be seen or modified by the creator of the event.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct EventSource {
-    /// URL of the source pointing to a resource. The URL scheme must be HTTP or HTTPS.
-    #[serde(rename = "url")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub url: Option<String>,
-    /// Title of the source; for example a title of a web page or an email subject.
-    #[serde(rename = "title")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub title: Option<String>,
-}
-
-/// A gadget that extends this event. Gadgets are deprecated; this structure is instead only used for returning birthday calendar metadata.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct EventGadget {
-    /// The gadget's icon URL. The URL scheme must be HTTPS. Deprecated.
-    #[serde(rename = "iconLink")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub icon_link: Option<String>,
-    /// The gadget's title. Deprecated.
-    #[serde(rename = "title")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub title: Option<String>,
-    /// The gadget's type. Deprecated.
-    #[serde(rename = "type")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub type_: Option<String>,
-    /// The gadget's display mode. Deprecated. Possible values are:  
-    /// - "icon" - The gadget displays next to the event's title in the calendar view.
-    /// - "chip" - The gadget displays when the event is clicked.
-    #[serde(rename = "display")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub display: Option<String>,
-    /// Preferences.
-    #[serde(rename = "preferences")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub preferences: Option<HashMap<String, String>>,
-    /// The gadget's height in pixels. The height must be an integer greater than 0. Optional. Deprecated.
-    #[serde(rename = "height")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub height: Option<i32>,
-    /// The gadget's width in pixels. The width must be an integer greater than 0. Optional. Deprecated.
-    #[serde(rename = "width")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub width: Option<i32>,
-    /// The gadget's URL. The URL scheme must be HTTPS. Deprecated.
-    #[serde(rename = "link")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub link: Option<String>,
-}
-
-/// The organizer of the event. If the organizer is also an attendee, this is indicated with a separate entry in attendees with the organizer field set to True. To change the organizer, use the move operation. Read-only, except when importing an event.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct EventOrganizer {
-    /// The organizer's Profile ID, if available. It corresponds to the id field in the People collection of the Google+ API
-    #[serde(rename = "id")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub id: Option<String>,
-    /// The organizer's email address, if available. It must be a valid email address as per RFC5322.
-    #[serde(rename = "email")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub email: Option<String>,
-    /// The organizer's name, if available.
-    #[serde(rename = "displayName")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub display_name: Option<String>,
-    /// Whether the organizer corresponds to the calendar on which this copy of the event appears. Read-only. The default is False.
-    #[serde(rename = "self")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub self_: Option<bool>,
-}
-
-/// The creator of the event. Read-only.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct EventCreator {
-    /// The creator's Profile ID, if available. It corresponds to the id field in the People collection of the Google+ API
-    #[serde(rename = "id")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub id: Option<String>,
-    /// The creator's email address, if available.
-    #[serde(rename = "email")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub email: Option<String>,
-    /// The creator's name, if available.
-    #[serde(rename = "displayName")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub display_name: Option<String>,
-    /// Whether the creator corresponds to the calendar on which this copy of the event appears. Read-only. The default is False.
-    #[serde(rename = "self")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub self_: Option<bool>,
-}
-
-/// Information about the event's reminders for the authenticated user.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct EventReminders {
-    /// If the event doesn't use the default reminders, this lists the reminders specific to the event, or, if not set, indicates that no reminders are set for this event. The maximum number of override reminders is 5.
-    #[serde(rename = "overrides")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub overrides: Option<Vec<EventReminder>>,
-    /// Whether the default reminders of the calendar apply to the event.
-    #[serde(rename = "useDefault")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub use_default: Option<bool>,
-}
-
-/// Extended properties of the event.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct EventExtendedProperties {
-    /// Properties that are private to the copy of the event that appears on this calendar.
-    #[serde(rename = "private")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub private: Option<HashMap<String, String>>,
-    /// Properties that are shared between copies of the event on other attendees' calendars.
-    #[serde(rename = "shared")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub shared: Option<HashMap<String, String>>,
-}
-
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct Event {
-    /// Description of the event. Can contain HTML. Optional.
-    #[serde(rename = "description")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub description: Option<String>,
-    /// List of RRULE, EXRULE, RDATE and EXDATE lines for a recurring event, as specified in RFC5545. Note that DTSTART and DTEND lines are not allowed in this field; event start and end times are specified in the start and end fields. This field is omitted for single events or instances of recurring events.
-    #[serde(rename = "recurrence")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub recurrence: Option<Vec<String>>,
-    /// The attendees of the event. See the Events with attendees guide for more information on scheduling events with other calendar users. Service accounts need to use domain-wide delegation of authority to populate the attendee list.
-    #[serde(rename = "attendees")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub attendees: Option<Vec<EventAttendee>>,
-    /// An absolute link to this event in the Google Calendar Web UI. Read-only.
-    #[serde(rename = "htmlLink")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub html_link: Option<String>,
-    /// The color of the event. This is an ID referring to an entry in the event section of the colors definition (see the  colors endpoint). Optional.
-    #[serde(rename = "colorId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub color_id: Option<String>,
-    /// Whether anyone can invite themselves to the event (currently works for Google+ events only). Optional. The default is False.
-    #[serde(rename = "anyoneCanAddSelf")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub anyone_can_add_self: Option<bool>,
-    /// Sequence number as per iCalendar.
-    #[serde(rename = "sequence")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub sequence: Option<i32>,
-    /// Source from which the event was created. For example, a web page, an email message or any document identifiable by an URL with HTTP or HTTPS scheme. Can only be seen or modified by the creator of the event.
-    #[serde(rename = "source")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub source: Option<EventSource>,
-    /// Status of the event. Optional. Possible values are:  
-    /// - "confirmed" - The event is confirmed. This is the default status.
-    /// - "tentative" - The event is tentatively confirmed.
-    /// - "cancelled" - The event is cancelled (deleted). The list method returns cancelled events only on incremental sync (when syncToken or updatedMin are specified) or if the showDeleted flag is set to true. The get method always returns them.
-    /// A cancelled status represents two different states depending on the event type:  
-    /// - Cancelled exceptions of an uncancelled recurring event indicate that this instance should no longer be presented to the user. Clients should store these events for the lifetime of the parent recurring event.
-    /// Cancelled exceptions are only guaranteed to have values for the id, recurringEventId and originalStartTime fields populated. The other fields might be empty.  
-    /// - All other cancelled events represent deleted events. Clients should remove their locally synced copies. Such cancelled events will eventually disappear, so do not rely on them being available indefinitely.
-    /// Deleted events are only guaranteed to have the id field populated.   On the organizer's calendar, cancelled events continue to expose event details (summary, location, etc.) so that they can be restored (undeleted). Similarly, the events to which the user was invited and that they manually removed continue to provide details. However, incremental sync requests with showDeleted set to false will not return these details.
-    /// If an event changes its organizer (for example via the move operation) and the original organizer is not on the attendee list, it will leave behind a cancelled event where only the id field is guaranteed to be populated.
-    #[serde(rename = "status")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub status: Option<String>,
-    /// Whether attendees other than the organizer can modify the event. Optional. The default is False.
-    #[serde(rename = "guestsCanModify")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub guests_can_modify: Option<bool>,
-    /// Whether attendees other than the organizer can see who the event's attendees are. Optional. The default is True.
-    #[serde(rename = "guestsCanSeeOtherGuests")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub guests_can_see_other_guests: Option<bool>,
-    /// A gadget that extends this event. Gadgets are deprecated; this structure is instead only used for returning birthday calendar metadata.
-    #[serde(rename = "gadget")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub gadget: Option<EventGadget>,
-    /// Type of the resource ("calendar#event").
-    #[serde(rename = "kind")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub kind: Option<String>,
-    /// Visibility of the event. Optional. Possible values are:  
-    /// - "default" - Uses the default visibility for events on the calendar. This is the default value.
-    /// - "public" - The event is public and event details are visible to all readers of the calendar.
-    /// - "private" - The event is private and only event attendees may view event details.
-    /// - "confidential" - The event is private. This value is provided for compatibility reasons.
-    #[serde(rename = "visibility")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub visibility: Option<String>,
-    /// The organizer of the event. If the organizer is also an attendee, this is indicated with a separate entry in attendees with the organizer field set to True. To change the organizer, use the move operation. Read-only, except when importing an event.
-    #[serde(rename = "organizer")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub organizer: Option<EventOrganizer>,
-    /// An absolute link to the Google+ hangout associated with this event. Read-only.
-    #[serde(rename = "hangoutLink")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub hangout_link: Option<String>,
-    /// Whether attendees may have been omitted from the event's representation. When retrieving an event, this may be due to a restriction specified by the maxAttendee query parameter. When updating an event, this can be used to only update the participant's response. Optional. The default is False.
-    #[serde(rename = "attendeesOmitted")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub attendees_omitted: Option<bool>,
-    /// File attachments for the event. Currently only Google Drive attachments are supported.
-    /// In order to modify attachments the supportsAttachments request parameter should be set to true.
-    /// There can be at most 25 attachments per event,
-    #[serde(rename = "attachments")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub attachments: Option<Vec<EventAttachment>>,
-    /// Opaque identifier of the event. When creating new single or recurring events, you can specify their IDs. Provided IDs must follow these rules:  
-    /// - characters allowed in the ID are those used in base32hex encoding, i.e. lowercase letters a-v and digits 0-9, see section 3.1.2 in RFC2938
-    /// - the length of the ID must be between 5 and 1024 characters
-    /// - the ID must be unique per calendar  Due to the globally distributed nature of the system, we cannot guarantee that ID collisions will be detected at event creation time. To minimize the risk of collisions we recommend using an established UUID algorithm such as one described in RFC4122.
-    /// If you do not specify an ID, it will be automatically generated by the server.
-    /// Note that the icalUID and the id are not identical and only one of them should be supplied at event creation time. One difference in their semantics is that in recurring events, all occurrences of one event have different ids while they all share the same icalUIDs.
-    #[serde(rename = "id")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub id: Option<String>,
-    /// DateTime: Creation time of the event (as a RFC3339 timestamp). Read-only.
-    #[serde(rename = "created")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub created: Option<DateTime<Utc>>,
-    /// Specific type of the event. Read-only. Possible values are:  
-    /// - "default" - A regular event or not further specified.
-    /// - "outOfOffice" - An out-of-office event.
-    #[serde(rename = "eventType")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub event_type: Option<String>,
-    /// The creator of the event. Read-only.
-    #[serde(rename = "creator")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub creator: Option<EventCreator>,
-    #[serde(rename = "end")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub end: Option<EventDateTime>,
-    /// Whether this is a locked event copy where no changes can be made to the main event fields "summary", "description", "location", "start", "end" or "recurrence". The default is False. Read-Only.
-    #[serde(rename = "locked")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub locked: Option<bool>,
-    /// Information about the event's reminders for the authenticated user.
-    #[serde(rename = "reminders")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub reminders: Option<EventReminders>,
-    /// Whether the end time is actually unspecified. An end time is still provided for compatibility reasons, even if this attribute is set to True. The default is False.
-    #[serde(rename = "endTimeUnspecified")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub end_time_unspecified: Option<bool>,
-    /// DateTime: Last modification time of the event (as a RFC3339 timestamp). Read-only.
-    #[serde(rename = "updated")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub updated: Option<DateTime<Utc>>,
-    /// Whether the event blocks time on the calendar. Optional. Possible values are:  
-    /// - "opaque" - Default value. The event does block time on the calendar. This is equivalent to setting Show me as to Busy in the Calendar UI.
-    /// - "transparent" - The event does not block time on the calendar. This is equivalent to setting Show me as to Available in the Calendar UI.
-    #[serde(rename = "transparency")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub transparency: Option<String>,
-    #[serde(rename = "originalStartTime")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub original_start_time: Option<EventDateTime>,
-    #[serde(rename = "start")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub start: Option<EventDateTime>,
-    /// Title of the event.
-    #[serde(rename = "summary")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub summary: Option<String>,
-    /// Event unique identifier as defined in RFC5545. It is used to uniquely identify events accross calendaring systems and must be supplied when importing events via the import method.
-    /// Note that the icalUID and the id are not identical and only one of them should be supplied at event creation time. One difference in their semantics is that in recurring events, all occurrences of one event have different ids while they all share the same icalUIDs.
-    #[serde(rename = "iCalUID")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub i_cal_u_i_d: Option<String>,
-    /// Geographic location of the event as free-form text. Optional.
-    #[serde(rename = "location")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub location: Option<String>,
-    #[serde(rename = "conferenceData")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub conference_data: Option<ConferenceData>,
-    /// If set to True, Event propagation is disabled. Note that it is not the same thing as Private event properties. Optional. Immutable. The default is False.
-    #[serde(rename = "privateCopy")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub private_copy: Option<bool>,
-    /// For an instance of a recurring event, this is the id of the recurring event to which this instance belongs. Immutable.
-    #[serde(rename = "recurringEventId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub recurring_event_id: Option<String>,
-    /// ETag of the resource.
-    #[serde(rename = "etag")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub etag: Option<String>,
-    /// Whether attendees other than the organizer can invite others to the event. Optional. The default is True.
-    #[serde(rename = "guestsCanInviteOthers")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub guests_can_invite_others: Option<bool>,
-    /// Extended properties of the event.
-    #[serde(rename = "extendedProperties")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub extended_properties: Option<EventExtendedProperties>,
 }
 
 #[derive(Serialize, Deserialize, Debug, Clone, Default)]
@@ -1057,92 +301,83 @@
 }
 
 #[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct ConferenceParametersAddOnParameters {
-    #[serde(rename = "parameters")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub parameters: Option<HashMap<String, String>>,
-}
-
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct CreateConferenceRequest {
-    #[serde(rename = "status")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub status: Option<ConferenceRequestStatus>,
-    /// The client-generated unique ID for this request.
-    /// Clients should regenerate this ID for every new request. If an ID provided is the same as for the previous request, the request is ignored.
-    #[serde(rename = "requestId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub request_id: Option<String>,
-    #[serde(rename = "conferenceSolutionKey")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub conference_solution_key: Option<ConferenceSolutionKey>,
-}
-
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
 pub struct Channel {
-    /// A Boolean value to indicate whether payload is wanted. Optional.
-    #[serde(rename = "payload")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub payload: Option<bool>,
     /// The address where notifications are delivered for this channel.
     #[serde(rename = "address")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub address: Option<String>,
-    /// Additional parameters controlling delivery channel behavior. Optional.
-    #[serde(rename = "params")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub params: Option<HashMap<String, String>>,
-    /// The type of delivery mechanism used for this channel. Valid values are "web_hook" (or "webhook"). Both values refer to a channel where Http requests are used to deliver messages.
-    #[serde(rename = "type")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub type_: Option<String>,
+    /// i64: Date and time of notification channel expiration, expressed as a Unix timestamp, in milliseconds. Optional.
+    #[serde(rename = "expiration")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub expiration: Option<String>,
     /// A UUID or similar unique string that identifies this channel.
     #[serde(rename = "id")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub id: Option<String>,
-    /// An arbitrary string delivered to the target address with each notification delivered over this channel. Optional.
-    #[serde(rename = "token")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub token: Option<String>,
-    /// A version-specific identifier for the watched resource.
-    #[serde(rename = "resourceUri")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub resource_uri: Option<String>,
     /// Identifies this as a notification channel used to watch for changes to a resource, which is "api#channel".
     #[serde(rename = "kind")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub kind: Option<String>,
-    /// i64: Date and time of notification channel expiration, expressed as a Unix timestamp, in milliseconds. Optional.
-    #[serde(rename = "expiration")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub expiration: Option<String>,
+    /// Additional parameters controlling delivery channel behavior. Optional.
+    #[serde(rename = "params")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub params: Option<HashMap<String, String>>,
+    /// A Boolean value to indicate whether payload is wanted. Optional.
+    #[serde(rename = "payload")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub payload: Option<bool>,
     /// An opaque ID that identifies the resource being watched on this channel. Stable across different API versions.
     #[serde(rename = "resourceId")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub resource_id: Option<String>,
+    /// A version-specific identifier for the watched resource.
+    #[serde(rename = "resourceUri")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub resource_uri: Option<String>,
+    /// An arbitrary string delivered to the target address with each notification delivered over this channel. Optional.
+    #[serde(rename = "token")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub token: Option<String>,
+    /// The type of delivery mechanism used for this channel.
+    #[serde(rename = "type")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub type_: Option<String>,
 }
 
 #[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct FreeBusyCalendar {
-    /// Optional error(s) (if computation for the calendar failed).
-    #[serde(rename = "errors")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub errors: Option<Vec<Error>>,
-    /// List of time ranges during which this calendar should be regarded as busy.
-    #[serde(rename = "busy")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub busy: Option<Vec<TimePeriod>>,
+pub struct ColorDefinition {
+    /// The background color associated with this color definition.
+    #[serde(rename = "background")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub background: Option<String>,
+    /// The foreground color that can be used to write on top of a background with 'background' color.
+    #[serde(rename = "foreground")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub foreground: Option<String>,
+}
+
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct Colors {
+    /// A global palette of calendar colors, mapping from the color ID to its definition. A calendarListEntry resource refers to one of these color IDs in its color field. Read-only.
+    #[serde(rename = "calendar")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub calendar: Option<HashMap<String, ColorDefinition>>,
+    /// A global palette of event colors, mapping from the color ID to its definition. An event resource may refer to one of these color IDs in its color field. Read-only.
+    #[serde(rename = "event")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub event: Option<HashMap<String, ColorDefinition>>,
+    /// Type of the resource ("calendar#colors").
+    #[serde(rename = "kind")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub kind: Option<String>,
+    /// DateTime: Last modification time of the color palette (as a RFC3339 timestamp). Read-only.
+    #[serde(rename = "updated")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub updated: Option<DateTime<Utc>>,
 }
 
 #[derive(Serialize, Deserialize, Debug, Clone, Default)]
 pub struct ConferenceData {
-    /// The signature of the conference data.
-    /// Generated on server side. Must be preserved while copying the conference data between events, otherwise the conference data will not be copied.
-    /// Unset for a conference with a failed create request.
-    /// Optional for a conference with a pending create request.
-    #[serde(rename = "signature")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub signature: Option<String>,
     /// The ID of the conference.
     /// Can be used by developers to keep track of conferences, should not be displayed to users.
     /// Values for solution types:  
@@ -1153,25 +388,46 @@
     #[serde(rename = "conferenceId")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub conference_id: Option<String>,
+    #[serde(rename = "conferenceSolution")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub conference_solution: Option<ConferenceSolution>,
+    #[serde(rename = "createRequest")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub create_request: Option<CreateConferenceRequest>,
     /// Information about individual conference entry points, such as URLs or phone numbers.
     /// All of them must belong to the same conference.
     /// Either conferenceSolution and at least one entryPoint, or createRequest is required.
     #[serde(rename = "entryPoints")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub entry_points: Option<Vec<EntryPoint>>,
-    #[serde(rename = "parameters")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub parameters: Option<ConferenceParameters>,
     /// Additional notes (such as instructions from the domain administrator, legal notices) to display to the user. Can contain HTML. The maximum length is 2048 characters. Optional.
     #[serde(rename = "notes")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub notes: Option<String>,
-    #[serde(rename = "conferenceSolution")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub conference_solution: Option<ConferenceSolution>,
-    #[serde(rename = "createRequest")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub create_request: Option<CreateConferenceRequest>,
+    #[serde(rename = "parameters")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub parameters: Option<ConferenceParameters>,
+    /// The signature of the conference data.
+    /// Generated on server side. Must be preserved while copying the conference data between events, otherwise the conference data will not be copied.
+    /// Unset for a conference with a failed create request.
+    /// Optional for a conference with a pending create request.
+    #[serde(rename = "signature")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub signature: Option<String>,
+}
+
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct ConferenceParameters {
+    #[serde(rename = "addOnParameters")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub add_on_parameters: Option<ConferenceParametersAddOnParameters>,
+}
+
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct ConferenceParametersAddOnParameters {
+    #[serde(rename = "parameters")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub parameters: Option<HashMap<String, String>>,
 }
 
 #[derive(Serialize, Deserialize, Debug, Clone, Default)]
@@ -1186,6 +442,744 @@
     pub allowed_conference_solution_types: Option<Vec<String>>,
 }
 
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct ConferenceRequestStatus {
+    /// The current status of the conference create request. Read-only.
+    /// The possible values are:  
+    /// - "pending": the conference create request is still being processed.
+    /// - "success": the conference create request succeeded, the entry points are populated.
+    /// - "failure": the conference create request failed, there are no entry points.
+    #[serde(rename = "statusCode")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub status_code: Option<String>,
+}
+
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct ConferenceSolution {
+    /// The user-visible icon for this solution.
+    #[serde(rename = "iconUri")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub icon_uri: Option<String>,
+    #[serde(rename = "key")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub key: Option<ConferenceSolutionKey>,
+    /// The user-visible name of this solution. Not localized.
+    #[serde(rename = "name")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub name: Option<String>,
+}
+
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct ConferenceSolutionKey {
+    /// The conference solution type.
+    /// If a client encounters an unfamiliar or empty type, it should still be able to display the entry points. However, it should disallow modifications.
+    /// The possible values are:  
+    /// - "eventHangout" for Hangouts for consumers (http://hangouts.google.com)
+    /// - "eventNamedHangout" for classic Hangouts for G Suite users (http://hangouts.google.com)
+    /// - "hangoutsMeet" for Google Meet (http://meet.google.com)
+    /// - "addOn" for 3P conference providers
+    #[serde(rename = "type")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub type_: Option<String>,
+}
+
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct CreateConferenceRequest {
+    #[serde(rename = "conferenceSolutionKey")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub conference_solution_key: Option<ConferenceSolutionKey>,
+    /// The client-generated unique ID for this request.
+    /// Clients should regenerate this ID for every new request. If an ID provided is the same as for the previous request, the request is ignored.
+    #[serde(rename = "requestId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub request_id: Option<String>,
+    #[serde(rename = "status")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub status: Option<ConferenceRequestStatus>,
+}
+
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct EntryPoint {
+    /// The access code to access the conference. The maximum length is 128 characters.
+    /// When creating new conference data, populate only the subset of {meetingCode, accessCode, passcode, password, pin} fields that match the terminology that the conference provider uses. Only the populated fields should be displayed.
+    /// Optional.
+    #[serde(rename = "accessCode")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub access_code: Option<String>,
+    /// Features of the entry point, such as being toll or toll-free. One entry point can have multiple features. However, toll and toll-free cannot be both set on the same entry point.
+    #[serde(rename = "entryPointFeatures")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub entry_point_features: Option<Vec<String>>,
+    /// The type of the conference entry point.
+    /// Possible values are:  
+    /// - "video" - joining a conference over HTTP. A conference can have zero or one video entry point.
+    /// - "phone" - joining a conference by dialing a phone number. A conference can have zero or more phone entry points.
+    /// - "sip" - joining a conference over SIP. A conference can have zero or one sip entry point.
+    /// - "more" - further conference joining instructions, for example additional phone numbers. A conference can have zero or one more entry point. A conference with only a more entry point is not a valid conference.
+    #[serde(rename = "entryPointType")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub entry_point_type: Option<String>,
+    /// The label for the URI. Visible to end users. Not localized. The maximum length is 512 characters.
+    /// Examples:  
+    /// - for video: meet.google.com/aaa-bbbb-ccc
+    /// - for phone: +1 123 268 2601
+    /// - for sip: 12345678@altostrat.com
+    /// - for more: should not be filled  
+    /// Optional.
+    #[serde(rename = "label")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub label: Option<String>,
+    /// The meeting code to access the conference. The maximum length is 128 characters.
+    /// When creating new conference data, populate only the subset of {meetingCode, accessCode, passcode, password, pin} fields that match the terminology that the conference provider uses. Only the populated fields should be displayed.
+    /// Optional.
+    #[serde(rename = "meetingCode")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub meeting_code: Option<String>,
+    /// The passcode to access the conference. The maximum length is 128 characters.
+    /// When creating new conference data, populate only the subset of {meetingCode, accessCode, passcode, password, pin} fields that match the terminology that the conference provider uses. Only the populated fields should be displayed.
+    #[serde(rename = "passcode")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub passcode: Option<String>,
+    /// The password to access the conference. The maximum length is 128 characters.
+    /// When creating new conference data, populate only the subset of {meetingCode, accessCode, passcode, password, pin} fields that match the terminology that the conference provider uses. Only the populated fields should be displayed.
+    /// Optional.
+    #[serde(rename = "password")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub password: Option<String>,
+    /// The PIN to access the conference. The maximum length is 128 characters.
+    /// When creating new conference data, populate only the subset of {meetingCode, accessCode, passcode, password, pin} fields that match the terminology that the conference provider uses. Only the populated fields should be displayed.
+    /// Optional.
+    #[serde(rename = "pin")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub pin: Option<String>,
+    /// The CLDR/ISO 3166 region code for the country associated with this phone access. Example: "SE" for Sweden.
+    /// Calendar backend will populate this field only for EntryPointType.PHONE.
+    #[serde(rename = "regionCode")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub region_code: Option<String>,
+    /// The URI of the entry point. The maximum length is 1300 characters.
+    /// Format:  
+    /// - for video, http: or https: schema is required.
+    /// - for phone, tel: schema is required. The URI should include the entire dial sequence (e.g., tel:+12345678900,,,123456789;1234).
+    /// - for sip, sip: schema is required, e.g., sip:12345678@myprovider.com.
+    /// - for more, http: or https: schema is required.
+    #[serde(rename = "uri")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub uri: Option<String>,
+}
+
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct Error {
+    /// Domain, or broad category, of the error.
+    #[serde(rename = "domain")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub domain: Option<String>,
+    /// Specific reason for the error. Some of the possible values are:  
+    /// - "groupTooBig" - The group of users requested is too large for a single query.
+    /// - "tooManyCalendarsRequested" - The number of calendars requested is too large for a single query.
+    /// - "notFound" - The requested resource was not found.
+    /// - "internalError" - The API service has encountered an internal error.  Additional error types may be added in the future, so clients should gracefully handle additional error statuses not included in this list.
+    #[serde(rename = "reason")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub reason: Option<String>,
+}
+
+/// The creator of the event. Read-only.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct EventCreator {
+    /// The creator's name, if available.
+    #[serde(rename = "displayName")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub display_name: Option<String>,
+    /// The creator's email address, if available.
+    #[serde(rename = "email")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub email: Option<String>,
+    /// The creator's Profile ID, if available. It corresponds to the id field in the People collection of the Google+ API
+    #[serde(rename = "id")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub id: Option<String>,
+    /// Whether the creator corresponds to the calendar on which this copy of the event appears. Read-only. The default is False.
+    #[serde(rename = "self")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub self_: Option<bool>,
+}
+
+/// Extended properties of the event.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct EventExtendedProperties {
+    /// Properties that are private to the copy of the event that appears on this calendar.
+    #[serde(rename = "private")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub private: Option<HashMap<String, String>>,
+    /// Properties that are shared between copies of the event on other attendees' calendars.
+    #[serde(rename = "shared")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub shared: Option<HashMap<String, String>>,
+}
+
+/// A gadget that extends this event. Gadgets are deprecated; this structure is instead only used for returning birthday calendar metadata.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct EventGadget {
+    /// The gadget's display mode. Deprecated. Possible values are:  
+    /// - "icon" - The gadget displays next to the event's title in the calendar view.
+    /// - "chip" - The gadget displays when the event is clicked.
+    #[serde(rename = "display")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub display: Option<String>,
+    /// The gadget's height in pixels. The height must be an integer greater than 0. Optional. Deprecated.
+    #[serde(rename = "height")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub height: Option<i32>,
+    /// The gadget's icon URL. The URL scheme must be HTTPS. Deprecated.
+    #[serde(rename = "iconLink")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub icon_link: Option<String>,
+    /// The gadget's URL. The URL scheme must be HTTPS. Deprecated.
+    #[serde(rename = "link")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub link: Option<String>,
+    /// Preferences.
+    #[serde(rename = "preferences")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub preferences: Option<HashMap<String, String>>,
+    /// The gadget's title. Deprecated.
+    #[serde(rename = "title")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub title: Option<String>,
+    /// The gadget's type. Deprecated.
+    #[serde(rename = "type")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub type_: Option<String>,
+    /// The gadget's width in pixels. The width must be an integer greater than 0. Optional. Deprecated.
+    #[serde(rename = "width")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub width: Option<i32>,
+}
+
+/// The organizer of the event. If the organizer is also an attendee, this is indicated with a separate entry in attendees with the organizer field set to True. To change the organizer, use the move operation. Read-only, except when importing an event.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct EventOrganizer {
+    /// The organizer's name, if available.
+    #[serde(rename = "displayName")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub display_name: Option<String>,
+    /// The organizer's email address, if available. It must be a valid email address as per RFC5322.
+    #[serde(rename = "email")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub email: Option<String>,
+    /// The organizer's Profile ID, if available. It corresponds to the id field in the People collection of the Google+ API
+    #[serde(rename = "id")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub id: Option<String>,
+    /// Whether the organizer corresponds to the calendar on which this copy of the event appears. Read-only. The default is False.
+    #[serde(rename = "self")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub self_: Option<bool>,
+}
+
+/// Information about the event's reminders for the authenticated user.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct EventReminders {
+    /// If the event doesn't use the default reminders, this lists the reminders specific to the event, or, if not set, indicates that no reminders are set for this event. The maximum number of override reminders is 5.
+    #[serde(rename = "overrides")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub overrides: Option<Vec<EventReminder>>,
+    /// Whether the default reminders of the calendar apply to the event.
+    #[serde(rename = "useDefault")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub use_default: Option<bool>,
+}
+
+/// Source from which the event was created. For example, a web page, an email message or any document identifiable by an URL with HTTP or HTTPS scheme. Can only be seen or modified by the creator of the event.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct EventSource {
+    /// Title of the source; for example a title of a web page or an email subject.
+    #[serde(rename = "title")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub title: Option<String>,
+    /// URL of the source pointing to a resource. The URL scheme must be HTTP or HTTPS.
+    #[serde(rename = "url")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub url: Option<String>,
+}
+
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct Event {
+    /// Whether anyone can invite themselves to the event (currently works for Google+ events only). Optional. The default is False.
+    #[serde(rename = "anyoneCanAddSelf")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub anyone_can_add_self: Option<bool>,
+    /// File attachments for the event. Currently only Google Drive attachments are supported.
+    /// In order to modify attachments the supportsAttachments request parameter should be set to true.
+    /// There can be at most 25 attachments per event,
+    #[serde(rename = "attachments")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub attachments: Option<Vec<EventAttachment>>,
+    /// The attendees of the event. See the Events with attendees guide for more information on scheduling events with other calendar users. Service accounts need to use domain-wide delegation of authority to populate the attendee list.
+    #[serde(rename = "attendees")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub attendees: Option<Vec<EventAttendee>>,
+    /// Whether attendees may have been omitted from the event's representation. When retrieving an event, this may be due to a restriction specified by the maxAttendee query parameter. When updating an event, this can be used to only update the participant's response. Optional. The default is False.
+    #[serde(rename = "attendeesOmitted")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub attendees_omitted: Option<bool>,
+    /// The color of the event. This is an ID referring to an entry in the event section of the colors definition (see the  colors endpoint). Optional.
+    #[serde(rename = "colorId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub color_id: Option<String>,
+    #[serde(rename = "conferenceData")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub conference_data: Option<ConferenceData>,
+    /// DateTime: Creation time of the event (as a RFC3339 timestamp). Read-only.
+    #[serde(rename = "created")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub created: Option<DateTime<Utc>>,
+    /// The creator of the event. Read-only.
+    #[serde(rename = "creator")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub creator: Option<EventCreator>,
+    /// Description of the event. Can contain HTML. Optional.
+    #[serde(rename = "description")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub description: Option<String>,
+    #[serde(rename = "end")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub end: Option<EventDateTime>,
+    /// Whether the end time is actually unspecified. An end time is still provided for compatibility reasons, even if this attribute is set to True. The default is False.
+    #[serde(rename = "endTimeUnspecified")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub end_time_unspecified: Option<bool>,
+    /// ETag of the resource.
+    #[serde(rename = "etag")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub etag: Option<String>,
+    /// Extended properties of the event.
+    #[serde(rename = "extendedProperties")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub extended_properties: Option<EventExtendedProperties>,
+    /// A gadget that extends this event. Gadgets are deprecated; this structure is instead only used for returning birthday calendar metadata.
+    #[serde(rename = "gadget")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub gadget: Option<EventGadget>,
+    /// Whether attendees other than the organizer can invite others to the event. Optional. The default is True.
+    #[serde(rename = "guestsCanInviteOthers")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub guests_can_invite_others: Option<bool>,
+    /// Whether attendees other than the organizer can modify the event. Optional. The default is False.
+    #[serde(rename = "guestsCanModify")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub guests_can_modify: Option<bool>,
+    /// Whether attendees other than the organizer can see who the event's attendees are. Optional. The default is True.
+    #[serde(rename = "guestsCanSeeOtherGuests")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub guests_can_see_other_guests: Option<bool>,
+    /// An absolute link to the Google+ hangout associated with this event. Read-only.
+    #[serde(rename = "hangoutLink")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub hangout_link: Option<String>,
+    /// An absolute link to this event in the Google Calendar Web UI. Read-only.
+    #[serde(rename = "htmlLink")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub html_link: Option<String>,
+    /// Event unique identifier as defined in RFC5545. It is used to uniquely identify events accross calendaring systems and must be supplied when importing events via the import method.
+    /// Note that the icalUID and the id are not identical and only one of them should be supplied at event creation time. One difference in their semantics is that in recurring events, all occurrences of one event have different ids while they all share the same icalUIDs.
+    #[serde(rename = "iCalUID")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub i_cal_u_i_d: Option<String>,
+    /// Opaque identifier of the event. When creating new single or recurring events, you can specify their IDs. Provided IDs must follow these rules:  
+    /// - characters allowed in the ID are those used in base32hex encoding, i.e. lowercase letters a-v and digits 0-9, see section 3.1.2 in RFC2938
+    /// - the length of the ID must be between 5 and 1024 characters
+    /// - the ID must be unique per calendar  Due to the globally distributed nature of the system, we cannot guarantee that ID collisions will be detected at event creation time. To minimize the risk of collisions we recommend using an established UUID algorithm such as one described in RFC4122.
+    /// If you do not specify an ID, it will be automatically generated by the server.
+    /// Note that the icalUID and the id are not identical and only one of them should be supplied at event creation time. One difference in their semantics is that in recurring events, all occurrences of one event have different ids while they all share the same icalUIDs.
+    #[serde(rename = "id")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub id: Option<String>,
+    /// Type of the resource ("calendar#event").
+    #[serde(rename = "kind")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub kind: Option<String>,
+    /// Geographic location of the event as free-form text. Optional.
+    #[serde(rename = "location")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub location: Option<String>,
+    /// Whether this is a locked event copy where no changes can be made to the main event fields "summary", "description", "location", "start", "end" or "recurrence". The default is False. Read-Only.
+    #[serde(rename = "locked")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub locked: Option<bool>,
+    /// The organizer of the event. If the organizer is also an attendee, this is indicated with a separate entry in attendees with the organizer field set to True. To change the organizer, use the move operation. Read-only, except when importing an event.
+    #[serde(rename = "organizer")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub organizer: Option<EventOrganizer>,
+    #[serde(rename = "originalStartTime")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub original_start_time: Option<EventDateTime>,
+    /// If set to True, Event propagation is disabled. Note that it is not the same thing as Private event properties. Optional. Immutable. The default is False.
+    #[serde(rename = "privateCopy")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub private_copy: Option<bool>,
+    /// List of RRULE, EXRULE, RDATE and EXDATE lines for a recurring event, as specified in RFC5545. Note that DTSTART and DTEND lines are not allowed in this field; event start and end times are specified in the start and end fields. This field is omitted for single events or instances of recurring events.
+    #[serde(rename = "recurrence")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub recurrence: Option<Vec<String>>,
+    /// For an instance of a recurring event, this is the id of the recurring event to which this instance belongs. Immutable.
+    #[serde(rename = "recurringEventId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub recurring_event_id: Option<String>,
+    /// Information about the event's reminders for the authenticated user.
+    #[serde(rename = "reminders")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub reminders: Option<EventReminders>,
+    /// Sequence number as per iCalendar.
+    #[serde(rename = "sequence")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub sequence: Option<i32>,
+    /// Source from which the event was created. For example, a web page, an email message or any document identifiable by an URL with HTTP or HTTPS scheme. Can only be seen or modified by the creator of the event.
+    #[serde(rename = "source")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub source: Option<EventSource>,
+    #[serde(rename = "start")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub start: Option<EventDateTime>,
+    /// Status of the event. Optional. Possible values are:  
+    /// - "confirmed" - The event is confirmed. This is the default status.
+    /// - "tentative" - The event is tentatively confirmed.
+    /// - "cancelled" - The event is cancelled (deleted). The list method returns cancelled events only on incremental sync (when syncToken or updatedMin are specified) or if the showDeleted flag is set to true. The get method always returns them.
+    /// A cancelled status represents two different states depending on the event type:  
+    /// - Cancelled exceptions of an uncancelled recurring event indicate that this instance should no longer be presented to the user. Clients should store these events for the lifetime of the parent recurring event.
+    /// Cancelled exceptions are only guaranteed to have values for the id, recurringEventId and originalStartTime fields populated. The other fields might be empty.  
+    /// - All other cancelled events represent deleted events. Clients should remove their locally synced copies. Such cancelled events will eventually disappear, so do not rely on them being available indefinitely.
+    /// Deleted events are only guaranteed to have the id field populated.   On the organizer's calendar, cancelled events continue to expose event details (summary, location, etc.) so that they can be restored (undeleted). Similarly, the events to which the user was invited and that they manually removed continue to provide details. However, incremental sync requests with showDeleted set to false will not return these details.
+    /// If an event changes its organizer (for example via the move operation) and the original organizer is not on the attendee list, it will leave behind a cancelled event where only the id field is guaranteed to be populated.
+    #[serde(rename = "status")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub status: Option<String>,
+    /// Title of the event.
+    #[serde(rename = "summary")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub summary: Option<String>,
+    /// Whether the event blocks time on the calendar. Optional. Possible values are:  
+    /// - "opaque" - Default value. The event does block time on the calendar. This is equivalent to setting Show me as to Busy in the Calendar UI.
+    /// - "transparent" - The event does not block time on the calendar. This is equivalent to setting Show me as to Available in the Calendar UI.
+    #[serde(rename = "transparency")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub transparency: Option<String>,
+    /// DateTime: Last modification time of the event (as a RFC3339 timestamp). Read-only.
+    #[serde(rename = "updated")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub updated: Option<DateTime<Utc>>,
+    /// Visibility of the event. Optional. Possible values are:  
+    /// - "default" - Uses the default visibility for events on the calendar. This is the default value.
+    /// - "public" - The event is public and event details are visible to all readers of the calendar.
+    /// - "private" - The event is private and only event attendees may view event details.
+    /// - "confidential" - The event is private. This value is provided for compatibility reasons.
+    #[serde(rename = "visibility")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub visibility: Option<String>,
+}
+
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct EventAttachment {
+    /// ID of the attached file. Read-only.
+    /// For Google Drive files, this is the ID of the corresponding Files resource entry in the Drive API.
+    #[serde(rename = "fileId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub file_id: Option<String>,
+    /// URL link to the attachment.
+    /// For adding Google Drive file attachments use the same format as in alternateLink property of the Files resource in the Drive API.
+    /// Required when adding an attachment.
+    #[serde(rename = "fileUrl")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub file_url: Option<String>,
+    /// URL link to the attachment's icon. Read-only.
+    #[serde(rename = "iconLink")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub icon_link: Option<String>,
+    /// Internet media type (MIME type) of the attachment.
+    #[serde(rename = "mimeType")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub mime_type: Option<String>,
+    /// Attachment title.
+    #[serde(rename = "title")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub title: Option<String>,
+}
+
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct EventAttendee {
+    /// Number of additional guests. Optional. The default is 0.
+    #[serde(rename = "additionalGuests")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub additional_guests: Option<i32>,
+    /// The attendee's response comment. Optional.
+    #[serde(rename = "comment")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub comment: Option<String>,
+    /// The attendee's name, if available. Optional.
+    #[serde(rename = "displayName")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub display_name: Option<String>,
+    /// The attendee's email address, if available. This field must be present when adding an attendee. It must be a valid email address as per RFC5322.
+    /// Required when adding an attendee.
+    #[serde(rename = "email")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub email: Option<String>,
+    /// The attendee's Profile ID, if available. It corresponds to the id field in the People collection of the Google+ API
+    #[serde(rename = "id")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub id: Option<String>,
+    /// Whether this is an optional attendee. Optional. The default is False.
+    #[serde(rename = "optional")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub optional: Option<bool>,
+    /// Whether the attendee is the organizer of the event. Read-only. The default is False.
+    #[serde(rename = "organizer")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub organizer: Option<bool>,
+    /// Whether the attendee is a resource. Can only be set when the attendee is added to the event for the first time. Subsequent modifications are ignored. Optional. The default is False.
+    #[serde(rename = "resource")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub resource: Option<bool>,
+    /// The attendee's response status. Possible values are:  
+    /// - "needsAction" - The attendee has not responded to the invitation.
+    /// - "declined" - The attendee has declined the invitation.
+    /// - "tentative" - The attendee has tentatively accepted the invitation.
+    /// - "accepted" - The attendee has accepted the invitation.
+    #[serde(rename = "responseStatus")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub response_status: Option<String>,
+    /// Whether this entry represents the calendar on which this copy of the event appears. Read-only. The default is False.
+    #[serde(rename = "self")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub self_: Option<bool>,
+}
+
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct EventDateTime {
+    /// The date, in the format "yyyy-mm-dd", if this is an all-day event.
+    #[serde(rename = "date")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub date: Option<String>,
+    /// DateTime: The time, as a combined date-time value (formatted according to RFC3339). A time zone offset is required unless a time zone is explicitly specified in timeZone.
+    #[serde(rename = "dateTime")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub date_time: Option<DateTime<Utc>>,
+    /// The time zone in which the time is specified. (Formatted as an IANA Time Zone Database name, e.g. "Europe/Zurich".) For recurring events this field is required and specifies the time zone in which the recurrence is expanded. For single events this field is optional and indicates a custom time zone for the event start/end.
+    #[serde(rename = "timeZone")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub time_zone: Option<String>,
+}
+
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct EventReminder {
+    /// The method used by this reminder. Possible values are:  
+    /// - "email" - Reminders are sent via email.
+    /// - "popup" - Reminders are sent via a UI popup.  
+    /// Required when adding a reminder.
+    #[serde(rename = "method")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub method: Option<String>,
+    /// Number of minutes before the start of the event when the reminder should trigger. Valid values are between 0 and 40320 (4 weeks in minutes).
+    /// Required when adding a reminder.
+    #[serde(rename = "minutes")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub minutes: Option<i32>,
+}
+
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct Events {
+    /// The user's access role for this calendar. Read-only. Possible values are:  
+    /// - "none" - The user has no access.
+    /// - "freeBusyReader" - The user has read access to free/busy information.
+    /// - "reader" - The user has read access to the calendar. Private events will appear to users with reader access, but event details will be hidden.
+    /// - "writer" - The user has read and write access to the calendar. Private events will appear to users with writer access, and event details will be visible.
+    /// - "owner" - The user has ownership of the calendar. This role has all of the permissions of the writer role with the additional ability to see and manipulate ACLs.
+    #[serde(rename = "accessRole")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub access_role: Option<String>,
+    /// The default reminders on the calendar for the authenticated user. These reminders apply to all events on this calendar that do not explicitly override them (i.e. do not have reminders.useDefault set to True).
+    #[serde(rename = "defaultReminders")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub default_reminders: Option<Vec<EventReminder>>,
+    /// Description of the calendar. Read-only.
+    #[serde(rename = "description")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub description: Option<String>,
+    /// ETag of the collection.
+    #[serde(rename = "etag")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub etag: Option<String>,
+    /// List of events on the calendar.
+    #[serde(rename = "items")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub items: Option<Vec<Event>>,
+    /// Type of the collection ("calendar#events").
+    #[serde(rename = "kind")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub kind: Option<String>,
+    /// Token used to access the next page of this result. Omitted if no further results are available, in which case nextSyncToken is provided.
+    #[serde(rename = "nextPageToken")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub next_page_token: Option<String>,
+    /// Token used at a later point in time to retrieve only the entries that have changed since this result was returned. Omitted if further results are available, in which case nextPageToken is provided.
+    #[serde(rename = "nextSyncToken")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub next_sync_token: Option<String>,
+    /// Title of the calendar. Read-only.
+    #[serde(rename = "summary")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub summary: Option<String>,
+    /// The time zone of the calendar. Read-only.
+    #[serde(rename = "timeZone")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub time_zone: Option<String>,
+    /// DateTime: Last modification time of the calendar (as a RFC3339 timestamp). Read-only.
+    #[serde(rename = "updated")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub updated: Option<DateTime<Utc>>,
+}
+
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct FreeBusyCalendar {
+    /// List of time ranges during which this calendar should be regarded as busy.
+    #[serde(rename = "busy")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub busy: Option<Vec<TimePeriod>>,
+    /// Optional error(s) (if computation for the calendar failed).
+    #[serde(rename = "errors")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub errors: Option<Vec<Error>>,
+}
+
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct FreeBusyGroup {
+    /// List of calendars' identifiers within a group.
+    #[serde(rename = "calendars")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub calendars: Option<Vec<String>>,
+    /// Optional error(s) (if computation for the group failed).
+    #[serde(rename = "errors")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub errors: Option<Vec<Error>>,
+}
+
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct FreeBusyRequest {
+    /// Maximal number of calendars for which FreeBusy information is to be provided. Optional. Maximum value is 50.
+    #[serde(rename = "calendarExpansionMax")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub calendar_expansion_max: Option<i32>,
+    /// Maximal number of calendar identifiers to be provided for a single group. Optional. An error is returned for a group with more members than this value. Maximum value is 100.
+    #[serde(rename = "groupExpansionMax")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub group_expansion_max: Option<i32>,
+    /// List of calendars and/or groups to query.
+    #[serde(rename = "items")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub items: Option<Vec<FreeBusyRequestItem>>,
+    /// DateTime: The end of the interval for the query formatted as per RFC3339.
+    #[serde(rename = "timeMax")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub time_max: Option<DateTime<Utc>>,
+    /// DateTime: The start of the interval for the query formatted as per RFC3339.
+    #[serde(rename = "timeMin")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub time_min: Option<DateTime<Utc>>,
+    /// Time zone used in the response. Optional. The default is UTC.
+    #[serde(rename = "timeZone")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub time_zone: Option<String>,
+}
+
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct FreeBusyRequestItem {
+    /// The identifier of a calendar or a group.
+    #[serde(rename = "id")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub id: Option<String>,
+}
+
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct FreeBusyResponse {
+    /// List of free/busy information for calendars.
+    #[serde(rename = "calendars")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub calendars: Option<HashMap<String, FreeBusyCalendar>>,
+    /// Expansion of groups.
+    #[serde(rename = "groups")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub groups: Option<HashMap<String, FreeBusyGroup>>,
+    /// Type of the resource ("calendar#freeBusy").
+    #[serde(rename = "kind")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub kind: Option<String>,
+    /// DateTime: The end of the interval.
+    #[serde(rename = "timeMax")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub time_max: Option<DateTime<Utc>>,
+    /// DateTime: The start of the interval.
+    #[serde(rename = "timeMin")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub time_min: Option<DateTime<Utc>>,
+}
+
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct Setting {
+    /// ETag of the resource.
+    #[serde(rename = "etag")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub etag: Option<String>,
+    /// The id of the user setting.
+    #[serde(rename = "id")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub id: Option<String>,
+    /// Type of the resource ("calendar#setting").
+    #[serde(rename = "kind")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub kind: Option<String>,
+    /// Value of the user setting. The format of the value depends on the ID of the setting. It must always be a UTF-8 string of length up to 1024 characters.
+    #[serde(rename = "value")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub value: Option<String>,
+}
+
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct Settings {
+    /// Etag of the collection.
+    #[serde(rename = "etag")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub etag: Option<String>,
+    /// List of user settings.
+    #[serde(rename = "items")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub items: Option<Vec<Setting>>,
+    /// Type of the collection ("calendar#settings").
+    #[serde(rename = "kind")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub kind: Option<String>,
+    /// Token used to access the next page of this result. Omitted if no further results are available, in which case nextSyncToken is provided.
+    #[serde(rename = "nextPageToken")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub next_page_token: Option<String>,
+    /// Token used at a later point in time to retrieve only the entries that have changed since this result was returned. Omitted if further results are available, in which case nextPageToken is provided.
+    #[serde(rename = "nextSyncToken")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub next_sync_token: Option<String>,
+}
+
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct TimePeriod {
+    /// DateTime: The (exclusive) end of the time period.
+    #[serde(rename = "end")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub end: Option<DateTime<Utc>>,
+    /// DateTime: The (inclusive) start of the time period.
+    #[serde(rename = "start")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub start: Option<DateTime<Utc>>,
+}
+
 #[derive(Debug, Clone, Copy, Serialize, Deserialize)]
 pub enum CalendarListListMinAccessRole {
     Undefined,
@@ -1259,7 +1253,7 @@
 }
 
 #[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum EventsMoveSendUpdates {
+pub enum EventsDeleteSendUpdates {
     Undefined,
     /// Notifications are sent to all guests.
     #[serde(rename = "all")]
@@ -1272,47 +1266,51 @@
     None,
 }
 
-impl std::default::Default for EventsMoveSendUpdates {
-    fn default() -> EventsMoveSendUpdates {
-        EventsMoveSendUpdates::Undefined
+impl std::default::Default for EventsDeleteSendUpdates {
+    fn default() -> EventsDeleteSendUpdates {
+        EventsDeleteSendUpdates::Undefined
     }
 }
 
-impl std::fmt::Display for EventsMoveSendUpdates {
+impl std::fmt::Display for EventsDeleteSendUpdates {
     fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
         let s = match self {
-            EventsMoveSendUpdates::Undefined => write!(f, "undefined"),
-            EventsMoveSendUpdates::All => write!(f, "all"),
-            EventsMoveSendUpdates::ExternalOnly => write!(f, "externalOnly"),
-            EventsMoveSendUpdates::None => write!(f, "none"),
+            EventsDeleteSendUpdates::Undefined => write!(f, "undefined"),
+            EventsDeleteSendUpdates::All => write!(f, "all"),
+            EventsDeleteSendUpdates::ExternalOnly => write!(f, "externalOnly"),
+            EventsDeleteSendUpdates::None => write!(f, "none"),
         };
         Ok(())
     }
 }
 
 #[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum EventsWatchOrderBy {
+pub enum EventsInsertSendUpdates {
     Undefined,
-    /// Order by the start date/time (ascending). This is only available when querying single events (i.e. the parameter singleEvents is True)
-    #[serde(rename = "startTime")]
-    StartTime,
-    /// Order by last modification time (ascending).
-    #[serde(rename = "updated")]
-    Updated,
+    /// Notifications are sent to all guests.
+    #[serde(rename = "all")]
+    All,
+    /// Notifications are sent to non-Google Calendar guests only.
+    #[serde(rename = "externalOnly")]
+    ExternalOnly,
+    /// No notifications are sent. This value should only be used for migration use cases (note that in most migration cases the import method should be used).
+    #[serde(rename = "none")]
+    None,
 }
 
-impl std::default::Default for EventsWatchOrderBy {
-    fn default() -> EventsWatchOrderBy {
-        EventsWatchOrderBy::Undefined
+impl std::default::Default for EventsInsertSendUpdates {
+    fn default() -> EventsInsertSendUpdates {
+        EventsInsertSendUpdates::Undefined
     }
 }
 
-impl std::fmt::Display for EventsWatchOrderBy {
+impl std::fmt::Display for EventsInsertSendUpdates {
     fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
         let s = match self {
-            EventsWatchOrderBy::Undefined => write!(f, "undefined"),
-            EventsWatchOrderBy::StartTime => write!(f, "startTime"),
-            EventsWatchOrderBy::Updated => write!(f, "updated"),
+            EventsInsertSendUpdates::Undefined => write!(f, "undefined"),
+            EventsInsertSendUpdates::All => write!(f, "all"),
+            EventsInsertSendUpdates::ExternalOnly => write!(f, "externalOnly"),
+            EventsInsertSendUpdates::None => write!(f, "none"),
         };
         Ok(())
     }
@@ -1347,7 +1345,7 @@
 }
 
 #[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum EventsUpdateSendUpdates {
+pub enum EventsMoveSendUpdates {
     Undefined,
     /// Notifications are sent to all guests.
     #[serde(rename = "all")]
@@ -1360,19 +1358,19 @@
     None,
 }
 
-impl std::default::Default for EventsUpdateSendUpdates {
-    fn default() -> EventsUpdateSendUpdates {
-        EventsUpdateSendUpdates::Undefined
+impl std::default::Default for EventsMoveSendUpdates {
+    fn default() -> EventsMoveSendUpdates {
+        EventsMoveSendUpdates::Undefined
     }
 }
 
-impl std::fmt::Display for EventsUpdateSendUpdates {
+impl std::fmt::Display for EventsMoveSendUpdates {
     fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
         let s = match self {
-            EventsUpdateSendUpdates::Undefined => write!(f, "undefined"),
-            EventsUpdateSendUpdates::All => write!(f, "all"),
-            EventsUpdateSendUpdates::ExternalOnly => write!(f, "externalOnly"),
-            EventsUpdateSendUpdates::None => write!(f, "none"),
+            EventsMoveSendUpdates::Undefined => write!(f, "undefined"),
+            EventsMoveSendUpdates::All => write!(f, "all"),
+            EventsMoveSendUpdates::ExternalOnly => write!(f, "externalOnly"),
+            EventsMoveSendUpdates::None => write!(f, "none"),
         };
         Ok(())
     }
@@ -1443,7 +1441,7 @@
 }
 
 #[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum EventsInsertSendUpdates {
+pub enum EventsUpdateSendUpdates {
     Undefined,
     /// Notifications are sent to all guests.
     #[serde(rename = "all")]
@@ -1456,51 +1454,47 @@
     None,
 }
 
-impl std::default::Default for EventsInsertSendUpdates {
-    fn default() -> EventsInsertSendUpdates {
-        EventsInsertSendUpdates::Undefined
+impl std::default::Default for EventsUpdateSendUpdates {
+    fn default() -> EventsUpdateSendUpdates {
+        EventsUpdateSendUpdates::Undefined
     }
 }
 
-impl std::fmt::Display for EventsInsertSendUpdates {
+impl std::fmt::Display for EventsUpdateSendUpdates {
     fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
         let s = match self {
-            EventsInsertSendUpdates::Undefined => write!(f, "undefined"),
-            EventsInsertSendUpdates::All => write!(f, "all"),
-            EventsInsertSendUpdates::ExternalOnly => write!(f, "externalOnly"),
-            EventsInsertSendUpdates::None => write!(f, "none"),
+            EventsUpdateSendUpdates::Undefined => write!(f, "undefined"),
+            EventsUpdateSendUpdates::All => write!(f, "all"),
+            EventsUpdateSendUpdates::ExternalOnly => write!(f, "externalOnly"),
+            EventsUpdateSendUpdates::None => write!(f, "none"),
         };
         Ok(())
     }
 }
 
 #[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum EventsDeleteSendUpdates {
+pub enum EventsWatchOrderBy {
     Undefined,
-    /// Notifications are sent to all guests.
-    #[serde(rename = "all")]
-    All,
-    /// Notifications are sent to non-Google Calendar guests only.
-    #[serde(rename = "externalOnly")]
-    ExternalOnly,
-    /// No notifications are sent. This value should only be used for migration use cases (note that in most migration cases the import method should be used).
-    #[serde(rename = "none")]
-    None,
+    /// Order by the start date/time (ascending). This is only available when querying single events (i.e. the parameter singleEvents is True)
+    #[serde(rename = "startTime")]
+    StartTime,
+    /// Order by last modification time (ascending).
+    #[serde(rename = "updated")]
+    Updated,
 }
 
-impl std::default::Default for EventsDeleteSendUpdates {
-    fn default() -> EventsDeleteSendUpdates {
-        EventsDeleteSendUpdates::Undefined
+impl std::default::Default for EventsWatchOrderBy {
+    fn default() -> EventsWatchOrderBy {
+        EventsWatchOrderBy::Undefined
     }
 }
 
-impl std::fmt::Display for EventsDeleteSendUpdates {
+impl std::fmt::Display for EventsWatchOrderBy {
     fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
         let s = match self {
-            EventsDeleteSendUpdates::Undefined => write!(f, "undefined"),
-            EventsDeleteSendUpdates::All => write!(f, "all"),
-            EventsDeleteSendUpdates::ExternalOnly => write!(f, "externalOnly"),
-            EventsDeleteSendUpdates::None => write!(f, "none"),
+            EventsWatchOrderBy::Undefined => write!(f, "undefined"),
+            EventsWatchOrderBy::StartTime => write!(f, "startTime"),
+            EventsWatchOrderBy::Updated => write!(f, "updated"),
         };
         Ok(())
     }
@@ -1530,43 +1524,21 @@
     }
 }
 
-/// Parameters for the `channels.stop` method.
+/// Parameters for the `acl.delete` method.
 #[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct ChannelsStopParams {
+pub struct AclDeleteParams {
     /// General attributes applying to any API call
     #[serde(flatten)]
     pub calendar_params: Option<CalendarParams>,
-}
-
-impl std::fmt::Display for ChannelsStopParams {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        Ok(())
-    }
-}
-
-/// Parameters for the `freebusy.query` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct FreebusyQueryParams {
-    /// General attributes applying to any API call
-    #[serde(flatten)]
-    pub calendar_params: Option<CalendarParams>,
+    /// Calendar identifier. To retrieve calendar IDs call the calendarList.list method. If you want to access the primary calendar of the currently logged in user, use the "primary" keyword.
+    #[serde(rename = "calendarId")]
+    pub calendar_id: String,
+    /// ACL rule identifier.
+    #[serde(rename = "ruleId")]
+    pub rule_id: String,
 }
 
-impl std::fmt::Display for FreebusyQueryParams {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        Ok(())
-    }
-}
-
-/// Parameters for the `colors.get` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct ColorsGetParams {
-    /// General attributes applying to any API call
-    #[serde(flatten)]
-    pub calendar_params: Option<CalendarParams>,
-}
-
-impl std::fmt::Display for ColorsGetParams {
+impl std::fmt::Display for AclDeleteParams {
     fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
         Ok(())
     }
@@ -1578,12 +1550,12 @@
     /// General attributes applying to any API call
     #[serde(flatten)]
     pub calendar_params: Option<CalendarParams>,
+    /// Calendar identifier. To retrieve calendar IDs call the calendarList.list method. If you want to access the primary calendar of the currently logged in user, use the "primary" keyword.
+    #[serde(rename = "calendarId")]
+    pub calendar_id: String,
     /// ACL rule identifier.
     #[serde(rename = "ruleId")]
     pub rule_id: String,
-    /// Calendar identifier. To retrieve calendar IDs call the calendarList.list method. If you want to access the primary calendar of the currently logged in user, use the "primary" keyword.
-    #[serde(rename = "calendarId")]
-    pub calendar_id: String,
 }
 
 impl std::fmt::Display for AclGetParams {
@@ -1592,26 +1564,6 @@
     }
 }
 
-/// Parameters for the `acl.delete` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct AclDeleteParams {
-    /// General attributes applying to any API call
-    #[serde(flatten)]
-    pub calendar_params: Option<CalendarParams>,
-    /// ACL rule identifier.
-    #[serde(rename = "ruleId")]
-    pub rule_id: String,
-    /// Calendar identifier. To retrieve calendar IDs call the calendarList.list method. If you want to access the primary calendar of the currently logged in user, use the "primary" keyword.
-    #[serde(rename = "calendarId")]
-    pub calendar_id: String,
-}
-
-impl std::fmt::Display for AclDeleteParams {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        Ok(())
-    }
-}
-
 /// Parameters for the `acl.insert` method.
 #[derive(Serialize, Deserialize, Debug, Clone, Default)]
 pub struct AclInsertParams {
@@ -1639,81 +1591,21 @@
     }
 }
 
-/// Parameters for the `acl.watch` method.
+/// Parameters for the `acl.list` method.
 #[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct AclWatchParams {
+pub struct AclListParams {
     /// General attributes applying to any API call
     #[serde(flatten)]
     pub calendar_params: Option<CalendarParams>,
     /// Calendar identifier. To retrieve calendar IDs call the calendarList.list method. If you want to access the primary calendar of the currently logged in user, use the "primary" keyword.
     #[serde(rename = "calendarId")]
     pub calendar_id: String,
-    /// Whether to include deleted ACLs in the result. Deleted ACLs are represented by role equal to "none". Deleted ACLs will always be included if syncToken is provided. Optional. The default is False.
-    #[serde(rename = "showDeleted")]
-    pub show_deleted: Option<bool>,
     /// Maximum number of entries returned on one result page. By default the value is 100 entries. The page size can never be larger than 250 entries. Optional.
     #[serde(rename = "maxResults")]
     pub max_results: Option<i32>,
     /// Token specifying which result page to return. Optional.
     #[serde(rename = "pageToken")]
     pub page_token: Option<String>,
-    /// Token obtained from the nextSyncToken field returned on the last page of results from the previous list request. It makes the result of this list request contain only entries that have changed since then. All entries deleted since the previous list request will always be in the result set and it is not allowed to set showDeleted to False.
-    /// If the syncToken expires, the server will respond with a 410 GONE response code and the client should clear its storage and perform a full synchronization without any syncToken.
-    /// Learn more about incremental synchronization.
-    /// Optional. The default is to return all entries.
-    #[serde(rename = "syncToken")]
-    pub sync_token: Option<String>,
-}
-
-impl std::fmt::Display for AclWatchParams {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        if let Some(ref v) = self.show_deleted {
-            write!(
-                f,
-                "&showDeleted={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.max_results {
-            write!(
-                f,
-                "&maxResults={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.page_token {
-            write!(
-                f,
-                "&pageToken={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.sync_token {
-            write!(
-                f,
-                "&syncToken={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        Ok(())
-    }
-}
-
-/// Parameters for the `acl.list` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct AclListParams {
-    /// General attributes applying to any API call
-    #[serde(flatten)]
-    pub calendar_params: Option<CalendarParams>,
-    /// Token specifying which result page to return. Optional.
-    #[serde(rename = "pageToken")]
-    pub page_token: Option<String>,
-    /// Maximum number of entries returned on one result page. By default the value is 100 entries. The page size can never be larger than 250 entries. Optional.
-    #[serde(rename = "maxResults")]
-    pub max_results: Option<i32>,
-    /// Calendar identifier. To retrieve calendar IDs call the calendarList.list method. If you want to access the primary calendar of the currently logged in user, use the "primary" keyword.
-    #[serde(rename = "calendarId")]
-    pub calendar_id: String,
     /// Whether to include deleted ACLs in the result. Deleted ACLs are represented by role equal to "none". Deleted ACLs will always be included if syncToken is provided. Optional. The default is False.
     #[serde(rename = "showDeleted")]
     pub show_deleted: Option<bool>,
@@ -1727,6 +1619,13 @@
 
 impl std::fmt::Display for AclListParams {
     fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        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,
@@ -1734,13 +1633,6 @@
                 percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
             )?;
         }
-        if let Some(ref v) = self.max_results {
-            write!(
-                f,
-                "&maxResults={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
         if let Some(ref v) = self.show_deleted {
             write!(
                 f,
@@ -1759,6 +1651,36 @@
     }
 }
 
+/// Parameters for the `acl.patch` method.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct AclPatchParams {
+    /// General attributes applying to any API call
+    #[serde(flatten)]
+    pub calendar_params: Option<CalendarParams>,
+    /// Calendar identifier. To retrieve calendar IDs call the calendarList.list method. If you want to access the primary calendar of the currently logged in user, use the "primary" keyword.
+    #[serde(rename = "calendarId")]
+    pub calendar_id: String,
+    /// ACL rule identifier.
+    #[serde(rename = "ruleId")]
+    pub rule_id: String,
+    /// Whether to send notifications about the calendar sharing change. Note that there are no notifications on access removal. Optional. The default is True.
+    #[serde(rename = "sendNotifications")]
+    pub send_notifications: Option<bool>,
+}
+
+impl std::fmt::Display for AclPatchParams {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        if let Some(ref v) = self.send_notifications {
+            write!(
+                f,
+                "&sendNotifications={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        Ok(())
+    }
+}
+
 /// Parameters for the `acl.update` method.
 #[derive(Serialize, Deserialize, Debug, Clone, Default)]
 pub struct AclUpdateParams {
@@ -1789,29 +1711,59 @@
     }
 }
 
-/// Parameters for the `acl.patch` method.
+/// Parameters for the `acl.watch` method.
 #[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct AclPatchParams {
+pub struct AclWatchParams {
     /// General attributes applying to any API call
     #[serde(flatten)]
     pub calendar_params: Option<CalendarParams>,
-    /// ACL rule identifier.
-    #[serde(rename = "ruleId")]
-    pub rule_id: String,
-    /// Whether to send notifications about the calendar sharing change. Note that there are no notifications on access removal. Optional. The default is True.
-    #[serde(rename = "sendNotifications")]
-    pub send_notifications: Option<bool>,
     /// Calendar identifier. To retrieve calendar IDs call the calendarList.list method. If you want to access the primary calendar of the currently logged in user, use the "primary" keyword.
     #[serde(rename = "calendarId")]
     pub calendar_id: String,
+    /// Maximum number of entries returned on one result page. By default the value is 100 entries. The page size can never be larger than 250 entries. Optional.
+    #[serde(rename = "maxResults")]
+    pub max_results: Option<i32>,
+    /// Token specifying which result page to return. Optional.
+    #[serde(rename = "pageToken")]
+    pub page_token: Option<String>,
+    /// Whether to include deleted ACLs in the result. Deleted ACLs are represented by role equal to "none". Deleted ACLs will always be included if syncToken is provided. Optional. The default is False.
+    #[serde(rename = "showDeleted")]
+    pub show_deleted: Option<bool>,
+    /// Token obtained from the nextSyncToken field returned on the last page of results from the previous list request. It makes the result of this list request contain only entries that have changed since then. All entries deleted since the previous list request will always be in the result set and it is not allowed to set showDeleted to False.
+    /// If the syncToken expires, the server will respond with a 410 GONE response code and the client should clear its storage and perform a full synchronization without any syncToken.
+    /// Learn more about incremental synchronization.
+    /// Optional. The default is to return all entries.
+    #[serde(rename = "syncToken")]
+    pub sync_token: Option<String>,
 }
 
-impl std::fmt::Display for AclPatchParams {
+impl std::fmt::Display for AclWatchParams {
     fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        if let Some(ref v) = self.send_notifications {
+        if let Some(ref v) = self.max_results {
             write!(
                 f,
-                "&sendNotifications={}",
+                "&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.show_deleted {
+            write!(
+                f,
+                "&showDeleted={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.sync_token {
+            write!(
+                f,
+                "&syncToken={}",
                 percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
             )?;
         }
@@ -1819,23 +1771,9 @@
     }
 }
 
-/// Parameters for the `calendars.insert` method.
+/// Parameters for the `calendarList.delete` method.
 #[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct CalendarsInsertParams {
-    /// General attributes applying to any API call
-    #[serde(flatten)]
-    pub calendar_params: Option<CalendarParams>,
-}
-
-impl std::fmt::Display for CalendarsInsertParams {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        Ok(())
-    }
-}
-
-/// Parameters for the `calendars.patch` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct CalendarsPatchParams {
+pub struct CalendarListDeleteParams {
     /// General attributes applying to any API call
     #[serde(flatten)]
     pub calendar_params: Option<CalendarParams>,
@@ -1844,75 +1782,7 @@
     pub calendar_id: String,
 }
 
-impl std::fmt::Display for CalendarsPatchParams {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        Ok(())
-    }
-}
-
-/// Parameters for the `calendars.delete` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct CalendarsDeleteParams {
-    /// General attributes applying to any API call
-    #[serde(flatten)]
-    pub calendar_params: Option<CalendarParams>,
-    /// Calendar identifier. To retrieve calendar IDs call the calendarList.list method. If you want to access the primary calendar of the currently logged in user, use the "primary" keyword.
-    #[serde(rename = "calendarId")]
-    pub calendar_id: String,
-}
-
-impl std::fmt::Display for CalendarsDeleteParams {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        Ok(())
-    }
-}
-
-/// Parameters for the `calendars.clear` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct CalendarsClearParams {
-    /// General attributes applying to any API call
-    #[serde(flatten)]
-    pub calendar_params: Option<CalendarParams>,
-    /// Calendar identifier. To retrieve calendar IDs call the calendarList.list method. If you want to access the primary calendar of the currently logged in user, use the "primary" keyword.
-    #[serde(rename = "calendarId")]
-    pub calendar_id: String,
-}
-
-impl std::fmt::Display for CalendarsClearParams {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        Ok(())
-    }
-}
-
-/// Parameters for the `calendars.get` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct CalendarsGetParams {
-    /// General attributes applying to any API call
-    #[serde(flatten)]
-    pub calendar_params: Option<CalendarParams>,
-    /// Calendar identifier. To retrieve calendar IDs call the calendarList.list method. If you want to access the primary calendar of the currently logged in user, use the "primary" keyword.
-    #[serde(rename = "calendarId")]
-    pub calendar_id: String,
-}
-
-impl std::fmt::Display for CalendarsGetParams {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        Ok(())
-    }
-}
-
-/// Parameters for the `calendars.update` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct CalendarsUpdateParams {
-    /// General attributes applying to any API call
-    #[serde(flatten)]
-    pub calendar_params: Option<CalendarParams>,
-    /// Calendar identifier. To retrieve calendar IDs call the calendarList.list method. If you want to access the primary calendar of the currently logged in user, use the "primary" keyword.
-    #[serde(rename = "calendarId")]
-    pub calendar_id: String,
-}
-
-impl std::fmt::Display for CalendarsUpdateParams {
+impl std::fmt::Display for CalendarListDeleteParams {
     fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
         Ok(())
     }
@@ -1959,18 +1829,96 @@
     }
 }
 
+/// Parameters for the `calendarList.list` method.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct CalendarListListParams {
+    /// General attributes applying to any API call
+    #[serde(flatten)]
+    pub calendar_params: Option<CalendarParams>,
+    /// Maximum number of entries returned on one result page. By default the value is 100 entries. The page size can never be larger than 250 entries. Optional.
+    #[serde(rename = "maxResults")]
+    pub max_results: Option<i32>,
+    /// The minimum access role for the user in the returned entries. Optional. The default is no restriction.
+    #[serde(rename = "minAccessRole")]
+    pub min_access_role: Option<CalendarListListMinAccessRole>,
+    /// Token specifying which result page to return. Optional.
+    #[serde(rename = "pageToken")]
+    pub page_token: Option<String>,
+    /// Whether to include deleted calendar list entries in the result. Optional. The default is False.
+    #[serde(rename = "showDeleted")]
+    pub show_deleted: Option<bool>,
+    /// Whether to show hidden entries. Optional. The default is False.
+    #[serde(rename = "showHidden")]
+    pub show_hidden: Option<bool>,
+    /// Token obtained from the nextSyncToken field returned on the last page of results from the previous list request. It makes the result of this list request contain only entries that have changed since then. If only read-only fields such as calendar properties or ACLs have changed, the entry won't be returned. All entries deleted and hidden since the previous list request will always be in the result set and it is not allowed to set showDeleted neither showHidden to False.
+    /// To ensure client state consistency minAccessRole query parameter cannot be specified together with nextSyncToken.
+    /// If the syncToken expires, the server will respond with a 410 GONE response code and the client should clear its storage and perform a full synchronization without any syncToken.
+    /// Learn more about incremental synchronization.
+    /// Optional. The default is to return all entries.
+    #[serde(rename = "syncToken")]
+    pub sync_token: Option<String>,
+}
+
+impl std::fmt::Display for CalendarListListParams {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        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.min_access_role {
+            write!(
+                f,
+                "&minAccessRole={}",
+                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.show_deleted {
+            write!(
+                f,
+                "&showDeleted={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.show_hidden {
+            write!(
+                f,
+                "&showHidden={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.sync_token {
+            write!(
+                f,
+                "&syncToken={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        Ok(())
+    }
+}
+
 /// Parameters for the `calendarList.patch` method.
 #[derive(Serialize, Deserialize, Debug, Clone, Default)]
 pub struct CalendarListPatchParams {
     /// General attributes applying to any API call
     #[serde(flatten)]
     pub calendar_params: Option<CalendarParams>,
+    /// Calendar identifier. To retrieve calendar IDs call the calendarList.list method. If you want to access the primary calendar of the currently logged in user, use the "primary" keyword.
+    #[serde(rename = "calendarId")]
+    pub calendar_id: String,
     /// Whether to use the foregroundColor and backgroundColor fields to write the calendar colors (RGB). If this feature is used, the index-based colorId field will be set to the best matching option automatically. Optional. The default is False.
     #[serde(rename = "colorRgbFormat")]
     pub color_rgb_format: Option<bool>,
-    /// Calendar identifier. To retrieve calendar IDs call the calendarList.list method. If you want to access the primary calendar of the currently logged in user, use the "primary" keyword.
-    #[serde(rename = "calendarId")]
-    pub calendar_id: String,
 }
 
 impl std::fmt::Display for CalendarListPatchParams {
@@ -1986,12 +1934,51 @@
     }
 }
 
-/// Parameters for the `calendarList.list` method.
+/// Parameters for the `calendarList.update` method.
 #[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct CalendarListListParams {
+pub struct CalendarListUpdateParams {
     /// General attributes applying to any API call
     #[serde(flatten)]
     pub calendar_params: Option<CalendarParams>,
+    /// Calendar identifier. To retrieve calendar IDs call the calendarList.list method. If you want to access the primary calendar of the currently logged in user, use the "primary" keyword.
+    #[serde(rename = "calendarId")]
+    pub calendar_id: String,
+    /// Whether to use the foregroundColor and backgroundColor fields to write the calendar colors (RGB). If this feature is used, the index-based colorId field will be set to the best matching option automatically. Optional. The default is False.
+    #[serde(rename = "colorRgbFormat")]
+    pub color_rgb_format: Option<bool>,
+}
+
+impl std::fmt::Display for CalendarListUpdateParams {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        if let Some(ref v) = self.color_rgb_format {
+            write!(
+                f,
+                "&colorRgbFormat={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        Ok(())
+    }
+}
+
+/// Parameters for the `calendarList.watch` method.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct CalendarListWatchParams {
+    /// General attributes applying to any API call
+    #[serde(flatten)]
+    pub calendar_params: Option<CalendarParams>,
+    /// Maximum number of entries returned on one result page. By default the value is 100 entries. The page size can never be larger than 250 entries. Optional.
+    #[serde(rename = "maxResults")]
+    pub max_results: Option<i32>,
+    /// The minimum access role for the user in the returned entries. Optional. The default is no restriction.
+    #[serde(rename = "minAccessRole")]
+    pub min_access_role: Option<CalendarListWatchMinAccessRole>,
+    /// Token specifying which result page to return. Optional.
+    #[serde(rename = "pageToken")]
+    pub page_token: Option<String>,
+    /// Whether to include deleted calendar list entries in the result. Optional. The default is False.
+    #[serde(rename = "showDeleted")]
+    pub show_deleted: Option<bool>,
     /// Whether to show hidden entries. Optional. The default is False.
     #[serde(rename = "showHidden")]
     pub show_hidden: Option<bool>,
@@ -2002,40 +1989,14 @@
     /// Optional. The default is to return all entries.
     #[serde(rename = "syncToken")]
     pub sync_token: Option<String>,
-    /// Whether to include deleted calendar list entries in the result. Optional. The default is False.
-    #[serde(rename = "showDeleted")]
-    pub show_deleted: Option<bool>,
-    /// The minimum access role for the user in the returned entries. Optional. The default is no restriction.
-    #[serde(rename = "minAccessRole")]
-    pub min_access_role: Option<CalendarListListMinAccessRole>,
-    /// Token specifying which result page to return. Optional.
-    #[serde(rename = "pageToken")]
-    pub page_token: Option<String>,
-    /// Maximum number of entries returned on one result page. By default the value is 100 entries. The page size can never be larger than 250 entries. Optional.
-    #[serde(rename = "maxResults")]
-    pub max_results: Option<i32>,
 }
 
-impl std::fmt::Display for CalendarListListParams {
+impl std::fmt::Display for CalendarListWatchParams {
     fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        if let Some(ref v) = self.show_hidden {
+        if let Some(ref v) = self.max_results {
             write!(
                 f,
-                "&showHidden={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.sync_token {
-            write!(
-                f,
-                "&syncToken={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.show_deleted {
-            write!(
-                f,
-                "&showDeleted={}",
+                "&maxResults={}",
                 percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
             )?;
         }
@@ -2053,53 +2014,10 @@
                 percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
             )?;
         }
-        if let Some(ref v) = self.max_results {
+        if let Some(ref v) = self.show_deleted {
             write!(
                 f,
-                "&maxResults={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        Ok(())
-    }
-}
-
-/// Parameters for the `calendarList.watch` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct CalendarListWatchParams {
-    /// General attributes applying to any API call
-    #[serde(flatten)]
-    pub calendar_params: Option<CalendarParams>,
-    /// The minimum access role for the user in the returned entries. Optional. The default is no restriction.
-    #[serde(rename = "minAccessRole")]
-    pub min_access_role: Option<CalendarListWatchMinAccessRole>,
-    /// Whether to show hidden entries. Optional. The default is False.
-    #[serde(rename = "showHidden")]
-    pub show_hidden: Option<bool>,
-    /// Whether to include deleted calendar list entries in the result. Optional. The default is False.
-    #[serde(rename = "showDeleted")]
-    pub show_deleted: Option<bool>,
-    /// Token obtained from the nextSyncToken field returned on the last page of results from the previous list request. It makes the result of this list request contain only entries that have changed since then. If only read-only fields such as calendar properties or ACLs have changed, the entry won't be returned. All entries deleted and hidden since the previous list request will always be in the result set and it is not allowed to set showDeleted neither showHidden to False.
-    /// To ensure client state consistency minAccessRole query parameter cannot be specified together with nextSyncToken.
-    /// If the syncToken expires, the server will respond with a 410 GONE response code and the client should clear its storage and perform a full synchronization without any syncToken.
-    /// Learn more about incremental synchronization.
-    /// Optional. The default is to return all entries.
-    #[serde(rename = "syncToken")]
-    pub sync_token: Option<String>,
-    /// Token specifying which result page to return. Optional.
-    #[serde(rename = "pageToken")]
-    pub page_token: Option<String>,
-    /// Maximum number of entries returned on one result page. By default the value is 100 entries. The page size can never be larger than 250 entries. Optional.
-    #[serde(rename = "maxResults")]
-    pub max_results: Option<i32>,
-}
-
-impl std::fmt::Display for CalendarListWatchParams {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        if let Some(ref v) = self.min_access_role {
-            write!(
-                f,
-                "&minAccessRole={}",
+                "&showDeleted={}",
                 percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
             )?;
         }
@@ -2110,13 +2028,6 @@
                 percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
             )?;
         }
-        if let Some(ref v) = self.show_deleted {
-            write!(
-                f,
-                "&showDeleted={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
         if let Some(ref v) = self.sync_token {
             write!(
                 f,
@@ -2124,6 +2035,406 @@
                 percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
             )?;
         }
+        Ok(())
+    }
+}
+
+/// Parameters for the `calendars.clear` method.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct CalendarsClearParams {
+    /// General attributes applying to any API call
+    #[serde(flatten)]
+    pub calendar_params: Option<CalendarParams>,
+    /// Calendar identifier. To retrieve calendar IDs call the calendarList.list method. If you want to access the primary calendar of the currently logged in user, use the "primary" keyword.
+    #[serde(rename = "calendarId")]
+    pub calendar_id: String,
+}
+
+impl std::fmt::Display for CalendarsClearParams {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        Ok(())
+    }
+}
+
+/// Parameters for the `calendars.delete` method.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct CalendarsDeleteParams {
+    /// General attributes applying to any API call
+    #[serde(flatten)]
+    pub calendar_params: Option<CalendarParams>,
+    /// Calendar identifier. To retrieve calendar IDs call the calendarList.list method. If you want to access the primary calendar of the currently logged in user, use the "primary" keyword.
+    #[serde(rename = "calendarId")]
+    pub calendar_id: String,
+}
+
+impl std::fmt::Display for CalendarsDeleteParams {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        Ok(())
+    }
+}
+
+/// Parameters for the `calendars.get` method.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct CalendarsGetParams {
+    /// General attributes applying to any API call
+    #[serde(flatten)]
+    pub calendar_params: Option<CalendarParams>,
+    /// Calendar identifier. To retrieve calendar IDs call the calendarList.list method. If you want to access the primary calendar of the currently logged in user, use the "primary" keyword.
+    #[serde(rename = "calendarId")]
+    pub calendar_id: String,
+}
+
+impl std::fmt::Display for CalendarsGetParams {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        Ok(())
+    }
+}
+
+/// Parameters for the `calendars.insert` method.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct CalendarsInsertParams {
+    /// General attributes applying to any API call
+    #[serde(flatten)]
+    pub calendar_params: Option<CalendarParams>,
+}
+
+impl std::fmt::Display for CalendarsInsertParams {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        Ok(())
+    }
+}
+
+/// Parameters for the `calendars.patch` method.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct CalendarsPatchParams {
+    /// General attributes applying to any API call
+    #[serde(flatten)]
+    pub calendar_params: Option<CalendarParams>,
+    /// Calendar identifier. To retrieve calendar IDs call the calendarList.list method. If you want to access the primary calendar of the currently logged in user, use the "primary" keyword.
+    #[serde(rename = "calendarId")]
+    pub calendar_id: String,
+}
+
+impl std::fmt::Display for CalendarsPatchParams {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        Ok(())
+    }
+}
+
+/// Parameters for the `calendars.update` method.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct CalendarsUpdateParams {
+    /// General attributes applying to any API call
+    #[serde(flatten)]
+    pub calendar_params: Option<CalendarParams>,
+    /// Calendar identifier. To retrieve calendar IDs call the calendarList.list method. If you want to access the primary calendar of the currently logged in user, use the "primary" keyword.
+    #[serde(rename = "calendarId")]
+    pub calendar_id: String,
+}
+
+impl std::fmt::Display for CalendarsUpdateParams {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        Ok(())
+    }
+}
+
+/// Parameters for the `channels.stop` method.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct ChannelsStopParams {
+    /// General attributes applying to any API call
+    #[serde(flatten)]
+    pub calendar_params: Option<CalendarParams>,
+}
+
+impl std::fmt::Display for ChannelsStopParams {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        Ok(())
+    }
+}
+
+/// Parameters for the `colors.get` method.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct ColorsGetParams {
+    /// General attributes applying to any API call
+    #[serde(flatten)]
+    pub calendar_params: Option<CalendarParams>,
+}
+
+impl std::fmt::Display for ColorsGetParams {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        Ok(())
+    }
+}
+
+/// Parameters for the `events.delete` method.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct EventsDeleteParams {
+    /// General attributes applying to any API call
+    #[serde(flatten)]
+    pub calendar_params: Option<CalendarParams>,
+    /// Calendar identifier. To retrieve calendar IDs call the calendarList.list method. If you want to access the primary calendar of the currently logged in user, use the "primary" keyword.
+    #[serde(rename = "calendarId")]
+    pub calendar_id: String,
+    /// Event identifier.
+    #[serde(rename = "eventId")]
+    pub event_id: String,
+    /// Deprecated. Please use sendUpdates instead.
+    ///
+    /// Whether to send notifications about the deletion of the event. Note that some emails might still be sent even if you set the value to false. The default is false.
+    #[serde(rename = "sendNotifications")]
+    pub send_notifications: Option<bool>,
+    /// Guests who should receive notifications about the deletion of the event.
+    #[serde(rename = "sendUpdates")]
+    pub send_updates: Option<EventsDeleteSendUpdates>,
+}
+
+impl std::fmt::Display for EventsDeleteParams {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        if let Some(ref v) = self.send_notifications {
+            write!(
+                f,
+                "&sendNotifications={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.send_updates {
+            write!(
+                f,
+                "&sendUpdates={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        Ok(())
+    }
+}
+
+/// Parameters for the `events.get` method.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct EventsGetParams {
+    /// General attributes applying to any API call
+    #[serde(flatten)]
+    pub calendar_params: Option<CalendarParams>,
+    /// Deprecated and ignored. A value will always be returned in the email field for the organizer, creator and attendees, even if no real email address is available (i.e. a generated, non-working value will be provided).
+    #[serde(rename = "alwaysIncludeEmail")]
+    pub always_include_email: Option<bool>,
+    /// Calendar identifier. To retrieve calendar IDs call the calendarList.list method. If you want to access the primary calendar of the currently logged in user, use the "primary" keyword.
+    #[serde(rename = "calendarId")]
+    pub calendar_id: String,
+    /// Event identifier.
+    #[serde(rename = "eventId")]
+    pub event_id: String,
+    /// The maximum number of attendees to include in the response. If there are more than the specified number of attendees, only the participant is returned. Optional.
+    #[serde(rename = "maxAttendees")]
+    pub max_attendees: Option<i32>,
+    /// Time zone used in the response. Optional. The default is the time zone of the calendar.
+    #[serde(rename = "timeZone")]
+    pub time_zone: Option<String>,
+}
+
+impl std::fmt::Display for EventsGetParams {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        if let Some(ref v) = self.always_include_email {
+            write!(
+                f,
+                "&alwaysIncludeEmail={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.max_attendees {
+            write!(
+                f,
+                "&maxAttendees={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.time_zone {
+            write!(
+                f,
+                "&timeZone={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        Ok(())
+    }
+}
+
+/// Parameters for the `events.import` method.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct EventsImportParams {
+    /// General attributes applying to any API call
+    #[serde(flatten)]
+    pub calendar_params: Option<CalendarParams>,
+    /// Calendar identifier. To retrieve calendar IDs call the calendarList.list method. If you want to access the primary calendar of the currently logged in user, use the "primary" keyword.
+    #[serde(rename = "calendarId")]
+    pub calendar_id: String,
+    /// Version number of conference data supported by the API client. Version 0 assumes no conference data support and ignores conference data in the event's body. Version 1 enables support for copying of ConferenceData as well as for creating new conferences using the createRequest field of conferenceData. The default is 0.
+    #[serde(rename = "conferenceDataVersion")]
+    pub conference_data_version: Option<i32>,
+    /// Whether API client performing operation supports event attachments. Optional. The default is False.
+    #[serde(rename = "supportsAttachments")]
+    pub supports_attachments: Option<bool>,
+}
+
+impl std::fmt::Display for EventsImportParams {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        if let Some(ref v) = self.conference_data_version {
+            write!(
+                f,
+                "&conferenceDataVersion={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.supports_attachments {
+            write!(
+                f,
+                "&supportsAttachments={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        Ok(())
+    }
+}
+
+/// Parameters for the `events.insert` method.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct EventsInsertParams {
+    /// General attributes applying to any API call
+    #[serde(flatten)]
+    pub calendar_params: Option<CalendarParams>,
+    /// Calendar identifier. To retrieve calendar IDs call the calendarList.list method. If you want to access the primary calendar of the currently logged in user, use the "primary" keyword.
+    #[serde(rename = "calendarId")]
+    pub calendar_id: String,
+    /// Version number of conference data supported by the API client. Version 0 assumes no conference data support and ignores conference data in the event's body. Version 1 enables support for copying of ConferenceData as well as for creating new conferences using the createRequest field of conferenceData. The default is 0.
+    #[serde(rename = "conferenceDataVersion")]
+    pub conference_data_version: Option<i32>,
+    /// The maximum number of attendees to include in the response. If there are more than the specified number of attendees, only the participant is returned. Optional.
+    #[serde(rename = "maxAttendees")]
+    pub max_attendees: Option<i32>,
+    /// Deprecated. Please use sendUpdates instead.
+    ///
+    /// Whether to send notifications about the creation of the new event. Note that some emails might still be sent even if you set the value to false. The default is false.
+    #[serde(rename = "sendNotifications")]
+    pub send_notifications: Option<bool>,
+    /// Whether to send notifications about the creation of the new event. Note that some emails might still be sent. The default is false.
+    #[serde(rename = "sendUpdates")]
+    pub send_updates: Option<EventsInsertSendUpdates>,
+    /// Whether API client performing operation supports event attachments. Optional. The default is False.
+    #[serde(rename = "supportsAttachments")]
+    pub supports_attachments: Option<bool>,
+}
+
+impl std::fmt::Display for EventsInsertParams {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        if let Some(ref v) = self.conference_data_version {
+            write!(
+                f,
+                "&conferenceDataVersion={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.max_attendees {
+            write!(
+                f,
+                "&maxAttendees={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.send_notifications {
+            write!(
+                f,
+                "&sendNotifications={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.send_updates {
+            write!(
+                f,
+                "&sendUpdates={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.supports_attachments {
+            write!(
+                f,
+                "&supportsAttachments={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        Ok(())
+    }
+}
+
+/// Parameters for the `events.instances` method.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct EventsInstancesParams {
+    /// General attributes applying to any API call
+    #[serde(flatten)]
+    pub calendar_params: Option<CalendarParams>,
+    /// Deprecated and ignored. A value will always be returned in the email field for the organizer, creator and attendees, even if no real email address is available (i.e. a generated, non-working value will be provided).
+    #[serde(rename = "alwaysIncludeEmail")]
+    pub always_include_email: Option<bool>,
+    /// Calendar identifier. To retrieve calendar IDs call the calendarList.list method. If you want to access the primary calendar of the currently logged in user, use the "primary" keyword.
+    #[serde(rename = "calendarId")]
+    pub calendar_id: String,
+    /// Recurring event identifier.
+    #[serde(rename = "eventId")]
+    pub event_id: String,
+    /// The maximum number of attendees to include in the response. If there are more than the specified number of attendees, only the participant is returned. Optional.
+    #[serde(rename = "maxAttendees")]
+    pub max_attendees: Option<i32>,
+    /// Maximum number of events returned on one result page. By default the value is 250 events. The page size can never be larger than 2500 events. Optional.
+    #[serde(rename = "maxResults")]
+    pub max_results: Option<i32>,
+    /// The original start time of the instance in the result. Optional.
+    #[serde(rename = "originalStart")]
+    pub original_start: Option<String>,
+    /// Token specifying which result page to return. Optional.
+    #[serde(rename = "pageToken")]
+    pub page_token: Option<String>,
+    /// Whether to include deleted events (with status equals "cancelled") in the result. Cancelled instances of recurring events will still be included if singleEvents is False. Optional. The default is False.
+    #[serde(rename = "showDeleted")]
+    pub show_deleted: Option<bool>,
+    /// DateTime: Upper bound (exclusive) for an event's start time to filter by. Optional. The default is not to filter by start time. Must be an RFC3339 timestamp with mandatory time zone offset.
+    #[serde(rename = "timeMax")]
+    pub time_max: Option<DateTime<Utc>>,
+    /// DateTime: Lower bound (inclusive) for an event's end time to filter by. Optional. The default is not to filter by end time. Must be an RFC3339 timestamp with mandatory time zone offset.
+    #[serde(rename = "timeMin")]
+    pub time_min: Option<DateTime<Utc>>,
+    /// Time zone used in the response. Optional. The default is the time zone of the calendar.
+    #[serde(rename = "timeZone")]
+    pub time_zone: Option<String>,
+}
+
+impl std::fmt::Display for EventsInstancesParams {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        if let Some(ref v) = self.always_include_email {
+            write!(
+                f,
+                "&alwaysIncludeEmail={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.max_attendees {
+            write!(
+                f,
+                "&maxAttendees={}",
+                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.original_start {
+            write!(
+                f,
+                "&originalStart={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
         if let Some(ref v) = self.page_token {
             write!(
                 f,
@@ -2131,6 +2442,136 @@
                 percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
             )?;
         }
+        if let Some(ref v) = self.show_deleted {
+            write!(
+                f,
+                "&showDeleted={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.time_zone {
+            write!(
+                f,
+                "&timeZone={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.time_max {
+            write!(
+                f,
+                "&timeMax={}",
+                percent_encode(v.to_rfc3339().as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.time_min {
+            write!(
+                f,
+                "&timeMin={}",
+                percent_encode(v.to_rfc3339().as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        Ok(())
+    }
+}
+
+/// Parameters for the `events.list` method.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct EventsListParams {
+    /// General attributes applying to any API call
+    #[serde(flatten)]
+    pub calendar_params: Option<CalendarParams>,
+    /// Deprecated and ignored. A value will always be returned in the email field for the organizer, creator and attendees, even if no real email address is available (i.e. a generated, non-working value will be provided).
+    #[serde(rename = "alwaysIncludeEmail")]
+    pub always_include_email: Option<bool>,
+    /// Calendar identifier. To retrieve calendar IDs call the calendarList.list method. If you want to access the primary calendar of the currently logged in user, use the "primary" keyword.
+    #[serde(rename = "calendarId")]
+    pub calendar_id: String,
+    /// Specifies event ID in the iCalendar format to be included in the response. Optional.
+    #[serde(rename = "iCalUID")]
+    pub i_cal_u_i_d: Option<String>,
+    /// The maximum number of attendees to include in the response. If there are more than the specified number of attendees, only the participant is returned. Optional.
+    #[serde(rename = "maxAttendees")]
+    pub max_attendees: Option<i32>,
+    /// Maximum number of events returned on one result page. The number of events in the resulting page may be less than this value, or none at all, even if there are more events matching the query. Incomplete pages can be detected by a non-empty nextPageToken field in the response. By default the value is 250 events. The page size can never be larger than 2500 events. Optional.
+    #[serde(rename = "maxResults")]
+    pub max_results: Option<i32>,
+    /// The order of the events returned in the result. Optional. The default is an unspecified, stable order.
+    #[serde(rename = "orderBy")]
+    pub order_by: Option<EventsListOrderBy>,
+    /// Token specifying which result page to return. Optional.
+    #[serde(rename = "pageToken")]
+    pub page_token: Option<String>,
+    /// Extended properties constraint specified as propertyName=value. Matches only private properties. This parameter might be repeated multiple times to return events that match all given constraints.
+    #[serde(rename = "privateExtendedProperty")]
+    pub private_extended_property: Option<String>,
+    /// Free text search terms to find events that match these terms in any field, except for extended properties. Optional.
+    #[serde(rename = "q")]
+    pub q: Option<String>,
+    /// Extended properties constraint specified as propertyName=value. Matches only shared properties. This parameter might be repeated multiple times to return events that match all given constraints.
+    #[serde(rename = "sharedExtendedProperty")]
+    pub shared_extended_property: Option<String>,
+    /// Whether to include deleted events (with status equals "cancelled") in the result. Cancelled instances of recurring events (but not the underlying recurring event) will still be included if showDeleted and singleEvents are both False. If showDeleted and singleEvents are both True, only single instances of deleted events (but not the underlying recurring events) are returned. Optional. The default is False.
+    #[serde(rename = "showDeleted")]
+    pub show_deleted: Option<bool>,
+    /// Whether to include hidden invitations in the result. Optional. The default is False.
+    #[serde(rename = "showHiddenInvitations")]
+    pub show_hidden_invitations: Option<bool>,
+    /// Whether to expand recurring events into instances and only return single one-off events and instances of recurring events, but not the underlying recurring events themselves. Optional. The default is False.
+    #[serde(rename = "singleEvents")]
+    pub single_events: Option<bool>,
+    /// Token obtained from the nextSyncToken field returned on the last page of results from the previous list request. It makes the result of this list request contain only entries that have changed since then. All events deleted since the previous list request will always be in the result set and it is not allowed to set showDeleted to False.
+    /// There are several query parameters that cannot be specified together with nextSyncToken to ensure consistency of the client state.
+    ///
+    /// These are:
+    /// - iCalUID
+    /// - orderBy
+    /// - privateExtendedProperty
+    /// - q
+    /// - sharedExtendedProperty
+    /// - timeMin
+    /// - timeMax
+    /// - updatedMin If the syncToken expires, the server will respond with a 410 GONE response code and the client should clear its storage and perform a full synchronization without any syncToken.
+    /// Learn more about incremental synchronization.
+    /// Optional. The default is to return all entries.
+    #[serde(rename = "syncToken")]
+    pub sync_token: Option<String>,
+    /// DateTime: Upper bound (exclusive) for an event's start time to filter by. Optional. The default is not to filter by start time. Must be an RFC3339 timestamp with mandatory time zone offset, for example, 2011-06-03T10:00:00-07:00, 2011-06-03T10:00:00Z. Milliseconds may be provided but are ignored. If timeMin is set, timeMax must be greater than timeMin.
+    #[serde(rename = "timeMax")]
+    pub time_max: Option<DateTime<Utc>>,
+    /// DateTime: Lower bound (exclusive) for an event's end time to filter by. Optional. The default is not to filter by end time. Must be an RFC3339 timestamp with mandatory time zone offset, for example, 2011-06-03T10:00:00-07:00, 2011-06-03T10:00:00Z. Milliseconds may be provided but are ignored. If timeMax is set, timeMin must be smaller than timeMax.
+    #[serde(rename = "timeMin")]
+    pub time_min: Option<DateTime<Utc>>,
+    /// Time zone used in the response. Optional. The default is the time zone of the calendar.
+    #[serde(rename = "timeZone")]
+    pub time_zone: Option<String>,
+    /// DateTime: Lower bound for an event's last modification time (as a RFC3339 timestamp) to filter by. When specified, entries deleted since this time will always be included regardless of showDeleted. Optional. The default is not to filter by last modification time.
+    #[serde(rename = "updatedMin")]
+    pub updated_min: Option<DateTime<Utc>>,
+}
+
+impl std::fmt::Display for EventsListParams {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        if let Some(ref v) = self.always_include_email {
+            write!(
+                f,
+                "&alwaysIncludeEmail={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.i_cal_u_i_d {
+            write!(
+                f,
+                "&iCalUID={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.max_attendees {
+            write!(
+                f,
+                "&maxAttendees={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
         if let Some(ref v) = self.max_results {
             write!(
                 f,
@@ -2138,80 +2579,10 @@
                 percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
             )?;
         }
-        Ok(())
-    }
-}
-
-/// Parameters for the `calendarList.update` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct CalendarListUpdateParams {
-    /// General attributes applying to any API call
-    #[serde(flatten)]
-    pub calendar_params: Option<CalendarParams>,
-    /// Whether to use the foregroundColor and backgroundColor fields to write the calendar colors (RGB). If this feature is used, the index-based colorId field will be set to the best matching option automatically. Optional. The default is False.
-    #[serde(rename = "colorRgbFormat")]
-    pub color_rgb_format: Option<bool>,
-    /// Calendar identifier. To retrieve calendar IDs call the calendarList.list method. If you want to access the primary calendar of the currently logged in user, use the "primary" keyword.
-    #[serde(rename = "calendarId")]
-    pub calendar_id: String,
-}
-
-impl std::fmt::Display for CalendarListUpdateParams {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        if let Some(ref v) = self.color_rgb_format {
+        if let Some(ref v) = self.order_by {
             write!(
                 f,
-                "&colorRgbFormat={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        Ok(())
-    }
-}
-
-/// Parameters for the `calendarList.delete` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct CalendarListDeleteParams {
-    /// General attributes applying to any API call
-    #[serde(flatten)]
-    pub calendar_params: Option<CalendarParams>,
-    /// Calendar identifier. To retrieve calendar IDs call the calendarList.list method. If you want to access the primary calendar of the currently logged in user, use the "primary" keyword.
-    #[serde(rename = "calendarId")]
-    pub calendar_id: String,
-}
-
-impl std::fmt::Display for CalendarListDeleteParams {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        Ok(())
-    }
-}
-
-/// Parameters for the `settings.watch` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct SettingsWatchParams {
-    /// General attributes applying to any API call
-    #[serde(flatten)]
-    pub calendar_params: Option<CalendarParams>,
-    /// Token obtained from the nextSyncToken field returned on the last page of results from the previous list request. It makes the result of this list request contain only entries that have changed since then.
-    /// If the syncToken expires, the server will respond with a 410 GONE response code and the client should clear its storage and perform a full synchronization without any syncToken.
-    /// Learn more about incremental synchronization.
-    /// Optional. The default is to return all entries.
-    #[serde(rename = "syncToken")]
-    pub sync_token: Option<String>,
-    /// Token specifying which result page to return. Optional.
-    #[serde(rename = "pageToken")]
-    pub page_token: Option<String>,
-    /// Maximum number of entries returned on one result page. By default the value is 100 entries. The page size can never be larger than 250 entries. Optional.
-    #[serde(rename = "maxResults")]
-    pub max_results: Option<i32>,
-}
-
-impl std::fmt::Display for SettingsWatchParams {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        if let Some(ref v) = self.sync_token {
-            write!(
-                f,
-                "&syncToken={}",
+                "&orderBy={}",
                 percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
             )?;
         }
@@ -2222,6 +2593,447 @@
                 percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
             )?;
         }
+        if let Some(ref v) = self.private_extended_property {
+            write!(
+                f,
+                "&privateExtendedProperty={}",
+                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.shared_extended_property {
+            write!(
+                f,
+                "&sharedExtendedProperty={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.show_deleted {
+            write!(
+                f,
+                "&showDeleted={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.show_hidden_invitations {
+            write!(
+                f,
+                "&showHiddenInvitations={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.single_events {
+            write!(
+                f,
+                "&singleEvents={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.sync_token {
+            write!(
+                f,
+                "&syncToken={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.time_zone {
+            write!(
+                f,
+                "&timeZone={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.time_max {
+            write!(
+                f,
+                "&timeMax={}",
+                percent_encode(v.to_rfc3339().as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.time_min {
+            write!(
+                f,
+                "&timeMin={}",
+                percent_encode(v.to_rfc3339().as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.updated_min {
+            write!(
+                f,
+                "&updatedMin={}",
+                percent_encode(v.to_rfc3339().as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        Ok(())
+    }
+}
+
+/// Parameters for the `events.move` method.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct EventsMoveParams {
+    /// General attributes applying to any API call
+    #[serde(flatten)]
+    pub calendar_params: Option<CalendarParams>,
+    /// Calendar identifier of the source calendar where the event currently is on.
+    #[serde(rename = "calendarId")]
+    pub calendar_id: String,
+    /// Calendar identifier of the target calendar where the event is to be moved to.
+    #[serde(rename = "destination")]
+    pub destination: String,
+    /// Event identifier.
+    #[serde(rename = "eventId")]
+    pub event_id: String,
+    /// Deprecated. Please use sendUpdates instead.
+    ///
+    /// Whether to send notifications about the change of the event's organizer. Note that some emails might still be sent even if you set the value to false. The default is false.
+    #[serde(rename = "sendNotifications")]
+    pub send_notifications: Option<bool>,
+    /// Guests who should receive notifications about the change of the event's organizer.
+    #[serde(rename = "sendUpdates")]
+    pub send_updates: Option<EventsMoveSendUpdates>,
+}
+
+impl std::fmt::Display for EventsMoveParams {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        write!(
+            f,
+            "&destination={}",
+            percent_encode(format!("{}", self.destination).as_bytes(), NON_ALPHANUMERIC)
+                .to_string()
+        )?;
+        if let Some(ref v) = self.send_notifications {
+            write!(
+                f,
+                "&sendNotifications={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.send_updates {
+            write!(
+                f,
+                "&sendUpdates={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        Ok(())
+    }
+}
+
+/// Parameters for the `events.patch` method.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct EventsPatchParams {
+    /// General attributes applying to any API call
+    #[serde(flatten)]
+    pub calendar_params: Option<CalendarParams>,
+    /// Deprecated and ignored. A value will always be returned in the email field for the organizer, creator and attendees, even if no real email address is available (i.e. a generated, non-working value will be provided).
+    #[serde(rename = "alwaysIncludeEmail")]
+    pub always_include_email: Option<bool>,
+    /// Calendar identifier. To retrieve calendar IDs call the calendarList.list method. If you want to access the primary calendar of the currently logged in user, use the "primary" keyword.
+    #[serde(rename = "calendarId")]
+    pub calendar_id: String,
+    /// Version number of conference data supported by the API client. Version 0 assumes no conference data support and ignores conference data in the event's body. Version 1 enables support for copying of ConferenceData as well as for creating new conferences using the createRequest field of conferenceData. The default is 0.
+    #[serde(rename = "conferenceDataVersion")]
+    pub conference_data_version: Option<i32>,
+    /// Event identifier.
+    #[serde(rename = "eventId")]
+    pub event_id: String,
+    /// The maximum number of attendees to include in the response. If there are more than the specified number of attendees, only the participant is returned. Optional.
+    #[serde(rename = "maxAttendees")]
+    pub max_attendees: Option<i32>,
+    /// Deprecated. Please use sendUpdates instead.
+    ///
+    /// Whether to send notifications about the event update (for example, description changes, etc.). Note that some emails might still be sent even if you set the value to false. The default is false.
+    #[serde(rename = "sendNotifications")]
+    pub send_notifications: Option<bool>,
+    /// Guests who should receive notifications about the event update (for example, title changes, etc.).
+    #[serde(rename = "sendUpdates")]
+    pub send_updates: Option<EventsPatchSendUpdates>,
+    /// Whether API client performing operation supports event attachments. Optional. The default is False.
+    #[serde(rename = "supportsAttachments")]
+    pub supports_attachments: Option<bool>,
+}
+
+impl std::fmt::Display for EventsPatchParams {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        if let Some(ref v) = self.always_include_email {
+            write!(
+                f,
+                "&alwaysIncludeEmail={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.conference_data_version {
+            write!(
+                f,
+                "&conferenceDataVersion={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.max_attendees {
+            write!(
+                f,
+                "&maxAttendees={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.send_notifications {
+            write!(
+                f,
+                "&sendNotifications={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.send_updates {
+            write!(
+                f,
+                "&sendUpdates={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.supports_attachments {
+            write!(
+                f,
+                "&supportsAttachments={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        Ok(())
+    }
+}
+
+/// Parameters for the `events.quickAdd` method.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct EventsQuickAddParams {
+    /// General attributes applying to any API call
+    #[serde(flatten)]
+    pub calendar_params: Option<CalendarParams>,
+    /// Calendar identifier. To retrieve calendar IDs call the calendarList.list method. If you want to access the primary calendar of the currently logged in user, use the "primary" keyword.
+    #[serde(rename = "calendarId")]
+    pub calendar_id: String,
+    /// Deprecated. Please use sendUpdates instead.
+    ///
+    /// Whether to send notifications about the creation of the event. Note that some emails might still be sent even if you set the value to false. The default is false.
+    #[serde(rename = "sendNotifications")]
+    pub send_notifications: Option<bool>,
+    /// Guests who should receive notifications about the creation of the new event.
+    #[serde(rename = "sendUpdates")]
+    pub send_updates: Option<EventsQuickAddSendUpdates>,
+    /// The text describing the event to be created.
+    #[serde(rename = "text")]
+    pub text: String,
+}
+
+impl std::fmt::Display for EventsQuickAddParams {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        write!(
+            f,
+            "&text={}",
+            percent_encode(format!("{}", self.text).as_bytes(), NON_ALPHANUMERIC).to_string()
+        )?;
+        if let Some(ref v) = self.send_notifications {
+            write!(
+                f,
+                "&sendNotifications={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.send_updates {
+            write!(
+                f,
+                "&sendUpdates={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        Ok(())
+    }
+}
+
+/// Parameters for the `events.update` method.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct EventsUpdateParams {
+    /// General attributes applying to any API call
+    #[serde(flatten)]
+    pub calendar_params: Option<CalendarParams>,
+    /// Deprecated and ignored. A value will always be returned in the email field for the organizer, creator and attendees, even if no real email address is available (i.e. a generated, non-working value will be provided).
+    #[serde(rename = "alwaysIncludeEmail")]
+    pub always_include_email: Option<bool>,
+    /// Calendar identifier. To retrieve calendar IDs call the calendarList.list method. If you want to access the primary calendar of the currently logged in user, use the "primary" keyword.
+    #[serde(rename = "calendarId")]
+    pub calendar_id: String,
+    /// Version number of conference data supported by the API client. Version 0 assumes no conference data support and ignores conference data in the event's body. Version 1 enables support for copying of ConferenceData as well as for creating new conferences using the createRequest field of conferenceData. The default is 0.
+    #[serde(rename = "conferenceDataVersion")]
+    pub conference_data_version: Option<i32>,
+    /// Event identifier.
+    #[serde(rename = "eventId")]
+    pub event_id: String,
+    /// The maximum number of attendees to include in the response. If there are more than the specified number of attendees, only the participant is returned. Optional.
+    #[serde(rename = "maxAttendees")]
+    pub max_attendees: Option<i32>,
+    /// Deprecated. Please use sendUpdates instead.
+    ///
+    /// Whether to send notifications about the event update (for example, description changes, etc.). Note that some emails might still be sent even if you set the value to false. The default is false.
+    #[serde(rename = "sendNotifications")]
+    pub send_notifications: Option<bool>,
+    /// Guests who should receive notifications about the event update (for example, title changes, etc.).
+    #[serde(rename = "sendUpdates")]
+    pub send_updates: Option<EventsUpdateSendUpdates>,
+    /// Whether API client performing operation supports event attachments. Optional. The default is False.
+    #[serde(rename = "supportsAttachments")]
+    pub supports_attachments: Option<bool>,
+}
+
+impl std::fmt::Display for EventsUpdateParams {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        if let Some(ref v) = self.always_include_email {
+            write!(
+                f,
+                "&alwaysIncludeEmail={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.conference_data_version {
+            write!(
+                f,
+                "&conferenceDataVersion={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.max_attendees {
+            write!(
+                f,
+                "&maxAttendees={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.send_notifications {
+            write!(
+                f,
+                "&sendNotifications={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.send_updates {
+            write!(
+                f,
+                "&sendUpdates={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.supports_attachments {
+            write!(
+                f,
+                "&supportsAttachments={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        Ok(())
+    }
+}
+
+/// Parameters for the `events.watch` method.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct EventsWatchParams {
+    /// General attributes applying to any API call
+    #[serde(flatten)]
+    pub calendar_params: Option<CalendarParams>,
+    /// Deprecated and ignored. A value will always be returned in the email field for the organizer, creator and attendees, even if no real email address is available (i.e. a generated, non-working value will be provided).
+    #[serde(rename = "alwaysIncludeEmail")]
+    pub always_include_email: Option<bool>,
+    /// Calendar identifier. To retrieve calendar IDs call the calendarList.list method. If you want to access the primary calendar of the currently logged in user, use the "primary" keyword.
+    #[serde(rename = "calendarId")]
+    pub calendar_id: String,
+    /// Specifies event ID in the iCalendar format to be included in the response. Optional.
+    #[serde(rename = "iCalUID")]
+    pub i_cal_u_i_d: Option<String>,
+    /// The maximum number of attendees to include in the response. If there are more than the specified number of attendees, only the participant is returned. Optional.
+    #[serde(rename = "maxAttendees")]
+    pub max_attendees: Option<i32>,
+    /// Maximum number of events returned on one result page. The number of events in the resulting page may be less than this value, or none at all, even if there are more events matching the query. Incomplete pages can be detected by a non-empty nextPageToken field in the response. By default the value is 250 events. The page size can never be larger than 2500 events. Optional.
+    #[serde(rename = "maxResults")]
+    pub max_results: Option<i32>,
+    /// The order of the events returned in the result. Optional. The default is an unspecified, stable order.
+    #[serde(rename = "orderBy")]
+    pub order_by: Option<EventsWatchOrderBy>,
+    /// Token specifying which result page to return. Optional.
+    #[serde(rename = "pageToken")]
+    pub page_token: Option<String>,
+    /// Extended properties constraint specified as propertyName=value. Matches only private properties. This parameter might be repeated multiple times to return events that match all given constraints.
+    #[serde(rename = "privateExtendedProperty")]
+    pub private_extended_property: Option<String>,
+    /// Free text search terms to find events that match these terms in any field, except for extended properties. Optional.
+    #[serde(rename = "q")]
+    pub q: Option<String>,
+    /// Extended properties constraint specified as propertyName=value. Matches only shared properties. This parameter might be repeated multiple times to return events that match all given constraints.
+    #[serde(rename = "sharedExtendedProperty")]
+    pub shared_extended_property: Option<String>,
+    /// Whether to include deleted events (with status equals "cancelled") in the result. Cancelled instances of recurring events (but not the underlying recurring event) will still be included if showDeleted and singleEvents are both False. If showDeleted and singleEvents are both True, only single instances of deleted events (but not the underlying recurring events) are returned. Optional. The default is False.
+    #[serde(rename = "showDeleted")]
+    pub show_deleted: Option<bool>,
+    /// Whether to include hidden invitations in the result. Optional. The default is False.
+    #[serde(rename = "showHiddenInvitations")]
+    pub show_hidden_invitations: Option<bool>,
+    /// Whether to expand recurring events into instances and only return single one-off events and instances of recurring events, but not the underlying recurring events themselves. Optional. The default is False.
+    #[serde(rename = "singleEvents")]
+    pub single_events: Option<bool>,
+    /// Token obtained from the nextSyncToken field returned on the last page of results from the previous list request. It makes the result of this list request contain only entries that have changed since then. All events deleted since the previous list request will always be in the result set and it is not allowed to set showDeleted to False.
+    /// There are several query parameters that cannot be specified together with nextSyncToken to ensure consistency of the client state.
+    ///
+    /// These are:
+    /// - iCalUID
+    /// - orderBy
+    /// - privateExtendedProperty
+    /// - q
+    /// - sharedExtendedProperty
+    /// - timeMin
+    /// - timeMax
+    /// - updatedMin If the syncToken expires, the server will respond with a 410 GONE response code and the client should clear its storage and perform a full synchronization without any syncToken.
+    /// Learn more about incremental synchronization.
+    /// Optional. The default is to return all entries.
+    #[serde(rename = "syncToken")]
+    pub sync_token: Option<String>,
+    /// DateTime: Upper bound (exclusive) for an event's start time to filter by. Optional. The default is not to filter by start time. Must be an RFC3339 timestamp with mandatory time zone offset, for example, 2011-06-03T10:00:00-07:00, 2011-06-03T10:00:00Z. Milliseconds may be provided but are ignored. If timeMin is set, timeMax must be greater than timeMin.
+    #[serde(rename = "timeMax")]
+    pub time_max: Option<DateTime<Utc>>,
+    /// DateTime: Lower bound (exclusive) for an event's end time to filter by. Optional. The default is not to filter by end time. Must be an RFC3339 timestamp with mandatory time zone offset, for example, 2011-06-03T10:00:00-07:00, 2011-06-03T10:00:00Z. Milliseconds may be provided but are ignored. If timeMax is set, timeMin must be smaller than timeMax.
+    #[serde(rename = "timeMin")]
+    pub time_min: Option<DateTime<Utc>>,
+    /// Time zone used in the response. Optional. The default is the time zone of the calendar.
+    #[serde(rename = "timeZone")]
+    pub time_zone: Option<String>,
+    /// DateTime: Lower bound for an event's last modification time (as a RFC3339 timestamp) to filter by. When specified, entries deleted since this time will always be included regardless of showDeleted. Optional. The default is not to filter by last modification time.
+    #[serde(rename = "updatedMin")]
+    pub updated_min: Option<DateTime<Utc>>,
+}
+
+impl std::fmt::Display for EventsWatchParams {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        if let Some(ref v) = self.always_include_email {
+            write!(
+                f,
+                "&alwaysIncludeEmail={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.i_cal_u_i_d {
+            write!(
+                f,
+                "&iCalUID={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.max_attendees {
+            write!(
+                f,
+                "&maxAttendees={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
         if let Some(ref v) = self.max_results {
             write!(
                 f,
@@ -2229,6 +3041,128 @@
                 percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
             )?;
         }
+        if let Some(ref v) = self.order_by {
+            write!(
+                f,
+                "&orderBy={}",
+                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.private_extended_property {
+            write!(
+                f,
+                "&privateExtendedProperty={}",
+                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.shared_extended_property {
+            write!(
+                f,
+                "&sharedExtendedProperty={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.show_deleted {
+            write!(
+                f,
+                "&showDeleted={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.show_hidden_invitations {
+            write!(
+                f,
+                "&showHiddenInvitations={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.single_events {
+            write!(
+                f,
+                "&singleEvents={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.sync_token {
+            write!(
+                f,
+                "&syncToken={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.time_zone {
+            write!(
+                f,
+                "&timeZone={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.time_max {
+            write!(
+                f,
+                "&timeMax={}",
+                percent_encode(v.to_rfc3339().as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.time_min {
+            write!(
+                f,
+                "&timeMin={}",
+                percent_encode(v.to_rfc3339().as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.updated_min {
+            write!(
+                f,
+                "&updatedMin={}",
+                percent_encode(v.to_rfc3339().as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        Ok(())
+    }
+}
+
+/// Parameters for the `freebusy.query` method.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct FreebusyQueryParams {
+    /// General attributes applying to any API call
+    #[serde(flatten)]
+    pub calendar_params: Option<CalendarParams>,
+}
+
+impl std::fmt::Display for FreebusyQueryParams {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        Ok(())
+    }
+}
+
+/// Parameters for the `settings.get` method.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct SettingsGetParams {
+    /// General attributes applying to any API call
+    #[serde(flatten)]
+    pub calendar_params: Option<CalendarParams>,
+    /// The id of the user setting.
+    #[serde(rename = "setting")]
+    pub setting: String,
+}
+
+impl std::fmt::Display for SettingsGetParams {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
         Ok(())
     }
 }
@@ -2280,80 +3214,28 @@
     }
 }
 
-/// Parameters for the `settings.get` method.
+/// Parameters for the `settings.watch` method.
 #[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct SettingsGetParams {
-    /// General attributes applying to any API call
-    #[serde(flatten)]
-    pub calendar_params: Option<CalendarParams>,
-    /// The id of the user setting.
-    #[serde(rename = "setting")]
-    pub setting: String,
-}
-
-impl std::fmt::Display for SettingsGetParams {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        Ok(())
-    }
-}
-
-/// Parameters for the `events.instances` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct EventsInstancesParams {
+pub struct SettingsWatchParams {
     /// General attributes applying to any API call
     #[serde(flatten)]
     pub calendar_params: Option<CalendarParams>,
-    /// Time zone used in the response. Optional. The default is the time zone of the calendar.
-    #[serde(rename = "timeZone")]
-    pub time_zone: Option<String>,
-    /// DateTime: Upper bound (exclusive) for an event's start time to filter by. Optional. The default is not to filter by start time. Must be an RFC3339 timestamp with mandatory time zone offset.
-    #[serde(rename = "timeMax")]
-    pub time_max: Option<DateTime<Utc>>,
-    /// Recurring event identifier.
-    #[serde(rename = "eventId")]
-    pub event_id: String,
-    /// The original start time of the instance in the result. Optional.
-    #[serde(rename = "originalStart")]
-    pub original_start: Option<String>,
-    /// Calendar identifier. To retrieve calendar IDs call the calendarList.list method. If you want to access the primary calendar of the currently logged in user, use the "primary" keyword.
-    #[serde(rename = "calendarId")]
-    pub calendar_id: String,
-    /// Maximum number of events returned on one result page. By default the value is 250 events. The page size can never be larger than 2500 events. Optional.
+    /// Maximum number of entries returned on one result page. By default the value is 100 entries. The page size can never be larger than 250 entries. Optional.
     #[serde(rename = "maxResults")]
     pub max_results: Option<i32>,
-    /// The maximum number of attendees to include in the response. If there are more than the specified number of attendees, only the participant is returned. Optional.
-    #[serde(rename = "maxAttendees")]
-    pub max_attendees: Option<i32>,
-    /// Whether to include deleted events (with status equals "cancelled") in the result. Cancelled instances of recurring events will still be included if singleEvents is False. Optional. The default is False.
-    #[serde(rename = "showDeleted")]
-    pub show_deleted: Option<bool>,
-    /// Deprecated and ignored. A value will always be returned in the email field for the organizer, creator and attendees, even if no real email address is available (i.e. a generated, non-working value will be provided).
-    #[serde(rename = "alwaysIncludeEmail")]
-    pub always_include_email: Option<bool>,
     /// Token specifying which result page to return. Optional.
     #[serde(rename = "pageToken")]
     pub page_token: Option<String>,
-    /// DateTime: Lower bound (inclusive) for an event's end time to filter by. Optional. The default is not to filter by end time. Must be an RFC3339 timestamp with mandatory time zone offset.
-    #[serde(rename = "timeMin")]
-    pub time_min: Option<DateTime<Utc>>,
+    /// Token obtained from the nextSyncToken field returned on the last page of results from the previous list request. It makes the result of this list request contain only entries that have changed since then.
+    /// If the syncToken expires, the server will respond with a 410 GONE response code and the client should clear its storage and perform a full synchronization without any syncToken.
+    /// Learn more about incremental synchronization.
+    /// Optional. The default is to return all entries.
+    #[serde(rename = "syncToken")]
+    pub sync_token: Option<String>,
 }
 
-impl std::fmt::Display for EventsInstancesParams {
+impl std::fmt::Display for SettingsWatchParams {
     fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        if let Some(ref v) = self.time_zone {
-            write!(
-                f,
-                "&timeZone={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.original_start {
-            write!(
-                f,
-                "&originalStart={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
         if let Some(ref v) = self.max_results {
             write!(
                 f,
@@ -2361,27 +3243,6 @@
                 percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
             )?;
         }
-        if let Some(ref v) = self.max_attendees {
-            write!(
-                f,
-                "&maxAttendees={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.show_deleted {
-            write!(
-                f,
-                "&showDeleted={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.always_include_email {
-            write!(
-                f,
-                "&alwaysIncludeEmail={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
         if let Some(ref v) = self.page_token {
             write!(
                 f,
@@ -2389,394 +3250,6 @@
                 percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
             )?;
         }
-        if let Some(ref v) = self.time_max {
-            write!(
-                f,
-                "&timeMax={}",
-                percent_encode(v.to_rfc3339().as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.time_min {
-            write!(
-                f,
-                "&timeMin={}",
-                percent_encode(v.to_rfc3339().as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        Ok(())
-    }
-}
-
-/// Parameters for the `events.move` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct EventsMoveParams {
-    /// General attributes applying to any API call
-    #[serde(flatten)]
-    pub calendar_params: Option<CalendarParams>,
-    /// Guests who should receive notifications about the change of the event's organizer.
-    #[serde(rename = "sendUpdates")]
-    pub send_updates: Option<EventsMoveSendUpdates>,
-    /// Calendar identifier of the target calendar where the event is to be moved to.
-    #[serde(rename = "destination")]
-    pub destination: String,
-    /// Event identifier.
-    #[serde(rename = "eventId")]
-    pub event_id: String,
-    /// Calendar identifier of the source calendar where the event currently is on.
-    #[serde(rename = "calendarId")]
-    pub calendar_id: String,
-    /// Deprecated. Please use sendUpdates instead.
-    ///
-    /// Whether to send notifications about the change of the event's organizer. Note that some emails might still be sent even if you set the value to false. The default is false.
-    #[serde(rename = "sendNotifications")]
-    pub send_notifications: Option<bool>,
-}
-
-impl std::fmt::Display for EventsMoveParams {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        write!(
-            f,
-            "&destination={}",
-            percent_encode(format!("{}", self.destination).as_bytes(), NON_ALPHANUMERIC)
-                .to_string()
-        )?;
-        if let Some(ref v) = self.send_updates {
-            write!(
-                f,
-                "&sendUpdates={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.send_notifications {
-            write!(
-                f,
-                "&sendNotifications={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        Ok(())
-    }
-}
-
-/// Parameters for the `events.watch` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct EventsWatchParams {
-    /// General attributes applying to any API call
-    #[serde(flatten)]
-    pub calendar_params: Option<CalendarParams>,
-    /// Token specifying which result page to return. Optional.
-    #[serde(rename = "pageToken")]
-    pub page_token: Option<String>,
-    /// Whether to include deleted events (with status equals "cancelled") in the result. Cancelled instances of recurring events (but not the underlying recurring event) will still be included if showDeleted and singleEvents are both False. If showDeleted and singleEvents are both True, only single instances of deleted events (but not the underlying recurring events) are returned. Optional. The default is False.
-    #[serde(rename = "showDeleted")]
-    pub show_deleted: Option<bool>,
-    /// Free text search terms to find events that match these terms in any field, except for extended properties. Optional.
-    #[serde(rename = "q")]
-    pub q: Option<String>,
-    /// Deprecated and ignored. A value will always be returned in the email field for the organizer, creator and attendees, even if no real email address is available (i.e. a generated, non-working value will be provided).
-    #[serde(rename = "alwaysIncludeEmail")]
-    pub always_include_email: Option<bool>,
-    /// The maximum number of attendees to include in the response. If there are more than the specified number of attendees, only the participant is returned. Optional.
-    #[serde(rename = "maxAttendees")]
-    pub max_attendees: Option<i32>,
-    /// Time zone used in the response. Optional. The default is the time zone of the calendar.
-    #[serde(rename = "timeZone")]
-    pub time_zone: Option<String>,
-    /// DateTime: Upper bound (exclusive) for an event's start time to filter by. Optional. The default is not to filter by start time. Must be an RFC3339 timestamp with mandatory time zone offset, for example, 2011-06-03T10:00:00-07:00, 2011-06-03T10:00:00Z. Milliseconds may be provided but are ignored. If timeMin is set, timeMax must be greater than timeMin.
-    #[serde(rename = "timeMax")]
-    pub time_max: Option<DateTime<Utc>>,
-    /// DateTime: Lower bound for an event's last modification time (as a RFC3339 timestamp) to filter by. When specified, entries deleted since this time will always be included regardless of showDeleted. Optional. The default is not to filter by last modification time.
-    #[serde(rename = "updatedMin")]
-    pub updated_min: Option<DateTime<Utc>>,
-    /// Whether to include hidden invitations in the result. Optional. The default is False.
-    #[serde(rename = "showHiddenInvitations")]
-    pub show_hidden_invitations: Option<bool>,
-    /// Extended properties constraint specified as propertyName=value. Matches only shared properties. This parameter might be repeated multiple times to return events that match all given constraints.
-    #[serde(rename = "sharedExtendedProperty")]
-    pub shared_extended_property: Option<String>,
-    /// Maximum number of events returned on one result page. The number of events in the resulting page may be less than this value, or none at all, even if there are more events matching the query. Incomplete pages can be detected by a non-empty nextPageToken field in the response. By default the value is 250 events. The page size can never be larger than 2500 events. Optional.
-    #[serde(rename = "maxResults")]
-    pub max_results: Option<i32>,
-    /// Specifies event ID in the iCalendar format to be included in the response. Optional.
-    #[serde(rename = "iCalUID")]
-    pub i_cal_u_i_d: Option<String>,
-    /// Whether to expand recurring events into instances and only return single one-off events and instances of recurring events, but not the underlying recurring events themselves. Optional. The default is False.
-    #[serde(rename = "singleEvents")]
-    pub single_events: Option<bool>,
-    /// DateTime: Lower bound (exclusive) for an event's end time to filter by. Optional. The default is not to filter by end time. Must be an RFC3339 timestamp with mandatory time zone offset, for example, 2011-06-03T10:00:00-07:00, 2011-06-03T10:00:00Z. Milliseconds may be provided but are ignored. If timeMax is set, timeMin must be smaller than timeMax.
-    #[serde(rename = "timeMin")]
-    pub time_min: Option<DateTime<Utc>>,
-    /// Token obtained from the nextSyncToken field returned on the last page of results from the previous list request. It makes the result of this list request contain only entries that have changed since then. All events deleted since the previous list request will always be in the result set and it is not allowed to set showDeleted to False.
-    /// There are several query parameters that cannot be specified together with nextSyncToken to ensure consistency of the client state.
-    ///
-    /// These are:
-    /// - iCalUID
-    /// - orderBy
-    /// - privateExtendedProperty
-    /// - q
-    /// - sharedExtendedProperty
-    /// - timeMin
-    /// - timeMax
-    /// - updatedMin If the syncToken expires, the server will respond with a 410 GONE response code and the client should clear its storage and perform a full synchronization without any syncToken.
-    /// Learn more about incremental synchronization.
-    /// Optional. The default is to return all entries.
-    #[serde(rename = "syncToken")]
-    pub sync_token: Option<String>,
-    /// Calendar identifier. To retrieve calendar IDs call the calendarList.list method. If you want to access the primary calendar of the currently logged in user, use the "primary" keyword.
-    #[serde(rename = "calendarId")]
-    pub calendar_id: String,
-    /// The order of the events returned in the result. Optional. The default is an unspecified, stable order.
-    #[serde(rename = "orderBy")]
-    pub order_by: Option<EventsWatchOrderBy>,
-    /// Extended properties constraint specified as propertyName=value. Matches only private properties. This parameter might be repeated multiple times to return events that match all given constraints.
-    #[serde(rename = "privateExtendedProperty")]
-    pub private_extended_property: Option<String>,
-}
-
-impl std::fmt::Display for EventsWatchParams {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        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.show_deleted {
-            write!(
-                f,
-                "&showDeleted={}",
-                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.always_include_email {
-            write!(
-                f,
-                "&alwaysIncludeEmail={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.max_attendees {
-            write!(
-                f,
-                "&maxAttendees={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.time_zone {
-            write!(
-                f,
-                "&timeZone={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.show_hidden_invitations {
-            write!(
-                f,
-                "&showHiddenInvitations={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.shared_extended_property {
-            write!(
-                f,
-                "&sharedExtendedProperty={}",
-                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.i_cal_u_i_d {
-            write!(
-                f,
-                "&iCalUID={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.single_events {
-            write!(
-                f,
-                "&singleEvents={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.sync_token {
-            write!(
-                f,
-                "&syncToken={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.order_by {
-            write!(
-                f,
-                "&orderBy={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.private_extended_property {
-            write!(
-                f,
-                "&privateExtendedProperty={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.time_max {
-            write!(
-                f,
-                "&timeMax={}",
-                percent_encode(v.to_rfc3339().as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.updated_min {
-            write!(
-                f,
-                "&updatedMin={}",
-                percent_encode(v.to_rfc3339().as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.time_min {
-            write!(
-                f,
-                "&timeMin={}",
-                percent_encode(v.to_rfc3339().as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        Ok(())
-    }
-}
-
-/// Parameters for the `events.list` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct EventsListParams {
-    /// General attributes applying to any API call
-    #[serde(flatten)]
-    pub calendar_params: Option<CalendarParams>,
-    /// Free text search terms to find events that match these terms in any field, except for extended properties. Optional.
-    #[serde(rename = "q")]
-    pub q: Option<String>,
-    /// Token specifying which result page to return. Optional.
-    #[serde(rename = "pageToken")]
-    pub page_token: Option<String>,
-    /// Time zone used in the response. Optional. The default is the time zone of the calendar.
-    #[serde(rename = "timeZone")]
-    pub time_zone: Option<String>,
-    /// Whether to include hidden invitations in the result. Optional. The default is False.
-    #[serde(rename = "showHiddenInvitations")]
-    pub show_hidden_invitations: Option<bool>,
-    /// DateTime: Lower bound (exclusive) for an event's end time to filter by. Optional. The default is not to filter by end time. Must be an RFC3339 timestamp with mandatory time zone offset, for example, 2011-06-03T10:00:00-07:00, 2011-06-03T10:00:00Z. Milliseconds may be provided but are ignored. If timeMax is set, timeMin must be smaller than timeMax.
-    #[serde(rename = "timeMin")]
-    pub time_min: Option<DateTime<Utc>>,
-    /// Specifies event ID in the iCalendar format to be included in the response. Optional.
-    #[serde(rename = "iCalUID")]
-    pub i_cal_u_i_d: Option<String>,
-    /// DateTime: Upper bound (exclusive) for an event's start time to filter by. Optional. The default is not to filter by start time. Must be an RFC3339 timestamp with mandatory time zone offset, for example, 2011-06-03T10:00:00-07:00, 2011-06-03T10:00:00Z. Milliseconds may be provided but are ignored. If timeMin is set, timeMax must be greater than timeMin.
-    #[serde(rename = "timeMax")]
-    pub time_max: Option<DateTime<Utc>>,
-    /// Whether to include deleted events (with status equals "cancelled") in the result. Cancelled instances of recurring events (but not the underlying recurring event) will still be included if showDeleted and singleEvents are both False. If showDeleted and singleEvents are both True, only single instances of deleted events (but not the underlying recurring events) are returned. Optional. The default is False.
-    #[serde(rename = "showDeleted")]
-    pub show_deleted: Option<bool>,
-    /// Token obtained from the nextSyncToken field returned on the last page of results from the previous list request. It makes the result of this list request contain only entries that have changed since then. All events deleted since the previous list request will always be in the result set and it is not allowed to set showDeleted to False.
-    /// There are several query parameters that cannot be specified together with nextSyncToken to ensure consistency of the client state.
-    ///
-    /// These are:
-    /// - iCalUID
-    /// - orderBy
-    /// - privateExtendedProperty
-    /// - q
-    /// - sharedExtendedProperty
-    /// - timeMin
-    /// - timeMax
-    /// - updatedMin If the syncToken expires, the server will respond with a 410 GONE response code and the client should clear its storage and perform a full synchronization without any syncToken.
-    /// Learn more about incremental synchronization.
-    /// Optional. The default is to return all entries.
-    #[serde(rename = "syncToken")]
-    pub sync_token: Option<String>,
-    /// Calendar identifier. To retrieve calendar IDs call the calendarList.list method. If you want to access the primary calendar of the currently logged in user, use the "primary" keyword.
-    #[serde(rename = "calendarId")]
-    pub calendar_id: String,
-    /// Maximum number of events returned on one result page. The number of events in the resulting page may be less than this value, or none at all, even if there are more events matching the query. Incomplete pages can be detected by a non-empty nextPageToken field in the response. By default the value is 250 events. The page size can never be larger than 2500 events. Optional.
-    #[serde(rename = "maxResults")]
-    pub max_results: Option<i32>,
-    /// Whether to expand recurring events into instances and only return single one-off events and instances of recurring events, but not the underlying recurring events themselves. Optional. The default is False.
-    #[serde(rename = "singleEvents")]
-    pub single_events: Option<bool>,
-    /// Extended properties constraint specified as propertyName=value. Matches only shared properties. This parameter might be repeated multiple times to return events that match all given constraints.
-    #[serde(rename = "sharedExtendedProperty")]
-    pub shared_extended_property: Option<String>,
-    /// DateTime: Lower bound for an event's last modification time (as a RFC3339 timestamp) to filter by. When specified, entries deleted since this time will always be included regardless of showDeleted. Optional. The default is not to filter by last modification time.
-    #[serde(rename = "updatedMin")]
-    pub updated_min: Option<DateTime<Utc>>,
-    /// The maximum number of attendees to include in the response. If there are more than the specified number of attendees, only the participant is returned. Optional.
-    #[serde(rename = "maxAttendees")]
-    pub max_attendees: Option<i32>,
-    /// The order of the events returned in the result. Optional. The default is an unspecified, stable order.
-    #[serde(rename = "orderBy")]
-    pub order_by: Option<EventsListOrderBy>,
-    /// Extended properties constraint specified as propertyName=value. Matches only private properties. This parameter might be repeated multiple times to return events that match all given constraints.
-    #[serde(rename = "privateExtendedProperty")]
-    pub private_extended_property: Option<String>,
-    /// Deprecated and ignored. A value will always be returned in the email field for the organizer, creator and attendees, even if no real email address is available (i.e. a generated, non-working value will be provided).
-    #[serde(rename = "alwaysIncludeEmail")]
-    pub always_include_email: Option<bool>,
-}
-
-impl std::fmt::Display for EventsListParams {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        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.page_token {
-            write!(
-                f,
-                "&pageToken={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.time_zone {
-            write!(
-                f,
-                "&timeZone={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.show_hidden_invitations {
-            write!(
-                f,
-                "&showHiddenInvitations={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.i_cal_u_i_d {
-            write!(
-                f,
-                "&iCalUID={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.show_deleted {
-            write!(
-                f,
-                "&showDeleted={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
         if let Some(ref v) = self.sync_token {
             write!(
                 f,
@@ -2784,511 +3257,24 @@
                 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.single_events {
-            write!(
-                f,
-                "&singleEvents={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.shared_extended_property {
-            write!(
-                f,
-                "&sharedExtendedProperty={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.max_attendees {
-            write!(
-                f,
-                "&maxAttendees={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.order_by {
-            write!(
-                f,
-                "&orderBy={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.private_extended_property {
-            write!(
-                f,
-                "&privateExtendedProperty={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.always_include_email {
-            write!(
-                f,
-                "&alwaysIncludeEmail={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.time_min {
-            write!(
-                f,
-                "&timeMin={}",
-                percent_encode(v.to_rfc3339().as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.time_max {
-            write!(
-                f,
-                "&timeMax={}",
-                percent_encode(v.to_rfc3339().as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.updated_min {
-            write!(
-                f,
-                "&updatedMin={}",
-                percent_encode(v.to_rfc3339().as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        Ok(())
-    }
-}
-
-/// Parameters for the `events.update` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct EventsUpdateParams {
-    /// General attributes applying to any API call
-    #[serde(flatten)]
-    pub calendar_params: Option<CalendarParams>,
-    /// Guests who should receive notifications about the event update (for example, title changes, etc.).
-    #[serde(rename = "sendUpdates")]
-    pub send_updates: Option<EventsUpdateSendUpdates>,
-    /// Version number of conference data supported by the API client. Version 0 assumes no conference data support and ignores conference data in the event's body. Version 1 enables support for copying of ConferenceData as well as for creating new conferences using the createRequest field of conferenceData. The default is 0.
-    #[serde(rename = "conferenceDataVersion")]
-    pub conference_data_version: Option<i32>,
-    /// Whether API client performing operation supports event attachments. Optional. The default is False.
-    #[serde(rename = "supportsAttachments")]
-    pub supports_attachments: Option<bool>,
-    /// Event identifier.
-    #[serde(rename = "eventId")]
-    pub event_id: String,
-    /// Deprecated. Please use sendUpdates instead.
-    ///
-    /// Whether to send notifications about the event update (for example, description changes, etc.). Note that some emails might still be sent even if you set the value to false. The default is false.
-    #[serde(rename = "sendNotifications")]
-    pub send_notifications: Option<bool>,
-    /// The maximum number of attendees to include in the response. If there are more than the specified number of attendees, only the participant is returned. Optional.
-    #[serde(rename = "maxAttendees")]
-    pub max_attendees: Option<i32>,
-    /// Deprecated and ignored. A value will always be returned in the email field for the organizer, creator and attendees, even if no real email address is available (i.e. a generated, non-working value will be provided).
-    #[serde(rename = "alwaysIncludeEmail")]
-    pub always_include_email: Option<bool>,
-    /// Calendar identifier. To retrieve calendar IDs call the calendarList.list method. If you want to access the primary calendar of the currently logged in user, use the "primary" keyword.
-    #[serde(rename = "calendarId")]
-    pub calendar_id: String,
-}
-
-impl std::fmt::Display for EventsUpdateParams {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        if let Some(ref v) = self.send_updates {
-            write!(
-                f,
-                "&sendUpdates={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.conference_data_version {
-            write!(
-                f,
-                "&conferenceDataVersion={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.supports_attachments {
-            write!(
-                f,
-                "&supportsAttachments={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.send_notifications {
-            write!(
-                f,
-                "&sendNotifications={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.max_attendees {
-            write!(
-                f,
-                "&maxAttendees={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.always_include_email {
-            write!(
-                f,
-                "&alwaysIncludeEmail={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        Ok(())
-    }
-}
-
-/// Parameters for the `events.patch` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct EventsPatchParams {
-    /// General attributes applying to any API call
-    #[serde(flatten)]
-    pub calendar_params: Option<CalendarParams>,
-    /// Deprecated. Please use sendUpdates instead.
-    ///
-    /// Whether to send notifications about the event update (for example, description changes, etc.). Note that some emails might still be sent even if you set the value to false. The default is false.
-    #[serde(rename = "sendNotifications")]
-    pub send_notifications: Option<bool>,
-    /// Whether API client performing operation supports event attachments. Optional. The default is False.
-    #[serde(rename = "supportsAttachments")]
-    pub supports_attachments: Option<bool>,
-    /// Deprecated and ignored. A value will always be returned in the email field for the organizer, creator and attendees, even if no real email address is available (i.e. a generated, non-working value will be provided).
-    #[serde(rename = "alwaysIncludeEmail")]
-    pub always_include_email: Option<bool>,
-    /// Guests who should receive notifications about the event update (for example, title changes, etc.).
-    #[serde(rename = "sendUpdates")]
-    pub send_updates: Option<EventsPatchSendUpdates>,
-    /// Event identifier.
-    #[serde(rename = "eventId")]
-    pub event_id: String,
-    /// Version number of conference data supported by the API client. Version 0 assumes no conference data support and ignores conference data in the event's body. Version 1 enables support for copying of ConferenceData as well as for creating new conferences using the createRequest field of conferenceData. The default is 0.
-    #[serde(rename = "conferenceDataVersion")]
-    pub conference_data_version: Option<i32>,
-    /// The maximum number of attendees to include in the response. If there are more than the specified number of attendees, only the participant is returned. Optional.
-    #[serde(rename = "maxAttendees")]
-    pub max_attendees: Option<i32>,
-    /// Calendar identifier. To retrieve calendar IDs call the calendarList.list method. If you want to access the primary calendar of the currently logged in user, use the "primary" keyword.
-    #[serde(rename = "calendarId")]
-    pub calendar_id: String,
-}
-
-impl std::fmt::Display for EventsPatchParams {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        if let Some(ref v) = self.send_notifications {
-            write!(
-                f,
-                "&sendNotifications={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.supports_attachments {
-            write!(
-                f,
-                "&supportsAttachments={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.always_include_email {
-            write!(
-                f,
-                "&alwaysIncludeEmail={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.send_updates {
-            write!(
-                f,
-                "&sendUpdates={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.conference_data_version {
-            write!(
-                f,
-                "&conferenceDataVersion={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.max_attendees {
-            write!(
-                f,
-                "&maxAttendees={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        Ok(())
-    }
-}
-
-/// Parameters for the `events.quickAdd` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct EventsQuickAddParams {
-    /// General attributes applying to any API call
-    #[serde(flatten)]
-    pub calendar_params: Option<CalendarParams>,
-    /// The text describing the event to be created.
-    #[serde(rename = "text")]
-    pub text: String,
-    /// Guests who should receive notifications about the creation of the new event.
-    #[serde(rename = "sendUpdates")]
-    pub send_updates: Option<EventsQuickAddSendUpdates>,
-    /// Calendar identifier. To retrieve calendar IDs call the calendarList.list method. If you want to access the primary calendar of the currently logged in user, use the "primary" keyword.
-    #[serde(rename = "calendarId")]
-    pub calendar_id: String,
-    /// Deprecated. Please use sendUpdates instead.
-    ///
-    /// Whether to send notifications about the creation of the event. Note that some emails might still be sent even if you set the value to false. The default is false.
-    #[serde(rename = "sendNotifications")]
-    pub send_notifications: Option<bool>,
-}
-
-impl std::fmt::Display for EventsQuickAddParams {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        write!(
-            f,
-            "&text={}",
-            percent_encode(format!("{}", self.text).as_bytes(), NON_ALPHANUMERIC).to_string()
-        )?;
-        if let Some(ref v) = self.send_updates {
-            write!(
-                f,
-                "&sendUpdates={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.send_notifications {
-            write!(
-                f,
-                "&sendNotifications={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        Ok(())
-    }
-}
-
-/// Parameters for the `events.get` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct EventsGetParams {
-    /// General attributes applying to any API call
-    #[serde(flatten)]
-    pub calendar_params: Option<CalendarParams>,
-    /// Time zone used in the response. Optional. The default is the time zone of the calendar.
-    #[serde(rename = "timeZone")]
-    pub time_zone: Option<String>,
-    /// Event identifier.
-    #[serde(rename = "eventId")]
-    pub event_id: String,
-    /// Calendar identifier. To retrieve calendar IDs call the calendarList.list method. If you want to access the primary calendar of the currently logged in user, use the "primary" keyword.
-    #[serde(rename = "calendarId")]
-    pub calendar_id: String,
-    /// The maximum number of attendees to include in the response. If there are more than the specified number of attendees, only the participant is returned. Optional.
-    #[serde(rename = "maxAttendees")]
-    pub max_attendees: Option<i32>,
-    /// Deprecated and ignored. A value will always be returned in the email field for the organizer, creator and attendees, even if no real email address is available (i.e. a generated, non-working value will be provided).
-    #[serde(rename = "alwaysIncludeEmail")]
-    pub always_include_email: Option<bool>,
-}
-
-impl std::fmt::Display for EventsGetParams {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        if let Some(ref v) = self.time_zone {
-            write!(
-                f,
-                "&timeZone={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.max_attendees {
-            write!(
-                f,
-                "&maxAttendees={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.always_include_email {
-            write!(
-                f,
-                "&alwaysIncludeEmail={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        Ok(())
-    }
-}
-
-/// Parameters for the `events.insert` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct EventsInsertParams {
-    /// General attributes applying to any API call
-    #[serde(flatten)]
-    pub calendar_params: Option<CalendarParams>,
-    /// Calendar identifier. To retrieve calendar IDs call the calendarList.list method. If you want to access the primary calendar of the currently logged in user, use the "primary" keyword.
-    #[serde(rename = "calendarId")]
-    pub calendar_id: String,
-    /// The maximum number of attendees to include in the response. If there are more than the specified number of attendees, only the participant is returned. Optional.
-    #[serde(rename = "maxAttendees")]
-    pub max_attendees: Option<i32>,
-    /// Version number of conference data supported by the API client. Version 0 assumes no conference data support and ignores conference data in the event's body. Version 1 enables support for copying of ConferenceData as well as for creating new conferences using the createRequest field of conferenceData. The default is 0.
-    #[serde(rename = "conferenceDataVersion")]
-    pub conference_data_version: Option<i32>,
-    /// Deprecated. Please use sendUpdates instead.
-    ///
-    /// Whether to send notifications about the creation of the new event. Note that some emails might still be sent even if you set the value to false. The default is false.
-    #[serde(rename = "sendNotifications")]
-    pub send_notifications: Option<bool>,
-    /// Whether API client performing operation supports event attachments. Optional. The default is False.
-    #[serde(rename = "supportsAttachments")]
-    pub supports_attachments: Option<bool>,
-    /// Whether to send notifications about the creation of the new event. Note that some emails might still be sent. The default is false.
-    #[serde(rename = "sendUpdates")]
-    pub send_updates: Option<EventsInsertSendUpdates>,
-}
-
-impl std::fmt::Display for EventsInsertParams {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        if let Some(ref v) = self.max_attendees {
-            write!(
-                f,
-                "&maxAttendees={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.conference_data_version {
-            write!(
-                f,
-                "&conferenceDataVersion={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.send_notifications {
-            write!(
-                f,
-                "&sendNotifications={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.supports_attachments {
-            write!(
-                f,
-                "&supportsAttachments={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.send_updates {
-            write!(
-                f,
-                "&sendUpdates={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        Ok(())
-    }
-}
-
-/// Parameters for the `events.import` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct EventsImportParams {
-    /// General attributes applying to any API call
-    #[serde(flatten)]
-    pub calendar_params: Option<CalendarParams>,
-    /// Version number of conference data supported by the API client. Version 0 assumes no conference data support and ignores conference data in the event's body. Version 1 enables support for copying of ConferenceData as well as for creating new conferences using the createRequest field of conferenceData. The default is 0.
-    #[serde(rename = "conferenceDataVersion")]
-    pub conference_data_version: Option<i32>,
-    /// Calendar identifier. To retrieve calendar IDs call the calendarList.list method. If you want to access the primary calendar of the currently logged in user, use the "primary" keyword.
-    #[serde(rename = "calendarId")]
-    pub calendar_id: String,
-    /// Whether API client performing operation supports event attachments. Optional. The default is False.
-    #[serde(rename = "supportsAttachments")]
-    pub supports_attachments: Option<bool>,
-}
-
-impl std::fmt::Display for EventsImportParams {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        if let Some(ref v) = self.conference_data_version {
-            write!(
-                f,
-                "&conferenceDataVersion={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.supports_attachments {
-            write!(
-                f,
-                "&supportsAttachments={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        Ok(())
-    }
-}
-
-/// Parameters for the `events.delete` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct EventsDeleteParams {
-    /// General attributes applying to any API call
-    #[serde(flatten)]
-    pub calendar_params: Option<CalendarParams>,
-    /// Event identifier.
-    #[serde(rename = "eventId")]
-    pub event_id: String,
-    /// Calendar identifier. To retrieve calendar IDs call the calendarList.list method. If you want to access the primary calendar of the currently logged in user, use the "primary" keyword.
-    #[serde(rename = "calendarId")]
-    pub calendar_id: String,
-    /// Deprecated. Please use sendUpdates instead.
-    ///
-    /// Whether to send notifications about the deletion of the event. Note that some emails might still be sent even if you set the value to false. The default is false.
-    #[serde(rename = "sendNotifications")]
-    pub send_notifications: Option<bool>,
-    /// Guests who should receive notifications about the deletion of the event.
-    #[serde(rename = "sendUpdates")]
-    pub send_updates: Option<EventsDeleteSendUpdates>,
-}
-
-impl std::fmt::Display for EventsDeleteParams {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        if let Some(ref v) = self.send_notifications {
-            write!(
-                f,
-                "&sendNotifications={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.send_updates {
-            write!(
-                f,
-                "&sendUpdates={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
         Ok(())
     }
 }
 
 #[derive(Serialize, Deserialize, Debug, Clone, Default)]
 pub struct CalendarParams {
-    /// 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>,
+    /// Data format for the response.
+    #[serde(rename = "alt")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub alt: Option<CalendarParamsAlt>,
     /// Selector specifying which fields to include in a partial response.
     #[serde(rename = "fields")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub fields: Option<String>,
-    /// An opaque string that represents a user for quota purposes. Must not exceed 40 characters.
-    #[serde(rename = "quotaUser")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub quota_user: Option<String>,
-    /// Data format for the response.
-    #[serde(rename = "alt")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub alt: Option<CalendarParamsAlt>,
-    /// Deprecated. Please use quotaUser instead.
-    #[serde(rename = "userIp")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub user_ip: 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 2.0 token for the current user.
     #[serde(rename = "oauth_token")]
     #[serde(skip_serializing_if = "Option::is_none")]
@@ -3297,14 +3283,22 @@
     #[serde(rename = "prettyPrint")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub pretty_print: Option<bool>,
+    /// An opaque string that represents a user for quota purposes. Must not exceed 40 characters.
+    #[serde(rename = "quotaUser")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub quota_user: Option<String>,
+    /// Deprecated. Please use quotaUser instead.
+    #[serde(rename = "userIp")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub user_ip: Option<String>,
 }
 
 impl std::fmt::Display for CalendarParams {
     fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        if let Some(ref v) = self.key {
+        if let Some(ref v) = self.alt {
             write!(
                 f,
-                "&key={}",
+                "&alt={}",
                 percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
             )?;
         }
@@ -3315,24 +3309,10 @@
                 percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
             )?;
         }
-        if let Some(ref v) = self.quota_user {
+        if let Some(ref v) = self.key {
             write!(
                 f,
-                "&quotaUser={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.alt {
-            write!(
-                f,
-                "&alt={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.user_ip {
-            write!(
-                f,
-                "&userIp={}",
+                "&key={}",
                 percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
             )?;
         }
@@ -3350,10 +3330,931 @@
                 percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
             )?;
         }
+        if let Some(ref v) = self.quota_user {
+            write!(
+                f,
+                "&quotaUser={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.user_ip {
+            write!(
+                f,
+                "&userIp={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
         Ok(())
     }
 }
 
+/// The Calendar Acl service represents the Acl resource.
+pub struct AclService {
+    client: TlsClient,
+    authenticator: Box<dyn 'static + DerefAuth>,
+    scopes: Vec<String>,
+
+    base_url: String,
+    root_url: String,
+}
+
+impl AclService {
+    /// Create a new AclService object. The easiest way to call this is wrapping the Authenticator
+    /// into an `Arc`: `new(client.clone(), Arc::new(authenticator))`.
+    /// This way, one authenticator can be shared among several services.
+    pub fn new<A: 'static + DerefAuth>(client: TlsClient, auth: A) -> AclService {
+        AclService {
+            client: client,
+            authenticator: Box::new(auth),
+            scopes: vec![],
+            base_url: "https://www.googleapis.com/calendar/v3/".into(),
+            root_url: "https://www.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 CalendarScopes 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 access control rule.
+    pub async fn delete(&self, params: &AclDeleteParams) -> Result<()> {
+        let rel_path = format!(
+            "calendars/{calendarId}/acl/{ruleId}",
+            calendarId = percent_encode(
+                format!("{}", params.calendar_id).as_bytes(),
+                NON_ALPHANUMERIC
+            ),
+            ruleId = percent_encode(format!("{}", params.rule_id).as_bytes(), NON_ALPHANUMERIC)
+        );
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[CalendarScopes::Calendar.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref api_params) = &params.calendar_params {
+            url_params.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
+    }
+
+    /// Returns an access control rule.
+    pub async fn get(&self, params: &AclGetParams) -> Result<AclRule> {
+        let rel_path = format!(
+            "calendars/{calendarId}/acl/{ruleId}",
+            calendarId = percent_encode(
+                format!("{}", params.calendar_id).as_bytes(),
+                NON_ALPHANUMERIC
+            ),
+            ruleId = percent_encode(format!("{}", params.rule_id).as_bytes(), NON_ALPHANUMERIC)
+        );
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[CalendarScopes::CalendarReadonly.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref api_params) = &params.calendar_params {
+            url_params.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
+    }
+
+    /// Creates an access control rule.
+    pub async fn insert(&self, params: &AclInsertParams, req: &AclRule) -> Result<AclRule> {
+        let rel_path = format!(
+            "calendars/{calendarId}/acl",
+            calendarId = percent_encode(
+                format!("{}", params.calendar_id).as_bytes(),
+                NON_ALPHANUMERIC
+            )
+        );
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[CalendarScopes::Calendar.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref api_params) = &params.calendar_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
+    }
+
+    /// Returns the rules in the access control list for the calendar.
+    pub async fn list(&self, params: &AclListParams) -> Result<Acl> {
+        let rel_path = format!(
+            "calendars/{calendarId}/acl",
+            calendarId = percent_encode(
+                format!("{}", params.calendar_id).as_bytes(),
+                NON_ALPHANUMERIC
+            )
+        );
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[CalendarScopes::Calendar.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref api_params) = &params.calendar_params {
+            url_params.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 access control rule. This method supports patch semantics.
+    pub async fn patch(&self, params: &AclPatchParams, req: &AclRule) -> Result<AclRule> {
+        let rel_path = format!(
+            "calendars/{calendarId}/acl/{ruleId}",
+            calendarId = percent_encode(
+                format!("{}", params.calendar_id).as_bytes(),
+                NON_ALPHANUMERIC
+            ),
+            ruleId = percent_encode(format!("{}", params.rule_id).as_bytes(), NON_ALPHANUMERIC)
+        );
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[CalendarScopes::Calendar.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref api_params) = &params.calendar_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, "PATCH", opt_request).await
+    }
+
+    /// Updates an access control rule.
+    pub async fn update(&self, params: &AclUpdateParams, req: &AclRule) -> Result<AclRule> {
+        let rel_path = format!(
+            "calendars/{calendarId}/acl/{ruleId}",
+            calendarId = percent_encode(
+                format!("{}", params.calendar_id).as_bytes(),
+                NON_ALPHANUMERIC
+            ),
+            ruleId = percent_encode(format!("{}", params.rule_id).as_bytes(), NON_ALPHANUMERIC)
+        );
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[CalendarScopes::Calendar.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref api_params) = &params.calendar_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
+    }
+
+    /// Watch for changes to ACL resources.
+    pub async fn watch(&self, params: &AclWatchParams, req: &Channel) -> Result<Channel> {
+        let rel_path = format!(
+            "calendars/{calendarId}/acl/watch",
+            calendarId = percent_encode(
+                format!("{}", params.calendar_id).as_bytes(),
+                NON_ALPHANUMERIC
+            )
+        );
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[CalendarScopes::Calendar.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref api_params) = &params.calendar_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 Calendar CalendarList service represents the CalendarList resource.
+pub struct CalendarListService {
+    client: TlsClient,
+    authenticator: Box<dyn 'static + DerefAuth>,
+    scopes: Vec<String>,
+
+    base_url: String,
+    root_url: String,
+}
+
+impl CalendarListService {
+    /// Create a new CalendarListService object. The easiest way to call this is wrapping the Authenticator
+    /// into an `Arc`: `new(client.clone(), Arc::new(authenticator))`.
+    /// This way, one authenticator can be shared among several services.
+    pub fn new<A: 'static + DerefAuth>(client: TlsClient, auth: A) -> CalendarListService {
+        CalendarListService {
+            client: client,
+            authenticator: Box::new(auth),
+            scopes: vec![],
+            base_url: "https://www.googleapis.com/calendar/v3/".into(),
+            root_url: "https://www.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 CalendarScopes 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();
+    }
+
+    /// Removes a calendar from the user's calendar list.
+    pub async fn delete(&self, params: &CalendarListDeleteParams) -> Result<()> {
+        let rel_path = format!(
+            "users/me/calendarList/{calendarId}",
+            calendarId = percent_encode(
+                format!("{}", params.calendar_id).as_bytes(),
+                NON_ALPHANUMERIC
+            )
+        );
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[CalendarScopes::Calendar.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref api_params) = &params.calendar_params {
+            url_params.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
+    }
+
+    /// Returns a calendar from the user's calendar list.
+    pub async fn get(&self, params: &CalendarListGetParams) -> Result<CalendarListEntry> {
+        let rel_path = format!(
+            "users/me/calendarList/{calendarId}",
+            calendarId = percent_encode(
+                format!("{}", params.calendar_id).as_bytes(),
+                NON_ALPHANUMERIC
+            )
+        );
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[CalendarScopes::CalendarReadonly.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref api_params) = &params.calendar_params {
+            url_params.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 an existing calendar into the user's calendar list.
+    pub async fn insert(
+        &self,
+        params: &CalendarListInsertParams,
+        req: &CalendarListEntry,
+    ) -> Result<CalendarListEntry> {
+        let rel_path = format!("users/me/calendarList",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[CalendarScopes::Calendar.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref api_params) = &params.calendar_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
+    }
+
+    /// Returns the calendars on the user's calendar list.
+    pub async fn list(&self, params: &CalendarListListParams) -> Result<CalendarList> {
+        let rel_path = format!("users/me/calendarList",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[CalendarScopes::CalendarReadonly.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref api_params) = &params.calendar_params {
+            url_params.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 calendar on the user's calendar list. This method supports patch semantics.
+    pub async fn patch(
+        &self,
+        params: &CalendarListPatchParams,
+        req: &CalendarListEntry,
+    ) -> Result<CalendarListEntry> {
+        let rel_path = format!(
+            "users/me/calendarList/{calendarId}",
+            calendarId = percent_encode(
+                format!("{}", params.calendar_id).as_bytes(),
+                NON_ALPHANUMERIC
+            )
+        );
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[CalendarScopes::Calendar.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref api_params) = &params.calendar_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, "PATCH", opt_request).await
+    }
+
+    /// Updates an existing calendar on the user's calendar list.
+    pub async fn update(
+        &self,
+        params: &CalendarListUpdateParams,
+        req: &CalendarListEntry,
+    ) -> Result<CalendarListEntry> {
+        let rel_path = format!(
+            "users/me/calendarList/{calendarId}",
+            calendarId = percent_encode(
+                format!("{}", params.calendar_id).as_bytes(),
+                NON_ALPHANUMERIC
+            )
+        );
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[CalendarScopes::Calendar.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref api_params) = &params.calendar_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
+    }
+
+    /// Watch for changes to CalendarList resources.
+    pub async fn watch(&self, params: &CalendarListWatchParams, req: &Channel) -> Result<Channel> {
+        let rel_path = format!("users/me/calendarList/watch",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[CalendarScopes::CalendarReadonly.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref api_params) = &params.calendar_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 Calendar Calendars service represents the Calendars resource.
+pub struct CalendarsService {
+    client: TlsClient,
+    authenticator: Box<dyn 'static + DerefAuth>,
+    scopes: Vec<String>,
+
+    base_url: String,
+    root_url: String,
+}
+
+impl CalendarsService {
+    /// Create a new CalendarsService object. The easiest way to call this is wrapping the Authenticator
+    /// into an `Arc`: `new(client.clone(), Arc::new(authenticator))`.
+    /// This way, one authenticator can be shared among several services.
+    pub fn new<A: 'static + DerefAuth>(client: TlsClient, auth: A) -> CalendarsService {
+        CalendarsService {
+            client: client,
+            authenticator: Box::new(auth),
+            scopes: vec![],
+            base_url: "https://www.googleapis.com/calendar/v3/".into(),
+            root_url: "https://www.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 CalendarScopes 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();
+    }
+
+    /// Clears a primary calendar. This operation deletes all events associated with the primary calendar of an account.
+    pub async fn clear(&self, params: &CalendarsClearParams) -> Result<()> {
+        let rel_path = format!(
+            "calendars/{calendarId}/clear",
+            calendarId = percent_encode(
+                format!("{}", params.calendar_id).as_bytes(),
+                NON_ALPHANUMERIC
+            )
+        );
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[CalendarScopes::Calendar.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref api_params) = &params.calendar_params {
+            url_params.push_str(&format!("{}", api_params));
+        }
+
+        let full_uri = path + &url_params;
+
+        let opt_request: Option<&EmptyRequest> = None;
+        do_request(&self.client, &full_uri, &headers, "POST", opt_request).await
+    }
+
+    /// Deletes a secondary calendar. Use calendars.clear for clearing all events on primary calendars.
+    pub async fn delete(&self, params: &CalendarsDeleteParams) -> Result<()> {
+        let rel_path = format!(
+            "calendars/{calendarId}",
+            calendarId = percent_encode(
+                format!("{}", params.calendar_id).as_bytes(),
+                NON_ALPHANUMERIC
+            )
+        );
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[CalendarScopes::Calendar.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref api_params) = &params.calendar_params {
+            url_params.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
+    }
+
+    /// Returns metadata for a calendar.
+    pub async fn get(&self, params: &CalendarsGetParams) -> Result<Calendar> {
+        let rel_path = format!(
+            "calendars/{calendarId}",
+            calendarId = percent_encode(
+                format!("{}", params.calendar_id).as_bytes(),
+                NON_ALPHANUMERIC
+            )
+        );
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[CalendarScopes::CalendarReadonly.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref api_params) = &params.calendar_params {
+            url_params.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
+    }
+
+    /// Creates a secondary calendar.
+    pub async fn insert(&self, params: &CalendarsInsertParams, req: &Calendar) -> Result<Calendar> {
+        let rel_path = format!("calendars",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[CalendarScopes::Calendar.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref api_params) = &params.calendar_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 metadata for a calendar. This method supports patch semantics.
+    pub async fn patch(&self, params: &CalendarsPatchParams, req: &Calendar) -> Result<Calendar> {
+        let rel_path = format!(
+            "calendars/{calendarId}",
+            calendarId = percent_encode(
+                format!("{}", params.calendar_id).as_bytes(),
+                NON_ALPHANUMERIC
+            )
+        );
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[CalendarScopes::Calendar.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref api_params) = &params.calendar_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, "PATCH", opt_request).await
+    }
+
+    /// Updates metadata for a calendar.
+    pub async fn update(&self, params: &CalendarsUpdateParams, req: &Calendar) -> Result<Calendar> {
+        let rel_path = format!(
+            "calendars/{calendarId}",
+            calendarId = percent_encode(
+                format!("{}", params.calendar_id).as_bytes(),
+                NON_ALPHANUMERIC
+            )
+        );
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[CalendarScopes::Calendar.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref api_params) = &params.calendar_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 Calendar Channels service represents the Channels resource.
 pub struct ChannelsService {
     client: TlsClient,
@@ -3454,6 +4355,567 @@
     }
 }
 
+/// The Calendar Colors service represents the Colors resource.
+pub struct ColorsService {
+    client: TlsClient,
+    authenticator: Box<dyn 'static + DerefAuth>,
+    scopes: Vec<String>,
+
+    base_url: String,
+    root_url: String,
+}
+
+impl ColorsService {
+    /// Create a new ColorsService object. The easiest way to call this is wrapping the Authenticator
+    /// into an `Arc`: `new(client.clone(), Arc::new(authenticator))`.
+    /// This way, one authenticator can be shared among several services.
+    pub fn new<A: 'static + DerefAuth>(client: TlsClient, auth: A) -> ColorsService {
+        ColorsService {
+            client: client,
+            authenticator: Box::new(auth),
+            scopes: vec![],
+            base_url: "https://www.googleapis.com/calendar/v3/".into(),
+            root_url: "https://www.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 CalendarScopes 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();
+    }
+
+    /// Returns the color definitions for calendars and events.
+    pub async fn get(&self, params: &ColorsGetParams) -> Result<Colors> {
+        let rel_path = format!("colors",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[CalendarScopes::CalendarReadonly.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref api_params) = &params.calendar_params {
+            url_params.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 Calendar Events service represents the Events resource.
+pub struct EventsService {
+    client: TlsClient,
+    authenticator: Box<dyn 'static + DerefAuth>,
+    scopes: Vec<String>,
+
+    base_url: String,
+    root_url: String,
+}
+
+impl EventsService {
+    /// Create a new EventsService object. The easiest way to call this is wrapping the Authenticator
+    /// into an `Arc`: `new(client.clone(), Arc::new(authenticator))`.
+    /// This way, one authenticator can be shared among several services.
+    pub fn new<A: 'static + DerefAuth>(client: TlsClient, auth: A) -> EventsService {
+        EventsService {
+            client: client,
+            authenticator: Box::new(auth),
+            scopes: vec![],
+            base_url: "https://www.googleapis.com/calendar/v3/".into(),
+            root_url: "https://www.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 CalendarScopes 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 event.
+    pub async fn delete(&self, params: &EventsDeleteParams) -> Result<()> {
+        let rel_path = format!(
+            "calendars/{calendarId}/events/{eventId}",
+            calendarId = percent_encode(
+                format!("{}", params.calendar_id).as_bytes(),
+                NON_ALPHANUMERIC
+            ),
+            eventId = percent_encode(format!("{}", params.event_id).as_bytes(), NON_ALPHANUMERIC)
+        );
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[CalendarScopes::CalendarEvents.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref api_params) = &params.calendar_params {
+            url_params.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
+    }
+
+    /// Returns an event.
+    pub async fn get(&self, params: &EventsGetParams) -> Result<Event> {
+        let rel_path = format!(
+            "calendars/{calendarId}/events/{eventId}",
+            calendarId = percent_encode(
+                format!("{}", params.calendar_id).as_bytes(),
+                NON_ALPHANUMERIC
+            ),
+            eventId = percent_encode(format!("{}", params.event_id).as_bytes(), NON_ALPHANUMERIC)
+        );
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[CalendarScopes::CalendarReadonly.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref api_params) = &params.calendar_params {
+            url_params.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
+    }
+
+    /// Imports an event. This operation is used to add a private copy of an existing event to a calendar.
+    pub async fn import(&self, params: &EventsImportParams, req: &Event) -> Result<Event> {
+        let rel_path = format!(
+            "calendars/{calendarId}/events/import",
+            calendarId = percent_encode(
+                format!("{}", params.calendar_id).as_bytes(),
+                NON_ALPHANUMERIC
+            )
+        );
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[CalendarScopes::CalendarEvents.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref api_params) = &params.calendar_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
+    }
+
+    /// Creates an event.
+    pub async fn insert(&self, params: &EventsInsertParams, req: &Event) -> Result<Event> {
+        let rel_path = format!(
+            "calendars/{calendarId}/events",
+            calendarId = percent_encode(
+                format!("{}", params.calendar_id).as_bytes(),
+                NON_ALPHANUMERIC
+            )
+        );
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[CalendarScopes::CalendarEvents.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref api_params) = &params.calendar_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
+    }
+
+    /// Returns instances of the specified recurring event.
+    pub async fn instances(&self, params: &EventsInstancesParams) -> Result<Events> {
+        let rel_path = format!(
+            "calendars/{calendarId}/events/{eventId}/instances",
+            calendarId = percent_encode(
+                format!("{}", params.calendar_id).as_bytes(),
+                NON_ALPHANUMERIC
+            ),
+            eventId = percent_encode(format!("{}", params.event_id).as_bytes(), NON_ALPHANUMERIC)
+        );
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[CalendarScopes::CalendarReadonly.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref api_params) = &params.calendar_params {
+            url_params.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
+    }
+
+    /// Returns events on the specified calendar.
+    pub async fn list(&self, params: &EventsListParams) -> Result<Events> {
+        let rel_path = format!(
+            "calendars/{calendarId}/events",
+            calendarId = percent_encode(
+                format!("{}", params.calendar_id).as_bytes(),
+                NON_ALPHANUMERIC
+            )
+        );
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[CalendarScopes::CalendarReadonly.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref api_params) = &params.calendar_params {
+            url_params.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
+    }
+
+    /// Moves an event to another calendar, i.e. changes an event's organizer.
+    pub async fn move_(&self, params: &EventsMoveParams) -> Result<Event> {
+        let rel_path = format!(
+            "calendars/{calendarId}/events/{eventId}/move",
+            calendarId = percent_encode(
+                format!("{}", params.calendar_id).as_bytes(),
+                NON_ALPHANUMERIC
+            ),
+            eventId = percent_encode(format!("{}", params.event_id).as_bytes(), NON_ALPHANUMERIC)
+        );
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[CalendarScopes::CalendarEvents.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref api_params) = &params.calendar_params {
+            url_params.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 event. This method supports patch semantics.
+    pub async fn patch(&self, params: &EventsPatchParams, req: &Event) -> Result<Event> {
+        let rel_path = format!(
+            "calendars/{calendarId}/events/{eventId}",
+            calendarId = percent_encode(
+                format!("{}", params.calendar_id).as_bytes(),
+                NON_ALPHANUMERIC
+            ),
+            eventId = percent_encode(format!("{}", params.event_id).as_bytes(), NON_ALPHANUMERIC)
+        );
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[CalendarScopes::CalendarEvents.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref api_params) = &params.calendar_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, "PATCH", opt_request).await
+    }
+
+    /// Creates an event based on a simple text string.
+    pub async fn quick_add(&self, params: &EventsQuickAddParams) -> Result<Event> {
+        let rel_path = format!(
+            "calendars/{calendarId}/events/quickAdd",
+            calendarId = percent_encode(
+                format!("{}", params.calendar_id).as_bytes(),
+                NON_ALPHANUMERIC
+            )
+        );
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[CalendarScopes::CalendarEvents.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref api_params) = &params.calendar_params {
+            url_params.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 event.
+    pub async fn update(&self, params: &EventsUpdateParams, req: &Event) -> Result<Event> {
+        let rel_path = format!(
+            "calendars/{calendarId}/events/{eventId}",
+            calendarId = percent_encode(
+                format!("{}", params.calendar_id).as_bytes(),
+                NON_ALPHANUMERIC
+            ),
+            eventId = percent_encode(format!("{}", params.event_id).as_bytes(), NON_ALPHANUMERIC)
+        );
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[CalendarScopes::CalendarEvents.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref api_params) = &params.calendar_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
+    }
+
+    /// Watch for changes to Events resources.
+    pub async fn watch(&self, params: &EventsWatchParams, req: &Channel) -> Result<Channel> {
+        let rel_path = format!(
+            "calendars/{calendarId}/events/watch",
+            calendarId = percent_encode(
+                format!("{}", params.calendar_id).as_bytes(),
+                NON_ALPHANUMERIC
+            )
+        );
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[CalendarScopes::CalendarReadonly.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref api_params) = &params.calendar_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 Calendar Freebusy service represents the Freebusy resource.
 pub struct FreebusyService {
     client: TlsClient,
@@ -3556,1010 +5018,6 @@
     }
 }
 
-/// The Calendar Colors service represents the Colors resource.
-pub struct ColorsService {
-    client: TlsClient,
-    authenticator: Box<dyn 'static + DerefAuth>,
-    scopes: Vec<String>,
-
-    base_url: String,
-    root_url: String,
-}
-
-impl ColorsService {
-    /// Create a new ColorsService object. The easiest way to call this is wrapping the Authenticator
-    /// into an `Arc`: `new(client.clone(), Arc::new(authenticator))`.
-    /// This way, one authenticator can be shared among several services.
-    pub fn new<A: 'static + DerefAuth>(client: TlsClient, auth: A) -> ColorsService {
-        ColorsService {
-            client: client,
-            authenticator: Box::new(auth),
-            scopes: vec![],
-            base_url: "https://www.googleapis.com/calendar/v3/".into(),
-            root_url: "https://www.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 CalendarScopes 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();
-    }
-
-    /// Returns the color definitions for calendars and events.
-    pub async fn get(&self, params: &ColorsGetParams) -> Result<Colors> {
-        let rel_path = format!("colors",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[CalendarScopes::CalendarReadonly.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.calendar_params {
-            url_params.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 Calendar Acl service represents the Acl resource.
-pub struct AclService {
-    client: TlsClient,
-    authenticator: Box<dyn 'static + DerefAuth>,
-    scopes: Vec<String>,
-
-    base_url: String,
-    root_url: String,
-}
-
-impl AclService {
-    /// Create a new AclService object. The easiest way to call this is wrapping the Authenticator
-    /// into an `Arc`: `new(client.clone(), Arc::new(authenticator))`.
-    /// This way, one authenticator can be shared among several services.
-    pub fn new<A: 'static + DerefAuth>(client: TlsClient, auth: A) -> AclService {
-        AclService {
-            client: client,
-            authenticator: Box::new(auth),
-            scopes: vec![],
-            base_url: "https://www.googleapis.com/calendar/v3/".into(),
-            root_url: "https://www.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 CalendarScopes 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();
-    }
-
-    /// Returns an access control rule.
-    pub async fn get(&self, params: &AclGetParams) -> Result<AclRule> {
-        let rel_path = format!(
-            "calendars/{calendarId}/acl/{ruleId}",
-            calendarId = percent_encode(
-                format!("{}", params.calendar_id).as_bytes(),
-                NON_ALPHANUMERIC
-            ),
-            ruleId = percent_encode(format!("{}", params.rule_id).as_bytes(), NON_ALPHANUMERIC)
-        );
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[CalendarScopes::CalendarReadonly.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.calendar_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-
-        let opt_request: Option<&EmptyRequest> = None;
-        do_request(&self.client, &full_uri, &headers, "GET", opt_request).await
-    }
-
-    /// Deletes an access control rule.
-    pub async fn delete(&self, params: &AclDeleteParams) -> Result<()> {
-        let rel_path = format!(
-            "calendars/{calendarId}/acl/{ruleId}",
-            calendarId = percent_encode(
-                format!("{}", params.calendar_id).as_bytes(),
-                NON_ALPHANUMERIC
-            ),
-            ruleId = percent_encode(format!("{}", params.rule_id).as_bytes(), NON_ALPHANUMERIC)
-        );
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[CalendarScopes::Calendar.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.calendar_params {
-            url_params.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
-    }
-
-    /// Creates an access control rule.
-    pub async fn insert(&self, params: &AclInsertParams, req: &AclRule) -> Result<AclRule> {
-        let rel_path = format!(
-            "calendars/{calendarId}/acl",
-            calendarId = percent_encode(
-                format!("{}", params.calendar_id).as_bytes(),
-                NON_ALPHANUMERIC
-            )
-        );
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[CalendarScopes::Calendar.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.calendar_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
-    }
-
-    /// Watch for changes to ACL resources.
-    pub async fn watch(&self, params: &AclWatchParams, req: &Channel) -> Result<Channel> {
-        let rel_path = format!(
-            "calendars/{calendarId}/acl/watch",
-            calendarId = percent_encode(
-                format!("{}", params.calendar_id).as_bytes(),
-                NON_ALPHANUMERIC
-            )
-        );
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[CalendarScopes::Calendar.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.calendar_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
-    }
-
-    /// Returns the rules in the access control list for the calendar.
-    pub async fn list(&self, params: &AclListParams) -> Result<Acl> {
-        let rel_path = format!(
-            "calendars/{calendarId}/acl",
-            calendarId = percent_encode(
-                format!("{}", params.calendar_id).as_bytes(),
-                NON_ALPHANUMERIC
-            )
-        );
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[CalendarScopes::Calendar.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.calendar_params {
-            url_params.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 access control rule.
-    pub async fn update(&self, params: &AclUpdateParams, req: &AclRule) -> Result<AclRule> {
-        let rel_path = format!(
-            "calendars/{calendarId}/acl/{ruleId}",
-            calendarId = percent_encode(
-                format!("{}", params.calendar_id).as_bytes(),
-                NON_ALPHANUMERIC
-            ),
-            ruleId = percent_encode(format!("{}", params.rule_id).as_bytes(), NON_ALPHANUMERIC)
-        );
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[CalendarScopes::Calendar.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.calendar_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-
-        let opt_request: Option<&EmptyRequest> = None;
-        let opt_request = Some(req);
-        do_request(&self.client, &full_uri, &headers, "PUT", opt_request).await
-    }
-
-    /// Updates an access control rule. This method supports patch semantics.
-    pub async fn patch(&self, params: &AclPatchParams, req: &AclRule) -> Result<AclRule> {
-        let rel_path = format!(
-            "calendars/{calendarId}/acl/{ruleId}",
-            calendarId = percent_encode(
-                format!("{}", params.calendar_id).as_bytes(),
-                NON_ALPHANUMERIC
-            ),
-            ruleId = percent_encode(format!("{}", params.rule_id).as_bytes(), NON_ALPHANUMERIC)
-        );
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[CalendarScopes::Calendar.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.calendar_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, "PATCH", opt_request).await
-    }
-}
-
-/// The Calendar Calendars service represents the Calendars resource.
-pub struct CalendarsService {
-    client: TlsClient,
-    authenticator: Box<dyn 'static + DerefAuth>,
-    scopes: Vec<String>,
-
-    base_url: String,
-    root_url: String,
-}
-
-impl CalendarsService {
-    /// Create a new CalendarsService object. The easiest way to call this is wrapping the Authenticator
-    /// into an `Arc`: `new(client.clone(), Arc::new(authenticator))`.
-    /// This way, one authenticator can be shared among several services.
-    pub fn new<A: 'static + DerefAuth>(client: TlsClient, auth: A) -> CalendarsService {
-        CalendarsService {
-            client: client,
-            authenticator: Box::new(auth),
-            scopes: vec![],
-            base_url: "https://www.googleapis.com/calendar/v3/".into(),
-            root_url: "https://www.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 CalendarScopes 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();
-    }
-
-    /// Creates a secondary calendar.
-    pub async fn insert(&self, params: &CalendarsInsertParams, req: &Calendar) -> Result<Calendar> {
-        let rel_path = format!("calendars",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[CalendarScopes::Calendar.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.calendar_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 metadata for a calendar. This method supports patch semantics.
-    pub async fn patch(&self, params: &CalendarsPatchParams, req: &Calendar) -> Result<Calendar> {
-        let rel_path = format!(
-            "calendars/{calendarId}",
-            calendarId = percent_encode(
-                format!("{}", params.calendar_id).as_bytes(),
-                NON_ALPHANUMERIC
-            )
-        );
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[CalendarScopes::Calendar.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.calendar_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, "PATCH", opt_request).await
-    }
-
-    /// Deletes a secondary calendar. Use calendars.clear for clearing all events on primary calendars.
-    pub async fn delete(&self, params: &CalendarsDeleteParams) -> Result<()> {
-        let rel_path = format!(
-            "calendars/{calendarId}",
-            calendarId = percent_encode(
-                format!("{}", params.calendar_id).as_bytes(),
-                NON_ALPHANUMERIC
-            )
-        );
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[CalendarScopes::Calendar.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.calendar_params {
-            url_params.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
-    }
-
-    /// Clears a primary calendar. This operation deletes all events associated with the primary calendar of an account.
-    pub async fn clear(&self, params: &CalendarsClearParams) -> Result<()> {
-        let rel_path = format!(
-            "calendars/{calendarId}/clear",
-            calendarId = percent_encode(
-                format!("{}", params.calendar_id).as_bytes(),
-                NON_ALPHANUMERIC
-            )
-        );
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[CalendarScopes::Calendar.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.calendar_params {
-            url_params.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
-    }
-
-    /// Returns metadata for a calendar.
-    pub async fn get(&self, params: &CalendarsGetParams) -> Result<Calendar> {
-        let rel_path = format!(
-            "calendars/{calendarId}",
-            calendarId = percent_encode(
-                format!("{}", params.calendar_id).as_bytes(),
-                NON_ALPHANUMERIC
-            )
-        );
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[CalendarScopes::CalendarReadonly.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.calendar_params {
-            url_params.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 metadata for a calendar.
-    pub async fn update(&self, params: &CalendarsUpdateParams, req: &Calendar) -> Result<Calendar> {
-        let rel_path = format!(
-            "calendars/{calendarId}",
-            calendarId = percent_encode(
-                format!("{}", params.calendar_id).as_bytes(),
-                NON_ALPHANUMERIC
-            )
-        );
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[CalendarScopes::Calendar.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.calendar_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 Calendar CalendarList service represents the CalendarList resource.
-pub struct CalendarListService {
-    client: TlsClient,
-    authenticator: Box<dyn 'static + DerefAuth>,
-    scopes: Vec<String>,
-
-    base_url: String,
-    root_url: String,
-}
-
-impl CalendarListService {
-    /// Create a new CalendarListService object. The easiest way to call this is wrapping the Authenticator
-    /// into an `Arc`: `new(client.clone(), Arc::new(authenticator))`.
-    /// This way, one authenticator can be shared among several services.
-    pub fn new<A: 'static + DerefAuth>(client: TlsClient, auth: A) -> CalendarListService {
-        CalendarListService {
-            client: client,
-            authenticator: Box::new(auth),
-            scopes: vec![],
-            base_url: "https://www.googleapis.com/calendar/v3/".into(),
-            root_url: "https://www.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 CalendarScopes 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();
-    }
-
-    /// Returns a calendar from the user's calendar list.
-    pub async fn get(&self, params: &CalendarListGetParams) -> Result<CalendarListEntry> {
-        let rel_path = format!(
-            "users/me/calendarList/{calendarId}",
-            calendarId = percent_encode(
-                format!("{}", params.calendar_id).as_bytes(),
-                NON_ALPHANUMERIC
-            )
-        );
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[CalendarScopes::CalendarReadonly.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.calendar_params {
-            url_params.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 an existing calendar into the user's calendar list.
-    pub async fn insert(
-        &self,
-        params: &CalendarListInsertParams,
-        req: &CalendarListEntry,
-    ) -> Result<CalendarListEntry> {
-        let rel_path = format!("users/me/calendarList",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[CalendarScopes::Calendar.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.calendar_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 calendar on the user's calendar list. This method supports patch semantics.
-    pub async fn patch(
-        &self,
-        params: &CalendarListPatchParams,
-        req: &CalendarListEntry,
-    ) -> Result<CalendarListEntry> {
-        let rel_path = format!(
-            "users/me/calendarList/{calendarId}",
-            calendarId = percent_encode(
-                format!("{}", params.calendar_id).as_bytes(),
-                NON_ALPHANUMERIC
-            )
-        );
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[CalendarScopes::Calendar.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.calendar_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, "PATCH", opt_request).await
-    }
-
-    /// Returns the calendars on the user's calendar list.
-    pub async fn list(&self, params: &CalendarListListParams) -> Result<CalendarList> {
-        let rel_path = format!("users/me/calendarList",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[CalendarScopes::CalendarReadonly.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.calendar_params {
-            url_params.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
-    }
-
-    /// Watch for changes to CalendarList resources.
-    pub async fn watch(&self, params: &CalendarListWatchParams, req: &Channel) -> Result<Channel> {
-        let rel_path = format!("users/me/calendarList/watch",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[CalendarScopes::CalendarReadonly.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.calendar_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 calendar on the user's calendar list.
-    pub async fn update(
-        &self,
-        params: &CalendarListUpdateParams,
-        req: &CalendarListEntry,
-    ) -> Result<CalendarListEntry> {
-        let rel_path = format!(
-            "users/me/calendarList/{calendarId}",
-            calendarId = percent_encode(
-                format!("{}", params.calendar_id).as_bytes(),
-                NON_ALPHANUMERIC
-            )
-        );
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[CalendarScopes::Calendar.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.calendar_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
-    }
-
-    /// Removes a calendar from the user's calendar list.
-    pub async fn delete(&self, params: &CalendarListDeleteParams) -> Result<()> {
-        let rel_path = format!(
-            "users/me/calendarList/{calendarId}",
-            calendarId = percent_encode(
-                format!("{}", params.calendar_id).as_bytes(),
-                NON_ALPHANUMERIC
-            )
-        );
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[CalendarScopes::Calendar.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.calendar_params {
-            url_params.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 Calendar Settings service represents the Settings resource.
 pub struct SettingsService {
     client: TlsClient,
@@ -4627,69 +5085,6 @@
             .collect();
     }
 
-    /// Watch for changes to Settings resources.
-    pub async fn watch(&self, params: &SettingsWatchParams, req: &Channel) -> Result<Channel> {
-        let rel_path = format!("users/me/settings/watch",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[CalendarScopes::CalendarSettingsReadonly
-                .as_ref()
-                .to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.calendar_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
-    }
-
-    /// Returns all user settings for the authenticated user.
-    pub async fn list(&self, params: &SettingsListParams) -> Result<Settings> {
-        let rel_path = format!("users/me/settings",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[CalendarScopes::CalendarSettingsReadonly
-                .as_ref()
-                .to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.calendar_params {
-            url_params.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
-    }
-
     /// Returns a single user setting.
     pub async fn get(&self, params: &SettingsGetParams) -> Result<Setting> {
         let rel_path = format!(
@@ -4723,91 +5118,18 @@
         let opt_request: Option<&EmptyRequest> = None;
         do_request(&self.client, &full_uri, &headers, "GET", opt_request).await
     }
-}
-
-/// The Calendar Events service represents the Events resource.
-pub struct EventsService {
-    client: TlsClient,
-    authenticator: Box<dyn 'static + DerefAuth>,
-    scopes: Vec<String>,
-
-    base_url: String,
-    root_url: String,
-}
-
-impl EventsService {
-    /// Create a new EventsService object. The easiest way to call this is wrapping the Authenticator
-    /// into an `Arc`: `new(client.clone(), Arc::new(authenticator))`.
-    /// This way, one authenticator can be shared among several services.
-    pub fn new<A: 'static + DerefAuth>(client: TlsClient, auth: A) -> EventsService {
-        EventsService {
-            client: client,
-            authenticator: Box::new(auth),
-            scopes: vec![],
-            base_url: "https://www.googleapis.com/calendar/v3/".into(),
-            root_url: "https://www.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 CalendarScopes 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();
-    }
-
-    /// Returns instances of the specified recurring event.
-    pub async fn instances(&self, params: &EventsInstancesParams) -> Result<Events> {
-        let rel_path = format!(
-            "calendars/{calendarId}/events/{eventId}/instances",
-            calendarId = percent_encode(
-                format!("{}", params.calendar_id).as_bytes(),
-                NON_ALPHANUMERIC
-            ),
-            eventId = percent_encode(format!("{}", params.event_id).as_bytes(), NON_ALPHANUMERIC)
-        );
+
+    /// Returns all user settings for the authenticated user.
+    pub async fn list(&self, params: &SettingsListParams) -> Result<Settings> {
+        let rel_path = format!("users/me/settings",);
         let path = self.format_path(rel_path.as_str());
 
         let mut headers = vec![];
         let tok;
         if self.scopes.is_empty() {
-            let scopes = &[CalendarScopes::CalendarReadonly.as_ref().to_string()];
+            let scopes = &[CalendarScopes::CalendarSettingsReadonly
+                .as_ref()
+                .to_string()];
             tok = self.authenticator.token(scopes).await?;
         } else {
             tok = self.authenticator.token(&self.scopes).await?;
@@ -4828,57 +5150,17 @@
         do_request(&self.client, &full_uri, &headers, "GET", opt_request).await
     }
 
-    /// Moves an event to another calendar, i.e. changes an event's organizer.
-    pub async fn move_(&self, params: &EventsMoveParams) -> Result<Event> {
-        let rel_path = format!(
-            "calendars/{calendarId}/events/{eventId}/move",
-            calendarId = percent_encode(
-                format!("{}", params.calendar_id).as_bytes(),
-                NON_ALPHANUMERIC
-            ),
-            eventId = percent_encode(format!("{}", params.event_id).as_bytes(), NON_ALPHANUMERIC)
-        );
+    /// Watch for changes to Settings resources.
+    pub async fn watch(&self, params: &SettingsWatchParams, req: &Channel) -> Result<Channel> {
+        let rel_path = format!("users/me/settings/watch",);
         let path = self.format_path(rel_path.as_str());
 
         let mut headers = vec![];
         let tok;
         if self.scopes.is_empty() {
-            let scopes = &[CalendarScopes::CalendarEvents.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.calendar_params {
-            url_params.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
-    }
-
-    /// Watch for changes to Events resources.
-    pub async fn watch(&self, params: &EventsWatchParams, req: &Channel) -> Result<Channel> {
-        let rel_path = format!(
-            "calendars/{calendarId}/events/watch",
-            calendarId = percent_encode(
-                format!("{}", params.calendar_id).as_bytes(),
-                NON_ALPHANUMERIC
-            )
-        );
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[CalendarScopes::CalendarReadonly.as_ref().to_string()];
+            let scopes = &[CalendarScopes::CalendarSettingsReadonly
+                .as_ref()
+                .to_string()];
             tok = self.authenticator.token(scopes).await?;
         } else {
             tok = self.authenticator.token(&self.scopes).await?;
@@ -4899,292 +5181,4 @@
         let opt_request = Some(req);
         do_request(&self.client, &full_uri, &headers, "POST", opt_request).await
     }
-
-    /// Returns events on the specified calendar.
-    pub async fn list(&self, params: &EventsListParams) -> Result<Events> {
-        let rel_path = format!(
-            "calendars/{calendarId}/events",
-            calendarId = percent_encode(
-                format!("{}", params.calendar_id).as_bytes(),
-                NON_ALPHANUMERIC
-            )
-        );
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[CalendarScopes::CalendarReadonly.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.calendar_params {
-            url_params.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 event.
-    pub async fn update(&self, params: &EventsUpdateParams, req: &Event) -> Result<Event> {
-        let rel_path = format!(
-            "calendars/{calendarId}/events/{eventId}",
-            calendarId = percent_encode(
-                format!("{}", params.calendar_id).as_bytes(),
-                NON_ALPHANUMERIC
-            ),
-            eventId = percent_encode(format!("{}", params.event_id).as_bytes(), NON_ALPHANUMERIC)
-        );
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[CalendarScopes::CalendarEvents.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.calendar_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-
-        let opt_request: Option<&EmptyRequest> = None;
-        let opt_request = Some(req);
-        do_request(&self.client, &full_uri, &headers, "PUT", opt_request).await
-    }
-
-    /// Updates an event. This method supports patch semantics.
-    pub async fn patch(&self, params: &EventsPatchParams, req: &Event) -> Result<Event> {
-        let rel_path = format!(
-            "calendars/{calendarId}/events/{eventId}",
-            calendarId = percent_encode(
-                format!("{}", params.calendar_id).as_bytes(),
-                NON_ALPHANUMERIC
-            ),
-            eventId = percent_encode(format!("{}", params.event_id).as_bytes(), NON_ALPHANUMERIC)
-        );
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[CalendarScopes::CalendarEvents.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.calendar_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, "PATCH", opt_request).await
-    }
-
-    /// Creates an event based on a simple text string.
-    pub async fn quick_add(&self, params: &EventsQuickAddParams) -> Result<Event> {
-        let rel_path = format!(
-            "calendars/{calendarId}/events/quickAdd",
-            calendarId = percent_encode(
-                format!("{}", params.calendar_id).as_bytes(),
-                NON_ALPHANUMERIC
-            )
-        );
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[CalendarScopes::CalendarEvents.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.calendar_params {
-            url_params.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
-    }
-
-    /// Returns an event.
-    pub async fn get(&self, params: &EventsGetParams) -> Result<Event> {
-        let rel_path = format!(
-            "calendars/{calendarId}/events/{eventId}",
-            calendarId = percent_encode(
-                format!("{}", params.calendar_id).as_bytes(),
-                NON_ALPHANUMERIC
-            ),
-            eventId = percent_encode(format!("{}", params.event_id).as_bytes(), NON_ALPHANUMERIC)
-        );
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[CalendarScopes::CalendarReadonly.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.calendar_params {
-            url_params.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
-    }
-
-    /// Creates an event.
-    pub async fn insert(&self, params: &EventsInsertParams, req: &Event) -> Result<Event> {
-        let rel_path = format!(
-            "calendars/{calendarId}/events",
-            calendarId = percent_encode(
-                format!("{}", params.calendar_id).as_bytes(),
-                NON_ALPHANUMERIC
-            )
-        );
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[CalendarScopes::CalendarEvents.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.calendar_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
-    }
-
-    /// Imports an event. This operation is used to add a private copy of an existing event to a calendar.
-    pub async fn import(&self, params: &EventsImportParams, req: &Event) -> Result<Event> {
-        let rel_path = format!(
-            "calendars/{calendarId}/events/import",
-            calendarId = percent_encode(
-                format!("{}", params.calendar_id).as_bytes(),
-                NON_ALPHANUMERIC
-            )
-        );
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[CalendarScopes::CalendarEvents.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.calendar_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-
-        let opt_request: Option<&EmptyRequest> = None;
-        let opt_request = Some(req);
-        do_request(&self.client, &full_uri, &headers, "POST", opt_request).await
-    }
-
-    /// Deletes an event.
-    pub async fn delete(&self, params: &EventsDeleteParams) -> Result<()> {
-        let rel_path = format!(
-            "calendars/{calendarId}/events/{eventId}",
-            calendarId = percent_encode(
-                format!("{}", params.calendar_id).as_bytes(),
-                NON_ALPHANUMERIC
-            ),
-            eventId = percent_encode(format!("{}", params.event_id).as_bytes(), NON_ALPHANUMERIC)
-        );
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[CalendarScopes::CalendarEvents.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.calendar_params {
-            url_params.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
-    }
 }
--- a/example_crates/drive_example/src/drive_v3_types.rs	Thu Mar 04 12:03:20 2021 +0100
+++ b/example_crates/drive_example/src/drive_v3_types.rs	Thu Mar 04 12:03:36 2021 +0100
@@ -25,7 +25,7 @@
     ///
     /// URL: https://www.googleapis.com/auth/drive
     Drive,
-    /// See, create, and delete its own configuration data in your Google Drive
+    /// View and manage its own configuration data in your Google Drive
     ///
     /// URL: https://www.googleapis.com/auth/drive.appdata
     DriveAppdata,
@@ -37,7 +37,7 @@
     ///
     /// URL: https://www.googleapis.com/auth/drive.metadata
     DriveMetadata,
-    /// See information about your Google Drive files
+    /// View metadata for files in your Google Drive
     ///
     /// URL: https://www.googleapis.com/auth/drive.metadata.readonly
     DriveMetadataReadonly,
@@ -893,7 +893,7 @@
 #[derive(Serialize, Deserialize, Debug, Clone, Default)]
 pub struct File {
     /// A collection of arbitrary key-value pairs which are private to the requesting app.
-    /// Entries with null values are cleared in update and copy requests. These properties can only be retrieved using an authenticated request. An authenticated request uses an access token obtained with a OAuth 2 client ID. You cannot use an API key to retrieve private properties.
+    /// Entries with null values are cleared in update and copy requests.
     #[serde(rename = "appProperties")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub app_properties: Option<HashMap<String, String>>,
@@ -929,7 +929,7 @@
     #[serde(rename = "explicitlyTrashed")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub explicitly_trashed: Option<bool>,
-    /// Links for exporting Docs Editors files to specific formats.
+    /// Links for exporting Google Docs to specific formats.
     #[serde(rename = "exportLinks")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub export_links: Option<HashMap<String, String>>,
@@ -1058,7 +1058,7 @@
     #[serde(rename = "shortcutDetails")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub shortcut_details: Option<FileShortcutDetails>,
-    /// i64: The size of the file's content in bytes. This is applicable to binary files in Google Drive and Google Docs files.
+    /// i64: The size of the file's content in bytes. This is only applicable to files with binary content in Google Drive.
     #[serde(rename = "size")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub size: Option<String>,
@@ -1369,7 +1369,7 @@
 /// The metadata for a revision to a file.
 #[derive(Serialize, Deserialize, Debug, Clone, Default)]
 pub struct Revision {
-    /// Links for exporting Docs Editors files to specific formats.
+    /// Links for exporting Google Docs to specific formats.
     #[serde(rename = "exportLinks")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub export_links: Option<HashMap<String, String>>,
@@ -1405,11 +1405,11 @@
     #[serde(rename = "originalFilename")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub original_filename: Option<String>,
-    /// Whether subsequent revisions will be automatically republished. This is only applicable to Docs Editors files.
+    /// Whether subsequent revisions will be automatically republished. This is only applicable to Google Docs.
     #[serde(rename = "publishAuto")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub publish_auto: Option<bool>,
-    /// Whether this revision is published. This is only applicable to Docs Editors files.
+    /// Whether this revision is published. This is only applicable to Google Docs.
     #[serde(rename = "published")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub published: Option<bool>,
@@ -1417,7 +1417,7 @@
     #[serde(rename = "publishedLink")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub published_link: Option<String>,
-    /// Whether this revision is published outside the domain. This is only applicable to Docs Editors files.
+    /// Whether this revision is published outside the domain. This is only applicable to Google Docs.
     #[serde(rename = "publishedOutsideDomain")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub published_outside_domain: Option<bool>,
@@ -2422,7 +2422,7 @@
     /// General attributes applying to any API call
     #[serde(flatten)]
     pub drive_params: Option<DriveParams>,
-    /// Deprecated. Copying files into multiple folders is no longer supported. Use shortcuts instead.
+    /// Set to true to opt in to API behavior that aims for all items to have exactly one parent. This parameter only takes effect if the item is not in a shared drive. Requests that specify more than one parent fail.
     #[serde(rename = "enforceSingleParent")]
     pub enforce_single_parent: Option<bool>,
     /// The ID of the file.
@@ -2509,7 +2509,7 @@
     /// General attributes applying to any API call
     #[serde(flatten)]
     pub drive_params: Option<DriveParams>,
-    /// Deprecated. Creating files in multiple folders is no longer supported.
+    /// Set to true to opt in to API behavior that aims for all items to have exactly one parent. This parameter only takes effect if the item is not in a shared drive. Requests that specify more than one parent fail.
     #[serde(rename = "enforceSingleParent")]
     pub enforce_single_parent: Option<bool>,
     /// Whether to ignore the domain's default visibility settings for the created file. Domain administrators can choose to make all uploaded files visible to the domain by default; this parameter bypasses that behavior for the request. Permissions are still inherited from parent folders.
@@ -2603,7 +2603,7 @@
     /// General attributes applying to any API call
     #[serde(flatten)]
     pub drive_params: Option<DriveParams>,
-    /// Deprecated. If an item is not in a shared drive and its last parent is deleted but the item itself is not, the item will be placed under its owner's root.
+    /// Set to true to opt in to API behavior that aims for all items to have exactly one parent. This parameter will only take effect if the item is not in a shared drive. If an item's last parent is deleted but the item itself is not, the item will be placed under its owner's root.
     #[serde(rename = "enforceSingleParent")]
     pub enforce_single_parent: Option<bool>,
     /// The ID of the file.
@@ -2650,7 +2650,7 @@
     /// General attributes applying to any API call
     #[serde(flatten)]
     pub drive_params: Option<DriveParams>,
-    /// Deprecated. If an item is not in a shared drive and its last parent is deleted but the item itself is not, the item will be placed under its owner's root.
+    /// Set to true to opt in to API behavior that aims for all items to have exactly one parent. This parameter will only take effect if the item is not in a shared drive. If an item's last parent is deleted but the item itself is not, the item will be placed under its owner's root.
     #[serde(rename = "enforceSingleParent")]
     pub enforce_single_parent: Option<bool>,
 }
@@ -2947,7 +2947,7 @@
     /// A comma-separated list of parent IDs to add.
     #[serde(rename = "addParents")]
     pub add_parents: Option<String>,
-    /// Deprecated. Adding files to multiple folders is no longer supported. Use shortcuts instead.
+    /// Set to true to opt in to API behavior that aims for all items to have exactly one parent. This parameter only takes effect if the item is not in a shared drive. If the item's owner makes a request to add a single parent, the item is removed from all current folders and placed in the requested folder. Other requests that increase the number of parents fail, except when the canAddMyDriveParent file capability is true and a single parent is being added.
     #[serde(rename = "enforceSingleParent")]
     pub enforce_single_parent: Option<bool>,
     /// The ID of the file.
@@ -3111,13 +3111,13 @@
     /// A plain text custom message to include in the notification email.
     #[serde(rename = "emailMessage")]
     pub email_message: Option<String>,
-    /// Deprecated. See moveToNewOwnersRoot for details.
+    /// Set to true to opt in to API behavior that aims for all items to have exactly one parent. This parameter only takes effect if the item is not in a shared drive. See moveToNewOwnersRoot for details.
     #[serde(rename = "enforceSingleParent")]
     pub enforce_single_parent: Option<bool>,
     /// The ID of the file or shared drive.
     #[serde(rename = "fileId")]
     pub file_id: String,
-    /// This parameter will only take effect if the item is not in a shared drive and the request is attempting to transfer the ownership of the item. If set to true, the item will be moved to the new owner's My Drive root folder and all prior parents removed. If set to false, parents are not changed.
+    /// This parameter only takes effect if the item is not in a shared drive and the request is attempting to transfer the ownership of the item. When set to true, the item is moved to the new owner's My Drive root folder and all prior parents removed. If set to false, when enforceSingleParent=true, parents are not changed. If set to false, when enforceSingleParent=false, existing parents are not changed; however, the file will be added to the new owner's My Drive root folder, unless it is already in the new owner's My Drive.
     #[serde(rename = "moveToNewOwnersRoot")]
     pub move_to_new_owners_root: Option<bool>,
     /// Whether to send a notification email when sharing to users or groups. This defaults to true for users and groups, and is not allowed for other requests. It must not be disabled for ownership transfers.
--- a/example_crates/gcs_example/src/storage_v1_types.rs	Thu Mar 04 12:03:20 2021 +0100
+++ b/example_crates/gcs_example/src/storage_v1_types.rs	Thu Mar 04 12:03:36 2021 +0100
@@ -138,10 +138,6 @@
     #[serde(rename = "uniformBucketLevelAccess")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub uniform_bucket_level_access: Option<BucketIamConfigurationUniformBucketLevelAccess>,
-    /// The bucket's Public Access Prevention configuration. Currently, 'unspecified' and 'enforced' are supported.
-    #[serde(rename = "publicAccessPrevention")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub public_access_prevention: Option<String>,
 }
 
 /// The action to take.
@@ -399,10 +395,6 @@
     #[serde(rename = "zoneAffinity")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub zone_affinity: Option<Vec<String>>,
-    /// Reserved for future use.
-    #[serde(rename = "satisfiesPZS")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub satisfies_p_z_s: Option<bool>,
 }
 
 /// The project team associated with the entity, if any.
--- a/example_crates/youtube_example/src/youtube_v3_types.rs	Thu Mar 04 12:03:20 2021 +0100
+++ b/example_crates/youtube_example/src/youtube_v3_types.rs	Thu Mar 04 12:03:36 2021 +0100
@@ -21,56 +21,310 @@
 /// Scopes of this API. Convertible to their string representation with `AsRef`.
 #[derive(Debug, Clone, Copy)]
 pub enum YoutubeScopes {
+    /// Manage your YouTube account
+    ///
+    /// URL: https://www.googleapis.com/auth/youtube
+    Youtube,
+    /// See a list of your current active channel members, their current level, and when they became a member
+    ///
+    /// URL: https://www.googleapis.com/auth/youtube.channel-memberships.creator
+    YoutubeChannelMembershipsCreator,
     /// See, edit, and permanently delete your YouTube videos, ratings, comments and captions
     ///
     /// URL: https://www.googleapis.com/auth/youtube.force-ssl
     YoutubeForceSsl,
-    /// See a list of your current active channel members, their current level, and when they became a member
+    /// View your YouTube account
     ///
-    /// URL: https://www.googleapis.com/auth/youtube.channel-memberships.creator
-    YoutubeChannelMembershipsCreator,
+    /// URL: https://www.googleapis.com/auth/youtube.readonly
+    YoutubeReadonly,
     /// Manage your YouTube videos
     ///
     /// URL: https://www.googleapis.com/auth/youtube.upload
     YoutubeUpload,
-    /// View your YouTube account
+    /// View and manage your assets and associated content on YouTube
     ///
-    /// URL: https://www.googleapis.com/auth/youtube.readonly
-    YoutubeReadonly,
+    /// URL: https://www.googleapis.com/auth/youtubepartner
+    Youtubepartner,
     /// View private information of your YouTube channel relevant during the audit process with a YouTube partner
     ///
     /// URL: https://www.googleapis.com/auth/youtubepartner-channel-audit
     YoutubepartnerChannelAudit,
-    /// Manage your YouTube account
-    ///
-    /// URL: https://www.googleapis.com/auth/youtube
-    Youtube,
-    /// View and manage your assets and associated content on YouTube
-    ///
-    /// URL: https://www.googleapis.com/auth/youtubepartner
-    Youtubepartner,
 }
 
 impl std::convert::AsRef<str> for YoutubeScopes {
     fn as_ref(&self) -> &'static str {
         match self {
-            YoutubeScopes::YoutubeForceSsl => "https://www.googleapis.com/auth/youtube.force-ssl",
+            YoutubeScopes::Youtube => "https://www.googleapis.com/auth/youtube",
             YoutubeScopes::YoutubeChannelMembershipsCreator => {
                 "https://www.googleapis.com/auth/youtube.channel-memberships.creator"
             }
+            YoutubeScopes::YoutubeForceSsl => "https://www.googleapis.com/auth/youtube.force-ssl",
+            YoutubeScopes::YoutubeReadonly => "https://www.googleapis.com/auth/youtube.readonly",
             YoutubeScopes::YoutubeUpload => "https://www.googleapis.com/auth/youtube.upload",
-            YoutubeScopes::YoutubeReadonly => "https://www.googleapis.com/auth/youtube.readonly",
+            YoutubeScopes::Youtubepartner => "https://www.googleapis.com/auth/youtubepartner",
             YoutubeScopes::YoutubepartnerChannelAudit => {
                 "https://www.googleapis.com/auth/youtubepartner-channel-audit"
             }
-            YoutubeScopes::Youtube => "https://www.googleapis.com/auth/youtube",
-            YoutubeScopes::Youtubepartner => "https://www.googleapis.com/auth/youtubepartner",
-        }
-    }
-}
-
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct LiveChatMessageListResponse {
+        }
+    }
+}
+
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct AbuseReport {
+    #[serde(rename = "abuseTypes")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub abuse_types: Option<Vec<AbuseType>>,
+    #[serde(rename = "description")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub description: Option<String>,
+    #[serde(rename = "relatedEntities")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub related_entities: Option<Vec<RelatedEntity>>,
+    #[serde(rename = "subject")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub subject: Option<Entity>,
+}
+
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct AbuseType {
+    #[serde(rename = "id")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub id: Option<String>,
+}
+
+/// Rights management policy for YouTube resources.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct AccessPolicy {
+    /// 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 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>>,
+}
+
+/// An *activity* resource contains information about an action that a particular channel, or user, has taken on YouTube.The actions reported in activity feeds include rating a video, sharing a video, marking a video as a favorite, commenting on a video, uploading a video, and so forth. Each activity resource identifies the type of action, the channel associated with the action, and the resource(s) associated with the action, such as the video that was rated or uploaded.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct Activity {
+    #[serde(rename = "contentDetails")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub content_details: Option<ActivityContentDetails>,
+    /// Etag of this resource
+    #[serde(rename = "etag")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub etag: Option<String>,
+    /// The ID that YouTube uses to uniquely identify the activity.
+    #[serde(rename = "id")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub id: Option<String>,
+    /// Identifies what kind of resource this is. Value: the fixed string "youtube#activity".
+    #[serde(rename = "kind")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub kind: Option<String>,
+    #[serde(rename = "snippet")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub snippet: Option<ActivitySnippet>,
+}
+
+/// 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 = "bulletin")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub bulletin: Option<ActivityContentDetailsBulletin>,
+    #[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 = "favorite")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub favorite: Option<ActivityContentDetailsFavorite>,
+    #[serde(rename = "like")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub like: Option<ActivityContentDetailsLike>,
+    #[serde(rename = "playlistItem")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub playlist_item: Option<ActivityContentDetailsPlaylistItem>,
+    #[serde(rename = "promotedItem")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub promoted_item: Option<ActivityContentDetailsPromotedItem>,
+    #[serde(rename = "recommendation")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub recommendation: Option<ActivityContentDetailsRecommendation>,
+    #[serde(rename = "social")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub social: Option<ActivityContentDetailsSocial>,
+    #[serde(rename = "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>,
+}
+
+/// 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>,
+}
+
+/// Details about a resource which was added to a channel.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct ActivityContentDetailsChannelItem {
+    #[serde(rename = "resourceId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub resource_id: Option<ResourceId>,
+}
+
+/// Information about a resource that received a comment.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct ActivityContentDetailsComment {
+    #[serde(rename = "resourceId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub resource_id: Option<ResourceId>,
+}
+
+/// Information about 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>,
+}
+
+/// 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>,
+}
+
+/// Information about a new playlist item.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct ActivityContentDetailsPlaylistItem {
+    /// The value that YouTube uses to uniquely identify the playlist.
+    #[serde(rename = "playlistId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub playlist_id: Option<String>,
+    /// ID of the item within the playlist.
+    #[serde(rename = "playlistItemId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub playlist_item_id: Option<String>,
+    #[serde(rename = "resourceId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub resource_id: Option<ResourceId>,
+}
+
+/// Details about a resource which is being promoted.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct ActivityContentDetailsPromotedItem {
+    /// The URL the client should fetch to request a promoted item.
+    #[serde(rename = "adTag")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub ad_tag: Option<String>,
+    /// The URL the client should ping to indicate that the user clicked through on this promoted item.
+    #[serde(rename = "clickTrackingUrl")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub click_tracking_url: Option<String>,
+    /// The 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 type of call-to-action, a message to the user indicating action that can be taken.
+    #[serde(rename = "ctaType")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub cta_type: Option<ActivityContentDetailsPromotedItemCtaType>,
+    /// The 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 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 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 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 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>,
+}
+
+/// Information that identifies the recommended resource.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct ActivityContentDetailsRecommendation {
+    /// The reason that the resource is recommended to the user.
+    #[serde(rename = "reason")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub reason: Option<ActivityContentDetailsRecommendationReason>,
+    #[serde(rename = "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>,
+}
+
+/// Details about a social network post.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct ActivityContentDetailsSocial {
+    /// The author of the social network post.
+    #[serde(rename = "author")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub author: Option<String>,
+    /// An image of the post's author.
+    #[serde(rename = "imageUrl")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub image_url: Option<String>,
+    /// The URL of the social network post.
+    #[serde(rename = "referenceUrl")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub reference_url: Option<String>,
+    #[serde(rename = "resourceId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub resource_id: Option<ResourceId>,
+    /// The name of the social network.
+    #[serde(rename = "type")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub type_: Option<ActivityContentDetailsSocialType>,
+}
+
+/// 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>,
+}
+
+/// Information about the uploaded video.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct ActivityContentDetailsUpload {
+    /// The ID that YouTube uses to uniquely identify the uploaded video.
+    #[serde(rename = "videoId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub video_id: Option<String>,
+}
+
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct ActivityListResponse {
     /// Etag of this resource.
     #[serde(rename = "etag")]
     #[serde(skip_serializing_if = "Option::is_none")]
@@ -79,570 +333,17 @@
     #[serde(rename = "eventId")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub event_id: Option<String>,
-    #[serde(rename = "nextPageToken")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub next_page_token: Option<String>,
-    #[serde(rename = "tokenPagination")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub token_pagination: Option<TokenPagination>,
     #[serde(rename = "items")]
     #[serde(skip_serializing_if = "Option::is_none")]
-    pub items: Option<Vec<LiveChatMessage>>,
-    /// Identifies what kind of resource this is. Value: the fixed string "youtube#liveChatMessageListResponse".
-    #[serde(rename = "kind")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub kind: Option<String>,
-    /// The amount of time the client should wait before polling again.
-    #[serde(rename = "pollingIntervalMillis")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub polling_interval_millis: Option<u32>,
-    /// DateTime: The date and time when the underlying stream went offline.
-    #[serde(rename = "offlineAt")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub offline_at: Option<DateTime<Utc>>,
-    /// The visitorId identifies the visitor.
-    #[serde(rename = "visitorId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub visitor_id: Option<String>,
-    #[serde(rename = "pageInfo")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub page_info: Option<PageInfo>,
-}
-
-/// A *playlistItem* resource identifies another resource, such as a video, that is included in a playlist. In addition, the playlistItem resource contains details about the included resource that pertain specifically to how that resource is used in that playlist. YouTube uses playlists to identify special collections of videos for a channel, such as: - uploaded videos - favorite videos - positively rated (liked) videos - watch history - watch later To be more specific, these lists are associated with a channel, which is a collection of a person, group, or company's videos, playlists, and other YouTube information. You can retrieve the playlist IDs for each of these lists from the channel resource for a given channel. You can then use the playlistItems.list method to retrieve any of those lists. You can also add or remove items from those lists by calling the playlistItems.insert and playlistItems.delete methods. For example, if a user gives a positive rating to a video, you would insert that video into the liked videos playlist for that user's channel.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct PlaylistItem {
-    /// The ID that YouTube uses to uniquely identify the playlist item.
-    #[serde(rename = "id")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub id: Option<String>,
-    #[serde(rename = "status")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub status: Option<PlaylistItemStatus>,
-    /// Etag of this resource.
-    #[serde(rename = "etag")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub etag: Option<String>,
-    #[serde(rename = "snippet")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub snippet: Option<PlaylistItemSnippet>,
-    #[serde(rename = "contentDetails")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub content_details: Option<PlaylistItemContentDetails>,
-    /// Identifies what kind of resource this is. Value: the fixed string "youtube#playlistItem".
-    #[serde(rename = "kind")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub kind: Option<String>,
-}
-
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct MembershipsDurationAtLevel {
-    /// The cumulative time the user has been a member for the given level in complete months (the time is rounded down to the nearest integer).
-    #[serde(rename = "memberTotalDurationMonths")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub member_total_duration_months: Option<i32>,
-    /// Pricing level ID.
-    #[serde(rename = "level")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub level: Option<String>,
-    /// The date and time when the user became a continuous member for the given level.
-    #[serde(rename = "memberSince")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub member_since: Option<String>,
-}
-
-/// Information about an audio stream.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct VideoFileDetailsAudioStream {
-    /// The number of audio channels that the stream contains.
-    #[serde(rename = "channelCount")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub channel_count: Option<u32>,
-    /// The audio codec that the stream uses.
-    #[serde(rename = "codec")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub codec: Option<String>,
-    /// u64: The audio stream's bitrate, in bits per second.
-    #[serde(rename = "bitrateBps")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub bitrate_bps: Option<String>,
-    /// A value that uniquely identifies a video vendor. Typically, the value is a four-letter vendor code.
-    #[serde(rename = "vendor")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub vendor: Option<String>,
-}
-
-/// Channel localization setting
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct ChannelLocalization {
-    /// The localized strings for channel's title.
-    #[serde(rename = "title")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub title: Option<String>,
-    /// The localized strings for channel's description.
-    #[serde(rename = "description")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub description: Option<String>,
-}
-
-/// Comments written in (direct or indirect) reply to the top level comment.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct CommentThreadReplies {
-    /// A limited number of replies. Unless the number of replies returned equals total_reply_count in the snippet the returned replies are only a subset of the total number of replies.
-    #[serde(rename = "comments")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub comments: Option<Vec<Comment>>,
-}
-
-/// Basic details about a channel section, including title, style and position.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct ChannelSectionSnippet {
-    /// The language of the channel section's default title and description.
-    #[serde(rename = "defaultLanguage")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub default_language: Option<String>,
-    #[serde(rename = "localized")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub localized: Option<ChannelSectionLocalization>,
-    /// The style of the channel section.
-    #[serde(rename = "style")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub style: Option<ChannelSectionSnippetStyle>,
-    /// The ID that YouTube uses to uniquely identify the channel that published the channel section.
-    #[serde(rename = "channelId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub channel_id: Option<String>,
-    /// The position of the channel section in the channel.
-    #[serde(rename = "position")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub position: Option<u32>,
-    /// The type of the channel section.
-    #[serde(rename = "type")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub type_: Option<ChannelSectionSnippetType>,
-    /// The channel section's title for multiple_playlists and multiple_channels.
-    #[serde(rename = "title")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub title: Option<String>,
-}
-
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct Entity {
-    #[serde(rename = "id")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub id: Option<String>,
-    #[serde(rename = "url")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub url: Option<String>,
-    #[serde(rename = "typeId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub type_id: Option<String>,
-}
-
-/// A *comment* represents a single YouTube comment.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct Comment {
-    /// Identifies what kind of resource this is. Value: the fixed string "youtube#comment".
+    pub items: Option<Vec<Activity>>,
+    /// Identifies what kind of resource this is. Value: the fixed string "youtube#activityListResponse".
     #[serde(rename = "kind")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub kind: Option<String>,
-    /// The ID that YouTube uses to uniquely identify the comment.
-    #[serde(rename = "id")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub id: Option<String>,
-    /// Etag of this resource.
-    #[serde(rename = "etag")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub etag: Option<String>,
-    #[serde(rename = "snippet")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub snippet: Option<CommentSnippet>,
-}
-
-/// A *video* resource represents a YouTube video.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct Video {
-    #[serde(rename = "projectDetails")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub project_details: Option<VideoProjectDetails>,
-    /// The ID that YouTube uses to uniquely identify the video.
-    #[serde(rename = "id")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub id: Option<String>,
-    /// Identifies what kind of resource this is. Value: the fixed string "youtube#video".
-    #[serde(rename = "kind")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub kind: Option<String>,
-    #[serde(rename = "statistics")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub statistics: Option<VideoStatistics>,
-    #[serde(rename = "suggestions")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub suggestions: Option<VideoSuggestions>,
-    /// The localizations object contains localized versions of the basic details about the video, such as its title and description.
-    #[serde(rename = "localizations")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub localizations: Option<HashMap<String, VideoLocalization>>,
-    #[serde(rename = "ageGating")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub age_gating: Option<VideoAgeGating>,
-    #[serde(rename = "recordingDetails")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub recording_details: Option<VideoRecordingDetails>,
-    /// Etag of this resource.
-    #[serde(rename = "etag")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub etag: Option<String>,
-    #[serde(rename = "player")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub player: Option<VideoPlayer>,
-    #[serde(rename = "contentDetails")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub content_details: Option<VideoContentDetails>,
-    #[serde(rename = "status")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub status: Option<VideoStatus>,
-    #[serde(rename = "fileDetails")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub file_details: Option<VideoFileDetails>,
-    #[serde(rename = "monetizationDetails")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub monetization_details: Option<VideoMonetizationDetails>,
-    #[serde(rename = "snippet")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub snippet: Option<VideoSnippet>,
-    #[serde(rename = "topicDetails")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub topic_details: Option<VideoTopicDetails>,
-    #[serde(rename = "processingDetails")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub processing_details: Option<VideoProcessingDetails>,
-    #[serde(rename = "liveStreamingDetails")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub live_streaming_details: Option<VideoLiveStreamingDetails>,
-}
-
-/// Basic details about a playlist, including title, description and thumbnails.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct PlaylistSnippet {
-    /// Note: if the playlist has a custom thumbnail, this field will not be populated. The video id selected by the user that will be used as the thumbnail of this playlist. This field defaults to the first publicly viewable video in the playlist, if: 1. The user has never selected a video to be the thumbnail of the playlist. 2. The user selects a video to be the thumbnail, and then removes that video from the playlist. 3. The user selects a non-owned video to be the thumbnail, but that video becomes private, or gets deleted.
-    #[serde(rename = "thumbnailVideoId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub thumbnail_video_id: Option<String>,
-    /// The language of the playlist's default title and description.
-    #[serde(rename = "defaultLanguage")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub default_language: Option<String>,
-    /// The channel title of the channel that the video belongs to.
-    #[serde(rename = "channelTitle")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub channel_title: Option<String>,
-    /// Keyword tags associated with the playlist.
-    #[serde(rename = "tags")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub tags: Option<Vec<String>>,
-    /// The playlist's title.
-    #[serde(rename = "title")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub title: Option<String>,
-    /// The ID that YouTube uses to uniquely identify the channel that published the playlist.
-    #[serde(rename = "channelId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub channel_id: Option<String>,
-    /// DateTime: The date and time that the playlist was created.
-    #[serde(rename = "publishedAt")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub published_at: Option<DateTime<Utc>>,
-    #[serde(rename = "localized")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub localized: Option<PlaylistLocalization>,
-    #[serde(rename = "thumbnails")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub thumbnails: Option<ThumbnailDetails>,
-    /// The playlist's description.
-    #[serde(rename = "description")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub description: Option<String>,
-}
-
-/// Information about the playlist item's privacy status.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct PlaylistItemStatus {
-    /// This resource's privacy status.
-    #[serde(rename = "privacyStatus")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub privacy_status: Option<PlaylistItemStatusPrivacyStatus>,
-}
-
-/// Basic details about a comment thread.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct CommentThreadSnippet {
-    /// The ID of the video the comments refer to, if any. No video_id implies a channel discussion comment.
-    #[serde(rename = "videoId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub video_id: Option<String>,
-    /// Whether the thread (and therefore all its comments) is visible to all YouTube users.
-    #[serde(rename = "isPublic")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub is_public: Option<bool>,
-    /// The total number of replies (not including the top level comment).
-    #[serde(rename = "totalReplyCount")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub total_reply_count: Option<u32>,
-    /// Whether the current viewer of the thread can reply to it. This is viewer specific - other viewers may see a different value for this field.
-    #[serde(rename = "canReply")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub can_reply: Option<bool>,
-    /// The YouTube channel the comments in the thread refer to or the channel with the video the comments refer to. If video_id isn't set the comments refer to the channel itself.
-    #[serde(rename = "channelId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub channel_id: Option<String>,
-    #[serde(rename = "topLevelComment")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub top_level_comment: Option<Comment>,
-}
-
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct I18nRegionListResponse {
-    /// Serialized EventId of the request which produced this response.
-    #[serde(rename = "eventId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub event_id: Option<String>,
-    /// Etag of this resource.
-    #[serde(rename = "etag")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub etag: Option<String>,
-    /// The visitorId identifies the visitor.
-    #[serde(rename = "visitorId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub visitor_id: Option<String>,
-    /// A list of regions where YouTube is available. In this map, the i18n region ID is the map key, and its value is the corresponding i18nRegion resource.
-    #[serde(rename = "items")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub items: Option<Vec<I18nRegion>>,
-    /// Identifies what kind of resource this is. Value: the fixed string "youtube#i18nRegionListResponse".
-    #[serde(rename = "kind")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub kind: Option<String>,
-}
-
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct PlaylistListResponse {
-    #[serde(rename = "tokenPagination")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub token_pagination: Option<TokenPagination>,
-    /// The token that can be used as the value of the pageToken parameter to retrieve the previous page in the result set.
-    #[serde(rename = "prevPageToken")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub prev_page_token: Option<String>,
-    /// Serialized EventId of the request which produced this response.
-    #[serde(rename = "eventId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub event_id: Option<String>,
-    /// Identifies what kind of resource this is. Value: the fixed string "youtube#playlistListResponse".
-    #[serde(rename = "kind")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub kind: Option<String>,
-    /// The visitorId identifies the visitor.
-    #[serde(rename = "visitorId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub visitor_id: Option<String>,
     /// The token that can be used as the value of the pageToken parameter to retrieve the next page in the result set.
     #[serde(rename = "nextPageToken")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub next_page_token: Option<String>,
-    /// Etag of this resource.
-    #[serde(rename = "etag")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub etag: Option<String>,
-    #[serde(rename = "pageInfo")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub page_info: Option<PageInfo>,
-    /// A list of playlists that match the request criteria
-    #[serde(rename = "items")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub items: Option<Vec<Playlist>>,
-}
-
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct LiveChatMessageRetractedDetails {
-    #[serde(rename = "retractedMessageId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub retracted_message_id: Option<String>,
-}
-
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct MemberListResponse {
-    #[serde(rename = "pageInfo")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub page_info: Option<PageInfo>,
-    #[serde(rename = "tokenPagination")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub token_pagination: Option<TokenPagination>,
-    /// A list of members that match the request criteria.
-    #[serde(rename = "items")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub items: Option<Vec<Member>>,
-    /// Etag of this resource.
-    #[serde(rename = "etag")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub etag: Option<String>,
-    /// Identifies what kind of resource this is. Value: the fixed string "youtube#memberListResponse".
-    #[serde(rename = "kind")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub kind: Option<String>,
-    /// The visitorId identifies the visitor.
-    #[serde(rename = "visitorId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub visitor_id: Option<String>,
-    /// Serialized EventId of the request which produced this response.
-    #[serde(rename = "eventId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub event_id: Option<String>,
-    /// The token that can be used as the value of the pageToken parameter to retrieve the next page in the result set.
-    #[serde(rename = "nextPageToken")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub next_page_token: Option<String>,
-}
-
-/// Details about a channelsection, including playlists and channels.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct ChannelSectionContentDetails {
-    /// The playlist ids for type single_playlist and multiple_playlists. For singlePlaylist, only one playlistId is allowed.
-    #[serde(rename = "playlists")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub playlists: Option<Vec<String>>,
-    /// The channel ids for type multiple_channels.
-    #[serde(rename = "channels")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub channels: Option<Vec<String>>,
-}
-
-/// Geographical coordinates of a point, in WGS84.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct GeoPoint {
-    /// Latitude in degrees.
-    #[serde(rename = "latitude")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub latitude: Option<f64>,
-    /// Altitude above the reference ellipsoid, in meters.
-    #[serde(rename = "altitude")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub altitude: Option<f64>,
-    /// Longitude in degrees.
-    #[serde(rename = "longitude")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub longitude: Option<f64>,
-}
-
-/// An *activity* resource contains information about an action that a particular channel, or user, has taken on YouTube.The actions reported in activity feeds include rating a video, sharing a video, marking a video as a favorite, commenting on a video, uploading a video, and so forth. Each activity resource identifies the type of action, the channel associated with the action, and the resource(s) associated with the action, such as the video that was rated or uploaded.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct Activity {
-    /// Etag of this resource
-    #[serde(rename = "etag")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub etag: Option<String>,
-    #[serde(rename = "snippet")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub snippet: Option<ActivitySnippet>,
-    #[serde(rename = "contentDetails")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub content_details: Option<ActivityContentDetails>,
-    /// The ID that YouTube uses to uniquely identify the activity.
-    #[serde(rename = "id")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub id: Option<String>,
-    /// Identifies what kind of resource this is. Value: the fixed string "youtube#activity".
-    #[serde(rename = "kind")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub kind: Option<String>,
-}
-
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct ChannelProfileDetails {
-    /// The YouTube channel ID.
-    #[serde(rename = "channelId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub channel_id: Option<String>,
-    /// The channel's display name.
-    #[serde(rename = "displayName")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub display_name: Option<String>,
-    /// The channel's URL.
-    #[serde(rename = "channelUrl")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub channel_url: Option<String>,
-    /// The channels's avatar URL.
-    #[serde(rename = "profileImageUrl")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub profile_image_url: Option<String>,
-}
-
-/// Basic details about a video, including title, description, uploader, thumbnails and category.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct VideoSnippet {
-    /// The ID that YouTube uses to uniquely identify the channel that the video was uploaded to.
-    #[serde(rename = "channelId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub channel_id: Option<String>,
-    /// The default_audio_language property specifies the language spoken in the video's default audio track.
-    #[serde(rename = "defaultAudioLanguage")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub default_audio_language: Option<String>,
-    /// The video's description. @mutable youtube.videos.insert youtube.videos.update
-    #[serde(rename = "description")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub description: Option<String>,
-    #[serde(rename = "localized")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub localized: Option<VideoLocalization>,
-    /// Channel title for the channel that the video belongs to.
-    #[serde(rename = "channelTitle")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub channel_title: Option<String>,
-    /// The YouTube video category associated with the video.
-    #[serde(rename = "categoryId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub category_id: Option<String>,
-    #[serde(rename = "thumbnails")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub thumbnails: Option<ThumbnailDetails>,
-    /// DateTime: The date and time when the video was uploaded.
-    #[serde(rename = "publishedAt")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub published_at: Option<DateTime<Utc>>,
-    /// Indicates if the video is an upcoming/active live broadcast. Or it's "none" if the video is not an upcoming/active live broadcast.
-    #[serde(rename = "liveBroadcastContent")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub live_broadcast_content: Option<VideoSnippetLiveBroadcastContent>,
-    /// A list of keyword tags associated with the video. Tags may contain spaces.
-    #[serde(rename = "tags")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub tags: Option<Vec<String>>,
-    /// The video's title. @mutable youtube.videos.insert youtube.videos.update
-    #[serde(rename = "title")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub title: Option<String>,
-    /// The language of the videos's default snippet.
-    #[serde(rename = "defaultLanguage")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub default_language: Option<String>,
-}
-
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct VideoCategoryListResponse {
-    /// Serialized EventId of the request which produced this response.
-    #[serde(rename = "eventId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub event_id: Option<String>,
-    /// The token that can be used as the value of the pageToken parameter to retrieve the next page in the result set.
-    #[serde(rename = "nextPageToken")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub next_page_token: Option<String>,
-    /// A list of video categories that can be associated with YouTube videos. In this map, the video category ID is the map key, and its value is the corresponding videoCategory resource.
-    #[serde(rename = "items")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub items: Option<Vec<VideoCategory>>,
     #[serde(rename = "pageInfo")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub page_info: Option<PageInfo>,
@@ -650,10 +351,6 @@
     #[serde(rename = "prevPageToken")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub prev_page_token: Option<String>,
-    /// Identifies what kind of resource this is. Value: the fixed string "youtube#videoCategoryListResponse".
-    #[serde(rename = "kind")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub kind: Option<String>,
     #[serde(rename = "tokenPagination")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub token_pagination: Option<TokenPagination>,
@@ -661,174 +358,66 @@
     #[serde(rename = "visitorId")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub visitor_id: Option<String>,
+}
+
+/// Basic details about an activity, including title, description, thumbnails, activity type and group. Next ID: 12
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct ActivitySnippet {
+    /// The ID that YouTube uses to uniquely identify the channel associated with the activity.
+    #[serde(rename = "channelId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub channel_id: Option<String>,
+    /// Channel title for the channel responsible for this activity
+    #[serde(rename = "channelTitle")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub channel_title: Option<String>,
+    /// The 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 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>,
+    /// DateTime: The date and time that the video was uploaded.
+    #[serde(rename = "publishedAt")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub published_at: Option<DateTime<Utc>>,
+    #[serde(rename = "thumbnails")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub thumbnails: Option<ThumbnailDetails>,
+    /// The title of the resource primarily associated with the activity.
+    #[serde(rename = "title")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub title: Option<String>,
+    /// The type of activity that the resource describes.
+    #[serde(rename = "type")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub type_: Option<ActivitySnippetType>,
+}
+
+/// A *caption* resource represents a YouTube caption track. A caption track is associated with exactly one YouTube video.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct Caption {
     /// Etag of this resource.
     #[serde(rename = "etag")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub etag: Option<String>,
-}
-
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct PlaylistItemListResponse {
-    /// Serialized EventId of the request which produced this response.
-    #[serde(rename = "eventId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub event_id: Option<String>,
-    /// Identifies what kind of resource this is. Value: the fixed string "youtube#playlistItemListResponse". Etag of this resource.
+    /// The ID that YouTube uses to uniquely identify the caption track.
+    #[serde(rename = "id")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub id: Option<String>,
+    /// Identifies what kind of resource this is. Value: the fixed string "youtube#caption".
     #[serde(rename = "kind")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub kind: Option<String>,
-    /// The visitorId identifies the visitor.
-    #[serde(rename = "visitorId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub visitor_id: Option<String>,
-    /// The token that can be used as the value of the pageToken parameter to retrieve the previous page in the result set.
-    #[serde(rename = "prevPageToken")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub prev_page_token: Option<String>,
-    /// A list of playlist items that match the request criteria.
-    #[serde(rename = "items")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub items: Option<Vec<PlaylistItem>>,
-    #[serde(rename = "tokenPagination")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub token_pagination: Option<TokenPagination>,
-    #[serde(rename = "etag")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub etag: Option<String>,
-    /// The token that can be used as the value of the pageToken parameter to retrieve the next page in the result set.
-    #[serde(rename = "nextPageToken")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub next_page_token: Option<String>,
-    #[serde(rename = "pageInfo")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub page_info: Option<PageInfo>,
-}
-
-/// Brief description of the live stream cdn settings.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct CdnSettings {
-    ///  The method or protocol used to transmit the video stream.
-    #[serde(rename = "ingestionType")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub ingestion_type: Option<CdnSettingsIngestionType>,
-    #[serde(rename = "ingestionInfo")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub ingestion_info: Option<IngestionInfo>,
-    /// The frame rate of the inbound video data.
-    #[serde(rename = "frameRate")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub frame_rate: Option<CdnSettingsFrameRate>,
-    /// The resolution of the inbound video data.
-    #[serde(rename = "resolution")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub resolution: Option<CdnSettingsResolution>,
-    /// The format of the video stream that you are sending to Youtube.
-    #[serde(rename = "format")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub format: Option<String>,
-}
-
-/// Detailed settings of a broadcast.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct LiveBroadcastContentDetails {
-    /// This setting indicates whether the broadcast should automatically begin with an in-stream slate when you update the broadcast's status to live. After updating the status, you then need to send a liveCuepoints.insert request that sets the cuepoint's eventState to end to remove the in-stream slate and make your broadcast stream visible to viewers.
-    #[serde(rename = "startWithSlate")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub start_with_slate: Option<bool>,
-    /// The mesh for projecting the video if projection is mesh. The mesh value must be a UTF-8 string containing the base-64 encoding of 3D mesh data that follows the Spherical Video V2 RFC specification for an mshp box, excluding the box size and type but including the following four reserved zero bytes for the version and flags.
-    #[serde(rename = "mesh")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub mesh: Option<String>,
-    /// This setting indicates whether the broadcast video can be played in an embedded player. If you choose to archive the video (using the enableArchive property), this setting will also apply to the archived video.
-    #[serde(rename = "enableEmbed")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub enable_embed: Option<bool>,
-    /// Indicates whether this broadcast has low latency enabled.
-    #[serde(rename = "enableLowLatency")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub enable_low_latency: Option<bool>,
-    #[serde(rename = "monitorStream")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub monitor_stream: Option<MonitorStreamInfo>,
-    /// The projection format of this broadcast. This defaults to rectangular.
-    #[serde(rename = "projection")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub projection: Option<LiveBroadcastContentDetailsProjection>,
-    /// This setting determines whether viewers can access DVR controls while watching the video. DVR controls enable the viewer to control the video playback experience by pausing, rewinding, or fast forwarding content. The default value for this property is true. *Important:* You must set the value to true and also set the enableArchive property's value to true if you want to make playback available immediately after the broadcast ends.
-    #[serde(rename = "enableDvr")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub enable_dvr: Option<bool>,
-    /// The 3D stereo layout of this broadcast. This defaults to mono.
-    #[serde(rename = "stereoLayout")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub stereo_layout: Option<LiveBroadcastContentDetailsStereoLayout>,
-    /// This setting indicates whether YouTube should enable content encryption for the broadcast.
-    #[serde(rename = "enableContentEncryption")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub enable_content_encryption: Option<bool>,
-    /// This setting indicates whether HTTP POST closed captioning is enabled for this broadcast. The ingestion URL of the closed captions is returned through the liveStreams API. This is mutually exclusive with using the closed_captions_type property, and is equivalent to setting closed_captions_type to CLOSED_CAPTIONS_HTTP_POST.
-    #[serde(rename = "enableClosedCaptions")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub enable_closed_captions: Option<bool>,
-    #[serde(rename = "closedCaptionsType")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub closed_captions_type: Option<LiveBroadcastContentDetailsClosedCaptionsType>,
-    /// This setting indicates whether auto start is enabled for this broadcast. The default value for this property is false. This setting can only be used by Events.
-    #[serde(rename = "enableAutoStart")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub enable_auto_start: Option<bool>,
-    /// DateTime: The date and time that the live stream referenced by boundStreamId was last updated.
-    #[serde(rename = "boundStreamLastUpdateTimeMs")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub bound_stream_last_update_time_ms: Option<DateTime<Utc>>,
-    /// This setting indicates whether auto stop is enabled for this broadcast. The default value for this property is false. This setting can only be used by Events.
-    #[serde(rename = "enableAutoStop")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub enable_auto_stop: Option<bool>,
-    /// Automatically start recording after the event goes live. The default value for this property is true. *Important:* You must also set the enableDvr property's value to true if you want the playback to be available immediately after the broadcast ends. If you set this property's value to true but do not also set the enableDvr property to true, there may be a delay of around one day before the archived video will be available for playback.
-    #[serde(rename = "recordFromStart")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub record_from_start: Option<bool>,
-    /// If both this and enable_low_latency are set, they must match. LATENCY_NORMAL should match enable_low_latency=false LATENCY_LOW should match enable_low_latency=true LATENCY_ULTRA_LOW should have enable_low_latency omitted.
-    #[serde(rename = "latencyPreference")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub latency_preference: Option<LiveBroadcastContentDetailsLatencyPreference>,
-    /// This value uniquely identifies the live stream bound to the broadcast.
-    #[serde(rename = "boundStreamId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub bound_stream_id: Option<String>,
-}
-
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct LiveStreamHealthStatus {
-    /// The status code of this stream
-    #[serde(rename = "status")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub status: Option<LiveStreamHealthStatusStatus>,
-    /// u64: The last time this status was updated (in seconds)
-    #[serde(rename = "lastUpdateTimeSeconds")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub last_update_time_seconds: Option<String>,
-    /// The configurations issues on this stream
-    #[serde(rename = "configurationIssues")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub configuration_issues: Option<Vec<LiveStreamConfigurationIssue>>,
-}
-
-/// Information about a resource that received a positive (like) rating.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct ActivityContentDetailsLike {
-    #[serde(rename = "resourceId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub resource_id: Option<ResourceId>,
+    #[serde(rename = "snippet")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub snippet: Option<CaptionSnippet>,
 }
 
 #[derive(Serialize, Deserialize, Debug, Clone, Default)]
 pub struct CaptionListResponse {
-    /// Identifies what kind of resource this is. Value: the fixed string "youtube#captionListResponse".
-    #[serde(rename = "kind")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub kind: Option<String>,
     /// Etag of this resource.
     #[serde(rename = "etag")]
     #[serde(skip_serializing_if = "Option::is_none")]
@@ -841,198 +430,23 @@
     #[serde(rename = "items")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub items: Option<Vec<Caption>>,
+    /// Identifies what kind of resource this is. Value: the fixed string "youtube#captionListResponse".
+    #[serde(rename = "kind")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub kind: Option<String>,
     /// The visitorId identifies the visitor.
     #[serde(rename = "visitorId")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub visitor_id: Option<String>,
 }
 
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct LiveChatTextMessageDetails {
-    /// The user's message.
-    #[serde(rename = "messageText")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub message_text: Option<String>,
-}
-
-/// Statistics about the live broadcast. These represent a snapshot of the values at the time of the request. Statistics are only returned for live broadcasts.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct LiveBroadcastStatistics {
-    /// u64: The total number of live chat messages currently on the broadcast. The property and its value will be present if the broadcast is public, has the live chat feature enabled, and has at least one message. Note that this field will not be filled after the broadcast ends. So this property would not identify the number of chat messages for an archived video of a completed live broadcast.
-    #[serde(rename = "totalChatCount")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub total_chat_count: Option<String>,
-}
-
-/// Basic details about a video category, such as its localized title. Next Id: 17
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct VideoStatus {
-    /// The status of the uploaded video.
-    #[serde(rename = "uploadStatus")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub upload_status: Option<VideoStatusUploadStatus>,
-    /// The video's license. @mutable youtube.videos.insert youtube.videos.update
-    #[serde(rename = "license")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub license: Option<VideoStatusLicense>,
-    /// This value indicates if the video can be embedded on another website. @mutable youtube.videos.insert youtube.videos.update
-    #[serde(rename = "embeddable")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub embeddable: Option<bool>,
-    /// This value indicates if the extended video statistics on the watch page can be viewed by everyone. Note that the view count, likes, etc will still be visible if this is disabled. @mutable youtube.videos.insert youtube.videos.update
-    #[serde(rename = "publicStatsViewable")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub public_stats_viewable: Option<bool>,
-    /// DateTime: The date and time when the video is scheduled to publish. It can be set only if the privacy status of the video is private..
-    #[serde(rename = "publishAt")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub publish_at: Option<DateTime<Utc>>,
-    /// This value explains why YouTube rejected an uploaded video. This property is only present if the uploadStatus property indicates that the upload was rejected.
-    #[serde(rename = "rejectionReason")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub rejection_reason: Option<VideoStatusRejectionReason>,
-    /// The video's privacy status.
-    #[serde(rename = "privacyStatus")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub privacy_status: Option<VideoStatusPrivacyStatus>,
-    #[serde(rename = "madeForKids")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub made_for_kids: Option<bool>,
-    /// This value explains why a video failed to upload. This property is only present if the uploadStatus property indicates that the upload failed.
-    #[serde(rename = "failureReason")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub failure_reason: Option<VideoStatusFailureReason>,
-    #[serde(rename = "selfDeclaredMadeForKids")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub self_declared_made_for_kids: Option<bool>,
-}
-
-/// Details about the content of a YouTube Video.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct VideoContentDetails {
-    /// The value of is_license_content indicates whether the video is licensed content.
-    #[serde(rename = "licensedContent")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub licensed_content: Option<bool>,
-    #[serde(rename = "regionRestriction")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub region_restriction: Option<VideoContentDetailsRegionRestriction>,
-    #[serde(rename = "contentRating")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub content_rating: Option<ContentRating>,
-    /// The value of captions indicates whether the video has captions or not.
-    #[serde(rename = "caption")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub caption: Option<VideoContentDetailsCaption>,
-    /// The value of definition indicates whether the video is available in high definition or only in standard definition.
-    #[serde(rename = "definition")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub definition: Option<VideoContentDetailsDefinition>,
-    /// Indicates whether the video uploader has provided a custom thumbnail image for the video. This property is only visible to the video uploader.
-    #[serde(rename = "hasCustomThumbnail")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub has_custom_thumbnail: Option<bool>,
-    /// Specifies the projection format of the video.
-    #[serde(rename = "projection")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub projection: Option<VideoContentDetailsProjection>,
-    /// The value of dimension indicates whether the video is available in 3D or in 2D.
-    #[serde(rename = "dimension")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub dimension: Option<String>,
-    /// The length of the video. The tag value is an ISO 8601 duration in the format PT#M#S, in which the letters PT indicate that the value specifies a period of time, and the letters M and S refer to length in minutes and seconds, respectively. The # characters preceding the M and S letters are both integers that specify the number of minutes (or seconds) of the video. For example, a value of PT15M51S indicates that the video is 15 minutes and 51 seconds long.
-    #[serde(rename = "duration")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub duration: Option<String>,
-    #[serde(rename = "countryRestriction")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub country_restriction: Option<AccessPolicy>,
-}
-
-/// DEPRECATED Region restriction of the video.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct VideoContentDetailsRegionRestriction {
-    /// A list of region codes that identify countries where the video is blocked. If this property is present and a country is not listed in its value, then the video is viewable in that country. If this property is present and contains an empty list, the video is viewable in all countries.
-    #[serde(rename = "blocked")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub blocked: Option<Vec<String>>,
-    /// A list of region codes that identify countries where the video is viewable. If this property is present and a country is not listed in its value, then the video is blocked from appearing in that country. If this property is present and contains an empty list, the video is blocked in all countries.
-    #[serde(rename = "allowed")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub allowed: Option<Vec<String>>,
-}
-
-/// Brief description of the live stream status.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct LiveStreamStatus {
-    #[serde(rename = "healthStatus")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub health_status: Option<LiveStreamHealthStatus>,
-    #[serde(rename = "streamStatus")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub stream_status: Option<LiveStreamStatusStreamStatus>,
-}
-
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct SuperStickerMetadata {
-    /// Unique identifier of the Super Sticker. This is a shorter form of the alt_text that includes pack name and a recognizable characteristic of the sticker.
-    #[serde(rename = "stickerId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub sticker_id: Option<String>,
-    /// Internationalized alt text that describes the sticker image and any animation associated with it.
-    #[serde(rename = "altText")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub alt_text: Option<String>,
-    /// Specifies the localization language in which the alt text is returned.
-    #[serde(rename = "altTextLanguage")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub alt_text_language: Option<String>,
-}
-
-/// A *liveChatModerator* resource represents a moderator for a YouTube live chat. A chat moderator has the ability to ban/unban users from a chat, remove message, etc.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct LiveChatModerator {
-    #[serde(rename = "snippet")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub snippet: Option<LiveChatModeratorSnippet>,
-    /// Identifies what kind of resource this is. Value: the fixed string "youtube#liveChatModerator".
-    #[serde(rename = "kind")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub kind: Option<String>,
-    /// Etag of this resource.
-    #[serde(rename = "etag")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub etag: Option<String>,
-    /// The ID that YouTube assigns to uniquely identify the moderator.
-    #[serde(rename = "id")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub id: Option<String>,
-}
-
-/// Basic details about an i18n region, such as region code and human-readable name.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct I18nRegionSnippet {
-    /// The human-readable name of the region.
-    #[serde(rename = "name")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub name: Option<String>,
-    /// The region code as a 2-letter ISO country code.
-    #[serde(rename = "gl")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub gl: Option<String>,
-}
-
 /// Basic details about a caption track, such as its language and name.
 #[derive(Serialize, Deserialize, Debug, Clone, Default)]
 pub struct CaptionSnippet {
-    /// Indicates whether the track contains closed captions for the deaf and hard of hearing. The default value is false.
-    #[serde(rename = "isCC")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub is_c_c: Option<bool>,
-    /// The language of the caption track. The property value is a BCP-47 language tag.
-    #[serde(rename = "language")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub language: Option<String>,
+    /// The 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>,
     /// 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")]
@@ -1041,26 +455,10 @@
     #[serde(rename = "isAutoSynced")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub is_auto_synced: Option<bool>,
-    /// DateTime: The date and time when the caption track was last updated.
-    #[serde(rename = "lastUpdated")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub last_updated: Option<DateTime<Utc>>,
-    /// The caption track's type.
-    #[serde(rename = "trackKind")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub track_kind: Option<CaptionSnippetTrackKind>,
-    /// The caption track's status.
-    #[serde(rename = "status")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub status: Option<CaptionSnippetStatus>,
-    /// The name of the caption track. The name is intended to be visible to the user as an option during playback.
-    #[serde(rename = "name")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub name: Option<String>,
-    /// The type of audio track associated with the caption track.
-    #[serde(rename = "audioTrackType")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub audio_track_type: Option<CaptionSnippetAudioTrackType>,
+    /// 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")]
@@ -1073,507 +471,224 @@
     #[serde(rename = "isLarge")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub is_large: 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>,
+    /// DateTime: The date and time when the caption track was last updated.
+    #[serde(rename = "lastUpdated")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub last_updated: Option<DateTime<Utc>>,
+    /// The 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 caption track's status.
+    #[serde(rename = "status")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub status: Option<CaptionSnippetStatus>,
+    /// The caption track's type.
+    #[serde(rename = "trackKind")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub track_kind: Option<CaptionSnippetTrackKind>,
     /// The ID that YouTube uses to uniquely identify the video associated with the caption track. @mutable youtube.captions.insert
     #[serde(rename = "videoId")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub video_id: Option<String>,
 }
 
-/// Branding properties for the channel view.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct ChannelSettings {
-    /// The ID for a Google Analytics account to track and measure traffic to the channels.
-    #[serde(rename = "trackingAnalyticsAccountId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub tracking_analytics_account_id: Option<String>,
-    /// Which content tab users should see when viewing the channel.
-    #[serde(rename = "defaultTab")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub default_tab: Option<String>,
-    /// Whether the tab to browse the videos should be displayed.
-    #[serde(rename = "showBrowseView")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub show_browse_view: Option<bool>,
-    /// Whether user-submitted comments left on the channel page need to be approved by the channel owner to be publicly visible.
-    #[serde(rename = "moderateComments")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub moderate_comments: Option<bool>,
-    /// Whether related channels should be proposed.
-    #[serde(rename = "showRelatedChannels")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub show_related_channels: Option<bool>,
-    /// A prominent color that can be rendered on this channel page.
-    #[serde(rename = "profileColor")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub profile_color: Option<String>,
-    /// The list of featured channels.
-    #[serde(rename = "featuredChannelsUrls")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub featured_channels_urls: Option<Vec<String>>,
-    /// Specifies the channel title.
-    #[serde(rename = "title")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub title: Option<String>,
-    /// Specifies the channel description.
-    #[serde(rename = "description")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub description: Option<String>,
-    /// The trailer of the channel, for users that are not subscribers.
-    #[serde(rename = "unsubscribedTrailer")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub unsubscribed_trailer: Option<String>,
-    /// Title for the featured channels tab.
-    #[serde(rename = "featuredChannelsTitle")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub featured_channels_title: Option<String>,
-    /// The country of the channel.
-    #[serde(rename = "country")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub country: Option<String>,
-    /// Lists keywords associated with the channel, comma-separated.
-    #[serde(rename = "keywords")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub keywords: Option<String>,
-    #[serde(rename = "defaultLanguage")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub default_language: Option<String>,
-}
-
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct LanguageTag {
-    #[serde(rename = "value")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub value: Option<String>,
-}
-
-/// Statistics about the video, such as the number of times the video was viewed or liked.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct VideoStatistics {
-    /// u64: The number of users who have indicated that they disliked the video by giving it a negative rating.
-    #[serde(rename = "dislikeCount")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub dislike_count: Option<String>,
-    /// u64: The number of users who currently have the video marked as a favorite video.
-    #[serde(rename = "favoriteCount")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub favorite_count: Option<String>,
-    /// u64: The number of times the video has been viewed.
-    #[serde(rename = "viewCount")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub view_count: Option<String>,
-    /// u64: The number of comments for the video.
-    #[serde(rename = "commentCount")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub comment_count: Option<String>,
-    /// u64: The number of users who have indicated that they liked the video by giving it a positive rating.
-    #[serde(rename = "likeCount")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub like_count: Option<String>,
-}
-
-/// Information that identifies the recommended resource.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct ActivityContentDetailsRecommendation {
-    #[serde(rename = "resourceId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub resource_id: Option<ResourceId>,
-    #[serde(rename = "seedResourceId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub seed_resource_id: Option<ResourceId>,
-    /// The reason that the resource is recommended to the user.
-    #[serde(rename = "reason")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub reason: Option<ActivityContentDetailsRecommendationReason>,
-}
-
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct TestItemTestItemSnippet {}
-
-/// Basic details about an i18n language, such as language code and human-readable name.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct I18nLanguageSnippet {
-    /// The human-readable name of the language in the language itself.
-    #[serde(rename = "name")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub name: Option<String>,
-    /// A short BCP-47 code that uniquely identifies a language.
-    #[serde(rename = "hl")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub hl: Option<String>,
-}
-
-/// Freebase topic information related to the video.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct VideoTopicDetails {
-    /// A list of Wikipedia URLs that provide a high-level description of the video's content.
-    #[serde(rename = "topicCategories")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub topic_categories: Option<Vec<String>>,
-    /// A list of Freebase topic IDs that are centrally associated with the video. These are topics that are centrally featured in the video, and it can be said that the video is mainly about each of these. You can retrieve information about each topic using the < a href="http://wiki.freebase.com/wiki/Topic_API">Freebase Topic API.
-    #[serde(rename = "topicIds")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub topic_ids: Option<Vec<String>>,
-    /// Similar to topic_id, except that these topics are merely relevant to the video. These are topics that may be mentioned in, or appear in the video. You can retrieve information about each topic using Freebase Topic API.
-    #[serde(rename = "relevantTopicIds")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub relevant_topic_ids: Option<Vec<String>>,
-}
-
-/// The id of the author's YouTube channel, if any.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct CommentSnippetAuthorChannelId {
-    #[serde(rename = "value")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub value: Option<String>,
-}
-
-/// A *playlist* resource represents a YouTube playlist. A playlist is a collection of videos that can be viewed sequentially and shared with other users. A playlist can contain up to 200 videos, and YouTube does not limit the number of playlists that each user creates. By default, playlists are publicly visible to other users, but playlists can be public or private. YouTube also uses playlists to identify special collections of videos for a channel, such as: - uploaded videos - favorite videos - positively rated (liked) videos - watch history - watch later To be more specific, these lists are associated with a channel, which is a collection of a person, group, or company's videos, playlists, and other YouTube information. You can retrieve the playlist IDs for each of these lists from the channel resource for a given channel. You can then use the playlistItems.list method to retrieve any of those lists. You can also add or remove items from those lists by calling the playlistItems.insert and playlistItems.delete methods.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct Playlist {
+/// 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<CdnSettingsFrameRate>,
+    #[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<CdnSettingsIngestionType>,
+    /// The resolution of the inbound video data.
+    #[serde(rename = "resolution")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub resolution: Option<CdnSettingsResolution>,
+}
+
+/// A *channel* resource contains information about a YouTube channel.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct Channel {
+    #[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 = "contentDetails")]
     #[serde(skip_serializing_if = "Option::is_none")]
-    pub content_details: Option<PlaylistContentDetails>,
-    /// Localizations for different languages
-    #[serde(rename = "localizations")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub localizations: Option<HashMap<String, PlaylistLocalization>>,
-    #[serde(rename = "player")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub player: Option<PlaylistPlayer>,
-    /// Etag of this resource.
-    #[serde(rename = "etag")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub etag: Option<String>,
-    /// Identifies what kind of resource this is. Value: the fixed string "youtube#playlist".
-    #[serde(rename = "kind")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub kind: Option<String>,
-    #[serde(rename = "status")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub status: Option<PlaylistStatus>,
-    /// The ID that YouTube uses to uniquely identify the playlist.
-    #[serde(rename = "id")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub id: Option<String>,
-    #[serde(rename = "snippet")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub snippet: Option<PlaylistSnippet>,
-}
-
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct CommentThreadListResponse {
-    /// Serialized EventId of the request which produced this response.
-    #[serde(rename = "eventId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub event_id: Option<String>,
-    #[serde(rename = "tokenPagination")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub token_pagination: Option<TokenPagination>,
-    /// Identifies what kind of resource this is. Value: the fixed string "youtube#commentThreadListResponse".
-    #[serde(rename = "kind")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub kind: Option<String>,
-    /// The visitorId identifies the visitor.
-    #[serde(rename = "visitorId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub visitor_id: Option<String>,
-    #[serde(rename = "pageInfo")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub page_info: Option<PageInfo>,
+    pub content_details: Option<ChannelContentDetails>,
+    #[serde(rename = "contentOwnerDetails")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub content_owner_details: Option<ChannelContentOwnerDetails>,
+    #[serde(rename = "conversionPings")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub conversion_pings: Option<ChannelConversionPings>,
     /// Etag of this resource.
     #[serde(rename = "etag")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub etag: Option<String>,
-    /// A list of comment threads that match the request criteria.
-    #[serde(rename = "items")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub items: Option<Vec<CommentThread>>,
-    /// The token that can be used as the value of the pageToken parameter to retrieve the next page in the result set.
-    #[serde(rename = "nextPageToken")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub next_page_token: Option<String>,
-}
-
-/// Rights management policy for YouTube resources.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct AccessPolicy {
-    /// A list of region codes that identify countries where the default policy do not apply.
-    #[serde(rename = "exception")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub exception: Option<Vec<String>>,
-    /// The value of allowed indicates whether the access to the policy is allowed or denied by default.
-    #[serde(rename = "allowed")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub allowed: Option<bool>,
-}
-
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct AbuseType {
+    /// The ID that YouTube uses to uniquely identify the channel.
     #[serde(rename = "id")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub id: Option<String>,
-}
-
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct ActivityListResponse {
-    /// The visitorId identifies the visitor.
-    #[serde(rename = "visitorId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub visitor_id: Option<String>,
-    /// The token that can be used as the value of the pageToken parameter to retrieve the next page in the result set.
-    #[serde(rename = "nextPageToken")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub next_page_token: Option<String>,
-    /// Serialized EventId of the request which produced this response.
-    #[serde(rename = "eventId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub event_id: Option<String>,
-    /// Identifies what kind of resource this is. Value: the fixed string "youtube#activityListResponse".
+    /// 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 = "tokenPagination")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub token_pagination: Option<TokenPagination>,
-    /// The token that can be used as the value of the pageToken parameter to retrieve the previous page in the result set.
-    #[serde(rename = "prevPageToken")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub prev_page_token: Option<String>,
-    /// Etag of this resource.
+    /// Localizations for different languages
+    #[serde(rename = "localizations")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub localizations: Option<HashMap<String, ChannelLocalization>>,
+    #[serde(rename = "snippet")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub snippet: Option<ChannelSnippet>,
+    #[serde(rename = "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>,
+    #[serde(rename = "topicDetails")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub topic_details: Option<ChannelTopicDetails>,
+}
+
+/// 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 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 has any copyright strikes.
+    #[serde(rename = "copyrightStrikesGoodStanding")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub copyright_strikes_good_standing: Option<bool>,
+}
+
+/// A channel banner returned as the response to a channel_banner.insert call.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct ChannelBannerResource {
     #[serde(rename = "etag")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub etag: Option<String>,
-    #[serde(rename = "items")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub items: Option<Vec<Activity>>,
-    #[serde(rename = "pageInfo")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub page_info: Option<PageInfo>,
-}
-
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct MembershipsDetails {
-    /// Display name for the highest level that the user has access to at the moment.
-    #[serde(rename = "highestAccessibleLevelDisplayName")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub highest_accessible_level_display_name: Option<String>,
-    /// Id of the highest level that the user has access to at the moment.
-    #[serde(rename = "highestAccessibleLevel")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub highest_accessible_level: Option<String>,
-    #[serde(rename = "membershipsDuration")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub memberships_duration: Option<MembershipsDuration>,
-    /// Ids of all levels that the user has access to. This includes the currently active level and all other levels that are included because of a higher purchase.
-    #[serde(rename = "accessibleLevels")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub accessible_levels: Option<Vec<String>>,
-    /// Data about memberships duration on particular pricing levels.
-    #[serde(rename = "membershipsDurationAtLevels")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub memberships_duration_at_levels: Option<Vec<MembershipsDurationAtLevel>>,
-}
-
-/// Information specific to a store on a merchandising platform linked to a YouTube channel.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct ChannelToStoreLinkDetails {
-    /// Name of the store.
-    #[serde(rename = "storeName")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub store_name: Option<String>,
-    /// Landing page of the store.
-    #[serde(rename = "storeUrl")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub store_url: Option<String>,
-}
-
-/// A *membershipsLevel* resource represents an offer made by YouTube creators for their fans. Users can become members of the channel by joining one of the available levels. They will provide recurring monetary support and receives special benefits.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct MembershipsLevel {
-    #[serde(rename = "snippet")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub snippet: Option<MembershipsLevelSnippet>,
-    /// The ID that YouTube assigns to uniquely identify the memberships level.
-    #[serde(rename = "id")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub id: Option<String>,
-    /// Etag of this resource.
-    #[serde(rename = "etag")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub etag: Option<String>,
-    /// Identifies what kind of resource this is. Value: the fixed string "youtube#membershipsLevelListResponse".
-    #[serde(rename = "kind")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub kind: Option<String>,
-}
-
-/// The third-party link status object contains information about the status of the link.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct ThirdPartyLinkStatus {
-    #[serde(rename = "linkStatus")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub link_status: Option<ThirdPartyLinkStatusLinkStatus>,
-}
-
-/// A *i18nRegion* resource identifies a region where YouTube is available.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct I18nRegion {
-    /// Etag of this resource.
-    #[serde(rename = "etag")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub etag: Option<String>,
-    /// Identifies what kind of resource this is. Value: the fixed string "youtube#i18nRegion".
+    /// 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>,
-    /// The ID that YouTube uses to uniquely identify the i18n region.
-    #[serde(rename = "id")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub id: Option<String>,
-    #[serde(rename = "snippet")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub snippet: Option<I18nRegionSnippet>,
-}
-
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct LiveChatFanFundingEventDetails {
-    /// A rendered string that displays the fund amount and currency to the user.
-    #[serde(rename = "amountDisplayString")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub amount_display_string: Option<String>,
-    /// The comment added by the user to this fan funding event.
-    #[serde(rename = "userComment")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub user_comment: Option<String>,
-    /// u64: The amount of the fund.
-    #[serde(rename = "amountMicros")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub amount_micros: Option<String>,
-    /// The currency in which the fund was made.
-    #[serde(rename = "currency")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub currency: Option<String>,
-}
-
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct CommentListResponse {
-    /// A list of comments that match the request criteria.
-    #[serde(rename = "items")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub items: Option<Vec<Comment>>,
-    #[serde(rename = "pageInfo")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub page_info: Option<PageInfo>,
-    /// The token that can be used as the value of the pageToken parameter to retrieve the next page in the result set.
-    #[serde(rename = "nextPageToken")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub next_page_token: Option<String>,
-    #[serde(rename = "tokenPagination")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub token_pagination: Option<TokenPagination>,
-    /// Etag of this resource.
-    #[serde(rename = "etag")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub etag: Option<String>,
-    /// Identifies what kind of resource this is. Value: the fixed string "youtube#commentListResponse".
-    #[serde(rename = "kind")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub kind: Option<String>,
-    /// The visitorId identifies the visitor.
-    #[serde(rename = "visitorId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub visitor_id: Option<String>,
-    /// Serialized EventId of the request which produced this response.
-    #[serde(rename = "eventId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub event_id: Option<String>,
-}
-
-/// LINT.IfChange Describes an invideo branding.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct InvideoBranding {
-    /// The channel to which this branding links. If not present it defaults to the current channel.
-    #[serde(rename = "targetChannelId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub target_channel_id: Option<String>,
-    #[serde(rename = "timing")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub timing: Option<InvideoTiming>,
-    /// The bytes the uploaded image. Only used in api to youtube communication.
-    #[serde(rename = "imageBytes")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub image_bytes: Option<String>,
-    /// The url of the uploaded image. Only used in apiary to api communication.
-    #[serde(rename = "imageUrl")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub image_url: Option<String>,
-    #[serde(rename = "position")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub position: Option<InvideoPosition>,
-}
-
-/// Branding properties for the watch. All deprecated.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct WatchSettings {
-    /// An ID that uniquely identifies a playlist that displays next to the video player.
-    #[serde(rename = "featuredPlaylistId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub featured_playlist_id: Option<String>,
-    /// The background color for the video watch page's branded area.
-    #[serde(rename = "textColor")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub text_color: Option<String>,
-    /// The text color for the video watch page's branded area.
-    #[serde(rename = "backgroundColor")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub background_color: Option<String>,
-}
-
-/// Basic details about a video category, such as its localized title.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct VideoAbuseReportReasonSnippet {
-    /// The localized label belonging to this abuse report reason.
-    #[serde(rename = "label")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub label: Option<String>,
-    /// The secondary reasons associated with this reason, if any are available. (There might be 0 or more.)
-    #[serde(rename = "secondaryReasons")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub secondary_reasons: Option<Vec<VideoAbuseReportSecondaryReason>>,
-}
-
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct LiveChatSuperStickerDetails {
-    #[serde(rename = "superStickerMetadata")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub super_sticker_metadata: Option<SuperStickerMetadata>,
-    /// The currency in which the purchase was made.
-    #[serde(rename = "currency")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub currency: Option<String>,
-    /// A rendered string that displays the fund amount and currency to the user.
-    #[serde(rename = "amountDisplayString")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub amount_display_string: Option<String>,
-    /// The tier in which the amount belongs. Lower amounts belong to lower tiers. The lowest tier is 1.
-    #[serde(rename = "tier")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub tier: Option<u32>,
-    /// u64: The amount purchased by the user, in micros (1,750,000 micros = 1.75).
-    #[serde(rename = "amountMicros")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub amount_micros: Option<String>,
-}
-
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct SearchListResponse {
-    /// The token that can be used as the value of the pageToken parameter to retrieve the previous page in the result set.
-    #[serde(rename = "prevPageToken")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub prev_page_token: Option<String>,
-    #[serde(rename = "regionCode")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub region_code: Option<String>,
+    /// The URL of this banner image.
+    #[serde(rename = "url")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub url: 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>,
+}
+
+#[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 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>,
+    /// 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>,
+}
+
+/// 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>,
+}
+
+/// The contentOwnerDetails object encapsulates channel data that is relevant for YouTube Partners linked with the channel.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct ChannelContentOwnerDetails {
+    /// The ID of the content owner linked to the channel.
+    #[serde(rename = "contentOwner")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub content_owner: Option<String>,
+    /// DateTime: The date and time when the channel was linked to the content owner.
+    #[serde(rename = "timeLinked")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub time_linked: Option<DateTime<Utc>>,
+}
+
+/// Pings that the app shall fire (authenticated by biscotti cookie). Each ping has a context, in which the app must fire the ping, and a url identifying the ping.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct ChannelConversionPing {
+    /// Defines the context of the ping.
+    #[serde(rename = "context")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub context: Option<ChannelConversionPingContext>,
+    /// The url (without the schema) that the player shall send the ping to. It's at caller's descretion to decide which schema to use (http vs https) Example of a returned url: //googleads.g.doubleclick.net/pagead/ viewthroughconversion/962985656/?data=path%3DtHe_path%3Btype%3D cview%3Butuid%3DGISQtTNGYqaYl4sKxoVvKA&labe=default The caller must append biscotti authentication (ms param in case of mobile, for example) to this ping.
+    #[serde(rename = "conversionUrl")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub conversion_url: Option<String>,
+}
+
+/// The conversionPings object encapsulates information about conversion pings that need to be respected by the channel.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct ChannelConversionPings {
+    /// Pings that the app shall fire (authenticated by biscotti cookie). Each ping has a context, in which the app must fire the ping, and a url identifying the ping.
+    #[serde(rename = "pings")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub pings: Option<Vec<ChannelConversionPing>>,
+}
+
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct ChannelListResponse {
     /// Etag of this resource.
     #[serde(rename = "etag")]
     #[serde(skip_serializing_if = "Option::is_none")]
@@ -1582,414 +697,110 @@
     #[serde(rename = "eventId")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub event_id: Option<String>,
-    /// The visitorId identifies the visitor.
-    #[serde(rename = "visitorId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub visitor_id: Option<String>,
-    /// Pagination information for token pagination.
     #[serde(rename = "items")]
     #[serde(skip_serializing_if = "Option::is_none")]
-    pub items: Option<Vec<SearchResult>>,
-    #[serde(rename = "tokenPagination")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub token_pagination: Option<TokenPagination>,
+    pub items: Option<Vec<Channel>>,
+    /// Identifies what kind of resource this is. Value: the fixed string "youtube#channelListResponse".
+    #[serde(rename = "kind")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub kind: Option<String>,
     /// The token that can be used as the value of the pageToken parameter to retrieve the next page in the result set.
     #[serde(rename = "nextPageToken")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub next_page_token: Option<String>,
-    /// Identifies what kind of resource this is. Value: the fixed string "youtube#searchListResponse".
-    #[serde(rename = "kind")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub kind: Option<String>,
     #[serde(rename = "pageInfo")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub page_info: Option<PageInfo>,
-}
-
-/// A *comment thread* represents information that applies to a top level comment and all its replies. It can also include the top level comment itself and some of the replies.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct CommentThread {
-    #[serde(rename = "snippet")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub snippet: Option<CommentThreadSnippet>,
-    /// Identifies what kind of resource this is. Value: the fixed string "youtube#commentThread".
-    #[serde(rename = "kind")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub kind: Option<String>,
-    /// The ID that YouTube uses to uniquely identify the comment thread.
-    #[serde(rename = "id")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub id: Option<String>,
-    #[serde(rename = "replies")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub replies: Option<CommentThreadReplies>,
-    /// Etag of this resource.
-    #[serde(rename = "etag")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub etag: Option<String>,
-}
-
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct MembershipsLevelSnippet {
-    #[serde(rename = "levelDetails")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub level_details: Option<LevelDetails>,
-    /// The id of the channel that's offering channel memberships.
-    #[serde(rename = "creatorChannelId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub creator_channel_id: Option<String>,
-}
-
-/// Basic broadcast information.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct LiveBroadcastSnippet {
-    /// The id of the live chat for this broadcast.
-    #[serde(rename = "liveChatId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub live_chat_id: Option<String>,
-    /// The broadcast's description. As with the title, you can set this field by modifying the broadcast resource or by setting the description field of the corresponding video resource.
+    /// 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>,
+    /// 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>,
-    /// DateTime: The date and time that the broadcast actually started. This information is only available once the broadcast's state is live.
-    #[serde(rename = "actualStartTime")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub actual_start_time: Option<DateTime<Utc>>,
-    /// DateTime: The date and time that the broadcast was added to YouTube's live broadcast schedule.
-    #[serde(rename = "publishedAt")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub published_at: Option<DateTime<Utc>>,
-    /// DateTime: The date and time that the broadcast is scheduled to end.
-    #[serde(rename = "scheduledStartTime")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub scheduled_start_time: Option<DateTime<Utc>>,
-    /// DateTime: The date and time that the broadcast actually ended. This information is only available once the broadcast's state is complete.
-    #[serde(rename = "actualEndTime")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub actual_end_time: Option<DateTime<Utc>>,
-    /// Indicates whether this broadcast is the default broadcast. Internal only.
-    #[serde(rename = "isDefaultBroadcast")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub is_default_broadcast: Option<bool>,
-    #[serde(rename = "thumbnails")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub thumbnails: Option<ThumbnailDetails>,
-    /// The ID that YouTube uses to uniquely identify the channel that is publishing the broadcast.
+    /// 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 ChannelProfileDetails {
+    /// The YouTube channel ID.
     #[serde(rename = "channelId")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub channel_id: Option<String>,
-    /// DateTime: The date and time that the broadcast is scheduled to start.
-    #[serde(rename = "scheduledEndTime")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub scheduled_end_time: Option<DateTime<Utc>>,
-    /// The broadcast's title. Note that the broadcast represents exactly one YouTube video. You can set this field by modifying the broadcast resource or by setting the title field of the corresponding video resource.
-    #[serde(rename = "title")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub title: Option<String>,
-}
-
-/// A *liveChatMessage* resource represents a chat message in a YouTube Live Chat.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct LiveChatMessage {
+    /// The channel's URL.
+    #[serde(rename = "channelUrl")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub channel_url: Option<String>,
+    /// The channel's display name.
+    #[serde(rename = "displayName")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub display_name: Option<String>,
+    /// The channels's avatar URL.
+    #[serde(rename = "profileImageUrl")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub profile_image_url: Option<String>,
+}
+
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct ChannelSection {
+    #[serde(rename = "contentDetails")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub content_details: Option<ChannelSectionContentDetails>,
     /// Etag of this resource.
     #[serde(rename = "etag")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub etag: Option<String>,
-    /// The ID that YouTube assigns to uniquely identify the message.
+    /// The ID that YouTube uses to uniquely identify the channel section.
     #[serde(rename = "id")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub id: Option<String>,
-    /// Identifies what kind of resource this is. Value: the fixed string "youtube#liveChatMessage".
+    /// 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 = "authorDetails")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub author_details: Option<LiveChatMessageAuthorDetails>,
+    /// Localizations for different languages
+    #[serde(rename = "localizations")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub localizations: Option<HashMap<String, ChannelSectionLocalization>>,
     #[serde(rename = "snippet")]
     #[serde(skip_serializing_if = "Option::is_none")]
-    pub snippet: Option<LiveChatMessageSnippet>,
-}
-
-/// Details about the content to witch a subscription refers.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct SubscriptionContentDetails {
-    /// The type of activity this subscription is for (only uploads, everything).
-    #[serde(rename = "activityType")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub activity_type: Option<SubscriptionContentDetailsActivityType>,
-    /// The approximate number of items that the subscription points to.
-    #[serde(rename = "totalItemCount")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub total_item_count: Option<u32>,
-    /// The number of new items in the subscription since its content was last read.
-    #[serde(rename = "newItemCount")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub new_item_count: Option<u32>,
-}
-
-/// Basic details about a comment, such as its author and text.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct CommentSnippet {
-    /// Link to the author's YouTube channel, if any.
-    #[serde(rename = "authorChannelUrl")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub author_channel_url: Option<String>,
-    /// The total number of likes this comment has received.
-    #[serde(rename = "likeCount")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub like_count: Option<u32>,
-    /// The comment's text. The format is either plain text or HTML dependent on what has been requested. Even the plain text representation may differ from the text originally posted in that it may replace video links with video titles etc.
-    #[serde(rename = "textDisplay")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub text_display: Option<String>,
-    /// The comment's original raw text as initially posted or last updated. The original text will only be returned if it is accessible to the viewer, which is only guaranteed if the viewer is the comment's author.
-    #[serde(rename = "textOriginal")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub text_original: Option<String>,
-    /// The name of the user who posted the comment.
-    #[serde(rename = "authorDisplayName")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub author_display_name: Option<String>,
-    /// DateTime: The date and time when the comment was originally published.
-    #[serde(rename = "publishedAt")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub published_at: Option<DateTime<Utc>>,
-    /// DateTime: The date and time when the comment was last updated.
-    #[serde(rename = "updatedAt")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub updated_at: Option<DateTime<Utc>>,
-    #[serde(rename = "authorChannelId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub author_channel_id: Option<CommentSnippetAuthorChannelId>,
-    /// The rating the viewer has given to this comment. For the time being this will never return RATE_TYPE_DISLIKE and instead return RATE_TYPE_NONE. This may change in the future.
-    #[serde(rename = "viewerRating")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub viewer_rating: Option<CommentSnippetViewerRating>,
-    /// The ID of the video the comment refers to, if any.
-    #[serde(rename = "videoId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub video_id: Option<String>,
-    /// The comment's moderation status. Will not be set if the comments were requested through the id filter.
-    #[serde(rename = "moderationStatus")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub moderation_status: Option<CommentSnippetModerationStatus>,
-    /// The URL for the avatar of the user who posted the comment.
-    #[serde(rename = "authorProfileImageUrl")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub author_profile_image_url: Option<String>,
-    /// Whether the current viewer can rate this comment.
-    #[serde(rename = "canRate")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub can_rate: Option<bool>,
-    /// The unique id of the parent comment, only set for replies.
-    #[serde(rename = "parentId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub parent_id: Option<String>,
-    /// The id of the corresponding YouTube channel. In case of a channel comment this is the channel the comment refers to. In case of a video comment it's the video's channel.
-    #[serde(rename = "channelId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub channel_id: Option<String>,
-}
-
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct LiveChatMessageAuthorDetails {
-    /// Whether the author's identity has been verified by YouTube.
-    #[serde(rename = "isVerified")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub is_verified: Option<bool>,
-    /// The channel's URL.
-    #[serde(rename = "channelUrl")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub channel_url: Option<String>,
-    /// The YouTube channel ID.
-    #[serde(rename = "channelId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub channel_id: Option<String>,
-    /// The channels's avatar URL.
-    #[serde(rename = "profileImageUrl")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub profile_image_url: Option<String>,
-    /// The channel's display name.
-    #[serde(rename = "displayName")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub display_name: Option<String>,
-    /// Whether the author is a sponsor of the live chat.
-    #[serde(rename = "isChatSponsor")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub is_chat_sponsor: Option<bool>,
-    /// Whether the author is a moderator of the live chat.
-    #[serde(rename = "isChatModerator")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub is_chat_moderator: Option<bool>,
-    /// Whether the author is the owner of the live chat.
-    #[serde(rename = "isChatOwner")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub is_chat_owner: Option<bool>,
-}
-
-/// Information about a new playlist item.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct ActivityContentDetailsPlaylistItem {
-    /// ID of the item within the playlist.
-    #[serde(rename = "playlistItemId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub playlist_item_id: Option<String>,
-    #[serde(rename = "resourceId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub resource_id: Option<ResourceId>,
-    /// The value that YouTube uses to uniquely identify the playlist.
-    #[serde(rename = "playlistId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub playlist_id: Option<String>,
-}
-
-/// A *caption* resource represents a YouTube caption track. A caption track is associated with exactly one YouTube video.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct Caption {
-    /// Identifies what kind of resource this is. Value: the fixed string "youtube#caption".
-    #[serde(rename = "kind")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub kind: Option<String>,
-    /// The ID that YouTube uses to uniquely identify the caption track.
-    #[serde(rename = "id")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub id: Option<String>,
-    #[serde(rename = "snippet")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub snippet: Option<CaptionSnippet>,
-    /// Etag of this resource.
-    #[serde(rename = "etag")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub etag: Option<String>,
-}
-
-/// Basic details about a subscription, including title, description and thumbnails of the subscribed item.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct SubscriptionSnippet {
-    /// The subscription's details.
-    #[serde(rename = "description")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub description: Option<String>,
-    /// The ID that YouTube uses to uniquely identify the subscriber's channel.
-    #[serde(rename = "channelId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub channel_id: Option<String>,
-    /// Channel title for the channel that the subscription belongs to.
-    #[serde(rename = "channelTitle")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub channel_title: Option<String>,
-    #[serde(rename = "thumbnails")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub thumbnails: Option<ThumbnailDetails>,
-    /// The subscription's title.
-    #[serde(rename = "title")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub title: Option<String>,
-    /// DateTime: The date and time that the subscription was created.
-    #[serde(rename = "publishedAt")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub published_at: Option<DateTime<Utc>>,
-    #[serde(rename = "resourceId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub resource_id: Option<ResourceId>,
-}
-
-/// Details about the content of an activity: the video that was shared, the channel that was subscribed to, etc.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct ActivityContentDetails {
-    #[serde(rename = "channelItem")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub channel_item: Option<ActivityContentDetailsChannelItem>,
-    #[serde(rename = "like")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub like: Option<ActivityContentDetailsLike>,
-    #[serde(rename = "recommendation")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub recommendation: Option<ActivityContentDetailsRecommendation>,
-    #[serde(rename = "promotedItem")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub promoted_item: Option<ActivityContentDetailsPromotedItem>,
-    #[serde(rename = "subscription")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub subscription: Option<ActivityContentDetailsSubscription>,
-    #[serde(rename = "upload")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub upload: Option<ActivityContentDetailsUpload>,
-    #[serde(rename = "comment")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub comment: Option<ActivityContentDetailsComment>,
-    #[serde(rename = "social")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub social: Option<ActivityContentDetailsSocial>,
-    #[serde(rename = "playlistItem")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub playlist_item: Option<ActivityContentDetailsPlaylistItem>,
-    #[serde(rename = "bulletin")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub bulletin: Option<ActivityContentDetailsBulletin>,
-    #[serde(rename = "favorite")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub favorite: Option<ActivityContentDetailsFavorite>,
-}
-
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct LevelDetails {
-    /// The name that should be used when referring to this level.
-    #[serde(rename = "displayName")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub display_name: Option<String>,
-}
-
-/// Information about the uploaded video.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct ActivityContentDetailsUpload {
-    /// The ID that YouTube uses to uniquely identify the uploaded video.
-    #[serde(rename = "videoId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub video_id: Option<String>,
-}
-
-/// Details about monetization of a YouTube Video.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct VideoMonetizationDetails {
-    #[serde(rename = "access")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub access: Option<AccessPolicy>,
-}
-
-/// Stub token pagination template to suppress results.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct TokenPagination {}
-
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct MemberSnippet {
-    /// The id of the channel that's offering memberships.
-    #[serde(rename = "creatorChannelId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub creator_channel_id: Option<String>,
-    #[serde(rename = "membershipsDetails")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub memberships_details: Option<MembershipsDetails>,
-    #[serde(rename = "memberDetails")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub member_details: Option<ChannelProfileDetails>,
-}
-
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct VideoRatingListResponse {
-    /// The visitorId identifies the visitor.
-    #[serde(rename = "visitorId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub visitor_id: Option<String>,
-    /// Identifies what kind of resource this is. Value: the fixed string "youtube#videoGetRatingResponse".
-    #[serde(rename = "kind")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub kind: Option<String>,
-    /// A list of ratings that match the request criteria.
-    #[serde(rename = "items")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub items: Option<Vec<VideoRating>>,
+    pub snippet: Option<ChannelSectionSnippet>,
+    #[serde(rename = "targeting")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub targeting: Option<ChannelSectionTargeting>,
+}
+
+/// Details about a channelsection, including playlists and channels.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct ChannelSectionContentDetails {
+    /// The channel ids for type multiple_channels.
+    #[serde(rename = "channels")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub channels: Option<Vec<String>>,
+    /// The playlist ids for type single_playlist and multiple_playlists. For singlePlaylist, only one playlistId is allowed.
+    #[serde(rename = "playlists")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub playlists: Option<Vec<String>>,
+}
+
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct ChannelSectionListResponse {
     /// Etag of this resource.
     #[serde(rename = "etag")]
     #[serde(skip_serializing_if = "Option::is_none")]
@@ -1998,30 +809,59 @@
     #[serde(rename = "eventId")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub event_id: Option<String>,
-}
-
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct ThumbnailSetResponse {
+    /// A list of ChannelSections that match the request criteria.
+    #[serde(rename = "items")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub items: Option<Vec<ChannelSection>>,
+    /// 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>,
-    /// Etag of this resource.
-    #[serde(rename = "etag")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub etag: Option<String>,
-    /// Identifies what kind of resource this is. Value: the fixed string "youtube#thumbnailSetResponse".
-    #[serde(rename = "kind")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub kind: Option<String>,
-    /// Serialized EventId of the request which produced this response.
-    #[serde(rename = "eventId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub event_id: Option<String>,
-    /// A list of thumbnails.
-    #[serde(rename = "items")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub items: Option<Vec<ThumbnailDetails>>,
+}
+
+/// ChannelSection 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 details about a channel section, including title, style and position.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct ChannelSectionSnippet {
+    /// 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 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 position of the channel section in the channel.
+    #[serde(rename = "position")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub position: Option<u32>,
+    /// The style of the channel section.
+    #[serde(rename = "style")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub style: Option<ChannelSectionSnippetStyle>,
+    /// 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 type of the channel section.
+    #[serde(rename = "type")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub type_: Option<ChannelSectionSnippetType>,
 }
 
 /// ChannelSection targeting setting.
@@ -2041,477 +881,349 @@
     pub regions: Option<Vec<String>>,
 }
 
-/// Basic details about a subscription's subscriber including title, description, channel ID and thumbnails.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct SubscriptionSubscriberSnippet {
-    /// The description of the subscriber.
+/// Branding properties for the channel view.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct ChannelSettings {
+    /// The country of the channel.
+    #[serde(rename = "country")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub country: Option<String>,
+    #[serde(rename = "defaultLanguage")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub default_language: 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>,
+    /// Specifies the channel description.
     #[serde(rename = "description")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub description: Option<String>,
-    /// The channel ID of the subscriber.
-    #[serde(rename = "channelId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub channel_id: Option<String>,
-    /// The title of the subscriber.
+    /// Title for the featured channels tab.
+    #[serde(rename = "featuredChannelsTitle")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub featured_channels_title: 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>,
+    /// 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 the tab to browse the videos should be displayed.
+    #[serde(rename = "showBrowseView")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub show_browse_view: Option<bool>,
+    /// Whether related channels should be proposed.
+    #[serde(rename = "showRelatedChannels")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub show_related_channels: Option<bool>,
+    /// Specifies the channel 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>,
+    /// 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>,
+    /// 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>,
 }
 
 /// Basic details about a channel, including title, description and thumbnails.
 #[derive(Serialize, Deserialize, Debug, Clone, Default)]
 pub struct ChannelSnippet {
-    /// The channel's title.
-    #[serde(rename = "title")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub title: Option<String>,
-    #[serde(rename = "thumbnails")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub thumbnails: Option<ThumbnailDetails>,
-    /// DateTime: The date and time that the channel was created.
-    #[serde(rename = "publishedAt")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub published_at: Option<DateTime<Utc>>,
-    #[serde(rename = "localized")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub localized: Option<ChannelLocalization>,
-    /// The custom url of the channel.
-    #[serde(rename = "customUrl")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub custom_url: Option<String>,
-    /// The description of the channel.
-    #[serde(rename = "description")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub description: Option<String>,
-    /// The language of the channel's default title and description.
-    #[serde(rename = "defaultLanguage")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub default_language: Option<String>,
     /// The country of the channel.
     #[serde(rename = "country")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub country: Option<String>,
-}
-
-/// Basic details about a playlist, including title, description and thumbnails. Basic details of a YouTube Playlist item provided by the author. Next ID: 15
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct PlaylistItemSnippet {
-    /// Channel title for the channel that the playlist item belongs to.
-    #[serde(rename = "channelTitle")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub channel_title: Option<String>,
-    /// The order in which the item appears in the playlist. The value uses a zero-based index, so the first item has a position of 0, the second item has a position of 1, and so forth.
-    #[serde(rename = "position")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub position: Option<u32>,
-    /// Channel id for the channel this video belongs to.
-    #[serde(rename = "videoOwnerChannelId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub video_owner_channel_id: Option<String>,
-    /// The item's title.
-    #[serde(rename = "title")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub title: Option<String>,
+    /// The custom url of the channel.
+    #[serde(rename = "customUrl")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub custom_url: Option<String>,
+    /// The language of the channel's default title and description.
+    #[serde(rename = "defaultLanguage")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub default_language: Option<String>,
+    /// The description of the channel.
+    #[serde(rename = "description")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub description: Option<String>,
+    #[serde(rename = "localized")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub localized: Option<ChannelLocalization>,
+    /// DateTime: The date and time that the channel was created.
+    #[serde(rename = "publishedAt")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub published_at: Option<DateTime<Utc>>,
     #[serde(rename = "thumbnails")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub thumbnails: Option<ThumbnailDetails>,
-    #[serde(rename = "resourceId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub resource_id: Option<ResourceId>,
-    /// Channel title for the channel this video belongs to.
-    #[serde(rename = "videoOwnerChannelTitle")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub video_owner_channel_title: Option<String>,
-    /// The ID that YouTube uses to uniquely identify the user that added the item to the playlist.
-    #[serde(rename = "channelId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub channel_id: Option<String>,
-    /// The ID that YouTube uses to uniquely identify thGe playlist that the playlist item is in.
-    #[serde(rename = "playlistId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub playlist_id: Option<String>,
-    /// The item's description.
-    #[serde(rename = "description")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub description: Option<String>,
-    /// DateTime: The date and time that the item was added to the playlist.
-    #[serde(rename = "publishedAt")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub published_at: Option<DateTime<Utc>>,
-}
-
-/// Playlist localization setting
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct PlaylistLocalization {
-    /// The localized strings for playlist's description.
-    #[serde(rename = "description")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub description: Option<String>,
-    /// The localized strings for playlist's title.
+    /// The channel's title.
     #[serde(rename = "title")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub title: Option<String>,
 }
 
-/// Internal representation of thumbnails for a YouTube resource.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct ThumbnailDetails {
-    #[serde(rename = "medium")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub medium: Option<Thumbnail>,
-    #[serde(rename = "maxres")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub maxres: Option<Thumbnail>,
-    #[serde(rename = "default")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub default: Option<Thumbnail>,
-    #[serde(rename = "standard")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub standard: Option<Thumbnail>,
-    #[serde(rename = "high")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub high: Option<Thumbnail>,
-}
-
-/// A pair Property / Value.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct PropertyValue {
-    /// The property's value.
-    #[serde(rename = "value")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub value: Option<String>,
-    /// A property.
-    #[serde(rename = "property")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub property: Option<String>,
-}
-
-/// Branding properties of a YouTube channel.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct ChannelBrandingSettings {
-    #[serde(rename = "image")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub image: Option<ImageSettings>,
-    /// Additional experimental branding properties.
-    #[serde(rename = "hints")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub hints: Option<Vec<PropertyValue>>,
-    #[serde(rename = "channel")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub channel: Option<ChannelSettings>,
-    #[serde(rename = "watch")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub watch: Option<WatchSettings>,
-}
-
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct VideoAbuseReportReasonListResponse {
-    /// The `visitorId` identifies the visitor.
-    #[serde(rename = "visitorId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub visitor_id: Option<String>,
-    /// Serialized EventId of the request which produced this response.
-    #[serde(rename = "eventId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub event_id: Option<String>,
-    /// Identifies what kind of resource this is. Value: the fixed string `"youtube#videoAbuseReportReasonListResponse"`.
+/// 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 comments for the channel.
+    #[serde(rename = "commentCount")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub comment_count: Option<String>,
+    /// Whether or not the number of subscribers is shown for this user.
+    #[serde(rename = "hiddenSubscriberCount")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub hidden_subscriber_count: Option<bool>,
+    /// u64: The number of 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 times the channel has been viewed.
+    #[serde(rename = "viewCount")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub view_count: Option<String>,
+}
+
+/// JSON template for the status part of a channel.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct ChannelStatus {
+    /// If true, then the user is linked to either a YouTube username or G+ account. Otherwise, the user doesn't have a public YouTube identity.
+    #[serde(rename = "isLinked")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub is_linked: Option<bool>,
+    /// The long uploads status of this channel. See https://support.google.com/youtube/answer/71673 for more information.
+    #[serde(rename = "longUploadsStatus")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub long_uploads_status: Option<ChannelStatusLongUploadsStatus>,
+    #[serde(rename = "madeForKids")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub made_for_kids: Option<bool>,
+    /// Privacy status of the channel.
+    #[serde(rename = "privacyStatus")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub privacy_status: Option<ChannelStatusPrivacyStatus>,
+    #[serde(rename = "selfDeclaredMadeForKids")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub self_declared_made_for_kids: Option<bool>,
+}
+
+/// Information specific to a store on a merchandising platform linked to a YouTube channel.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct ChannelToStoreLinkDetails {
+    /// 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>>,
+}
+
+/// 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>,
+    /// The ID that YouTube uses to uniquely identify the comment.
+    #[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#comment".
     #[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>>,
+    #[serde(rename = "snippet")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub snippet: Option<CommentSnippet>,
+}
+
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct CommentListResponse {
     /// Etag of this resource.
     #[serde(rename = "etag")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub etag: Option<String>,
-}
-
-/// Basic details about a search result, including title, description and thumbnails of the item referenced by the search result.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct SearchResultSnippet {
-    /// The value that YouTube uses to uniquely identify the channel that published the resource that the search result identifies.
+    /// 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 comments that match the request criteria.
+    #[serde(rename = "items")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub items: Option<Vec<Comment>>,
+    /// Identifies what kind of resource this is. Value: the fixed string "youtube#commentListResponse".
+    #[serde(rename = "kind")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub kind: Option<String>,
+    /// The token that can be used as the value of the pageToken parameter to retrieve the next page in the result set.
+    #[serde(rename = "nextPageToken")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub next_page_token: Option<String>,
+    #[serde(rename = "pageInfo")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub page_info: Option<PageInfo>,
+    #[serde(rename = "tokenPagination")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub token_pagination: Option<TokenPagination>,
+    /// The visitorId identifies the visitor.
+    #[serde(rename = "visitorId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub visitor_id: Option<String>,
+}
+
+/// 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>,
+    /// 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 name of the user who posted the comment.
+    #[serde(rename = "authorDisplayName")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub author_display_name: Option<String>,
+    /// The URL for the avatar of the user who posted the comment.
+    #[serde(rename = "authorProfileImageUrl")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub author_profile_image_url: Option<String>,
+    /// Whether the current viewer can rate this comment.
+    #[serde(rename = "canRate")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub can_rate: Option<bool>,
+    /// 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>,
-    /// DateTime: The creation date and time of the resource that the search result identifies.
+    /// The total number of likes this comment has received.
+    #[serde(rename = "likeCount")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub like_count: Option<u32>,
+    /// The comment's moderation status. Will not be set if the comments were requested through the id filter.
+    #[serde(rename = "moderationStatus")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub moderation_status: Option<CommentSnippetModerationStatus>,
+    /// The unique id of the parent comment, only set for replies.
+    #[serde(rename = "parentId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub parent_id: Option<String>,
+    /// DateTime: The date and time when the comment was originally published.
     #[serde(rename = "publishedAt")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub published_at: Option<DateTime<Utc>>,
-    /// The title of the channel that published the resource that the search result identifies.
-    #[serde(rename = "channelTitle")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub channel_title: Option<String>,
-    /// A description of the search result.
-    #[serde(rename = "description")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub description: Option<String>,
-    /// The title of the search result.
-    #[serde(rename = "title")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub title: Option<String>,
-    #[serde(rename = "thumbnails")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub thumbnails: Option<ThumbnailDetails>,
-    /// It indicates if the resource (video or channel) has upcoming/active live broadcast content. Or it's "none" if there is not any upcoming/active live broadcasts.
-    #[serde(rename = "liveBroadcastContent")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub live_broadcast_content: Option<SearchResultSnippetLiveBroadcastContent>,
-}
-
-/// Details about the live streaming metadata.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct VideoLiveStreamingDetails {
-    /// DateTime: The time that the broadcast actually started. This value will not be available until the broadcast begins.
-    #[serde(rename = "actualStartTime")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub actual_start_time: Option<DateTime<Utc>>,
-    /// DateTime: The time that the broadcast actually ended. This value will not be available until the broadcast is over.
-    #[serde(rename = "actualEndTime")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub actual_end_time: Option<DateTime<Utc>>,
-    /// u64: The number of viewers currently watching the broadcast. The property and its value will be present if the broadcast has current viewers and the broadcast owner has not hidden the viewcount for the video. Note that YouTube stops tracking the number of concurrent viewers for a broadcast when the broadcast ends. So, this property would not identify the number of viewers watching an archived video of a live broadcast that already ended.
-    #[serde(rename = "concurrentViewers")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub concurrent_viewers: Option<String>,
-    /// The ID of the currently active live chat attached to this video. This field is filled only if the video is a currently live broadcast that has live chat. Once the broadcast transitions to complete this field will be removed and the live chat closed down. For persistent broadcasts that live chat id will no longer be tied to this video but rather to the new video being displayed at the persistent page.
-    #[serde(rename = "activeLiveChatId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub active_live_chat_id: Option<String>,
-    /// DateTime: The time that the broadcast is scheduled to end. If the value is empty or the property is not present, then the broadcast is scheduled to contiue indefinitely.
-    #[serde(rename = "scheduledEndTime")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub scheduled_end_time: Option<DateTime<Utc>>,
-    /// DateTime: The time that the broadcast is scheduled to begin.
-    #[serde(rename = "scheduledStartTime")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub scheduled_start_time: Option<DateTime<Utc>>,
-}
-
-/// Paging details for lists of resources, including total number of items available and number of resources returned in a single page.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct PageInfo {
-    /// The number of results included in the API response.
-    #[serde(rename = "resultsPerPage")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub results_per_page: Option<i32>,
-    /// The total number of results in the result set.
-    #[serde(rename = "totalResults")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub total_results: Option<i32>,
-}
-
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct PlaylistPlayer {
-    /// An <iframe> tag that embeds a player that will play the playlist.
-    #[serde(rename = "embedHtml")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub embed_html: Option<String>,
-}
-
-/// A *videoCategory* resource identifies a category that has been or could be associated with uploaded videos.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct VideoCategory {
-    /// The ID that YouTube uses to uniquely identify the video category.
-    #[serde(rename = "id")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub id: Option<String>,
-    /// Identifies what kind of resource this is. Value: the fixed string "youtube#videoCategory".
-    #[serde(rename = "kind")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub kind: Option<String>,
+    /// The comment's text. The format is either plain text or HTML dependent on what has been requested. Even the plain text representation may differ from the text originally posted in that it may replace video links with video titles etc.
+    #[serde(rename = "textDisplay")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub text_display: Option<String>,
+    /// The comment's original raw text as initially posted or last updated. The original text will only be returned if it is accessible to the viewer, which is only guaranteed if the viewer is the comment's author.
+    #[serde(rename = "textOriginal")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub text_original: Option<String>,
+    /// DateTime: The date and time when the comment was last updated.
+    #[serde(rename = "updatedAt")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub updated_at: Option<DateTime<Utc>>,
+    /// 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 rating the viewer has given to this comment. For the time being this will never return RATE_TYPE_DISLIKE and instead return RATE_TYPE_NONE. This may change in the future.
+    #[serde(rename = "viewerRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub viewer_rating: Option<CommentSnippetViewerRating>,
+}
+
+/// The id of the author's YouTube channel, if any.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct CommentSnippetAuthorChannelId {
+    #[serde(rename = "value")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub value: Option<String>,
+}
+
+/// A *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 {
     /// Etag of this resource.
     #[serde(rename = "etag")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub etag: Option<String>,
+    /// The ID that YouTube uses to uniquely identify the comment thread.
+    #[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#commentThread".
+    #[serde(rename = "kind")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub kind: Option<String>,
+    #[serde(rename = "replies")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub replies: Option<CommentThreadReplies>,
     #[serde(rename = "snippet")]
     #[serde(skip_serializing_if = "Option::is_none")]
-    pub snippet: Option<VideoCategorySnippet>,
-}
-
-/// Video processing progress and completion time estimate.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct VideoProcessingDetailsProcessingProgress {
-    /// u64: An estimate of the amount of time, in millseconds, that YouTube needs to finish processing the video.
-    #[serde(rename = "timeLeftMs")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub time_left_ms: Option<String>,
-    /// u64: The number of parts of the video that YouTube has already processed. You can estimate the percentage of the video that YouTube has already processed by calculating: 100 * parts_processed / parts_total Note that since the estimated number of parts could increase without a corresponding increase in the number of parts that have already been processed, it is possible that the calculated progress could periodically decrease while YouTube processes a video.
-    #[serde(rename = "partsProcessed")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub parts_processed: Option<String>,
-    /// u64: An estimate of the total number of parts that need to be processed for the video. The number may be updated with more precise estimates while YouTube processes the video.
-    #[serde(rename = "partsTotal")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub parts_total: Option<String>,
-}
-
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct ChannelContentDetailsRelatedPlaylists {
-    /// The ID of the playlist that contains the channel"s liked videos. Use the playlistItems.insert and playlistItems.delete to add or remove items from that list.
-    #[serde(rename = "likes")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub likes: Option<String>,
-    /// The ID of the playlist that contains the channel"s watch later playlist. Use the playlistItems.insert and playlistItems.delete to add or remove items from that list.
-    #[serde(rename = "watchLater")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub watch_later: Option<String>,
-    /// The ID of the playlist that contains the channel"s favorite videos. Use the playlistItems.insert and playlistItems.delete to add or remove items from that list.
-    #[serde(rename = "favorites")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub favorites: Option<String>,
-    /// The ID of the playlist that contains the channel"s uploaded videos. Use the videos.insert method to upload new videos and the videos.delete method to delete previously uploaded videos.
-    #[serde(rename = "uploads")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub uploads: Option<String>,
-    /// The ID of the playlist that contains the channel"s watch history. Use the playlistItems.insert and playlistItems.delete to add or remove items from that list.
-    #[serde(rename = "watchHistory")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub watch_history: Option<String>,
-}
-
-/// 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 RelatedEntity {
-    #[serde(rename = "entity")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub entity: Option<Entity>,
-}
-
-/// Describes processing status and progress and availability of some other Video resource parts.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct VideoProcessingDetails {
-    /// This value indicates whether thumbnail images have been generated for the video.
-    #[serde(rename = "thumbnailsAvailability")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub thumbnails_availability: Option<String>,
-    /// This value indicates whether the video processing engine has generated suggestions that might improve YouTube's ability to process the the video, warnings that explain video processing problems, or errors that cause video processing problems. You can retrieve these suggestions by requesting the suggestions part in your videos.list() request.
-    #[serde(rename = "processingIssuesAvailability")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub processing_issues_availability: Option<String>,
-    /// The video's processing status. This value indicates whether YouTube was able to process the video or if the video is still being processed.
-    #[serde(rename = "processingStatus")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub processing_status: Option<VideoProcessingDetailsProcessingStatus>,
-    /// This value indicates whether video editing suggestions, which might improve video quality or the playback experience, are available for the video. You can retrieve these suggestions by requesting the suggestions part in your videos.list() request.
-    #[serde(rename = "editorSuggestionsAvailability")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub editor_suggestions_availability: Option<String>,
-    #[serde(rename = "processingProgress")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub processing_progress: Option<VideoProcessingDetailsProcessingProgress>,
-    /// The reason that YouTube failed to process the video. This property will only have a value if the processingStatus property's value is failed.
-    #[serde(rename = "processingFailureReason")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub processing_failure_reason: Option<VideoProcessingDetailsProcessingFailureReason>,
-    /// This value indicates whether keyword (tag) suggestions are available for the video. Tags can be added to a video's metadata to make it easier for other users to find the video. You can retrieve these suggestions by requesting the suggestions part in your videos.list() request.
-    #[serde(rename = "tagSuggestionsAvailability")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub tag_suggestions_availability: Option<String>,
-    /// This value indicates whether file details are available for the uploaded video. You can retrieve a video's file details by requesting the fileDetails part in your videos.list() request.
-    #[serde(rename = "fileDetailsAvailability")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub file_details_availability: Option<String>,
-}
-
-/// Basic details about rating of a video.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct VideoRating {
-    /// The ID that YouTube uses to uniquely identify the video.
-    #[serde(rename = "videoId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub video_id: Option<String>,
-    /// Rating of a video.
-    #[serde(rename = "rating")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub rating: Option<VideoRatingRating>,
-}
-
-/// A search result contains information about a YouTube video, channel, or playlist that matches the search parameters specified in an API request. While a search result points to a uniquely identifiable resource, like a video, it does not have its own persistent data.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct SearchResult {
-    #[serde(rename = "snippet")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub snippet: Option<SearchResultSnippet>,
+    pub snippet: Option<CommentThreadSnippet>,
+}
+
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct CommentThreadListResponse {
     /// Etag of this resource.
     #[serde(rename = "etag")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub etag: Option<String>,
-    /// Identifies what kind of resource this is. Value: the fixed string "youtube#searchResult".
-    #[serde(rename = "kind")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub kind: Option<String>,
-    #[serde(rename = "id")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub id: Option<ResourceId>,
-}
-
-/// A channel banner returned as the response to a channel_banner.insert call.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct ChannelBannerResource {
-    /// Identifies what kind of resource this is. Value: the fixed string "youtube#channelBannerResource".
+    /// 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>>,
+    /// Identifies what kind of resource this is. Value: the fixed string "youtube#commentThreadListResponse".
     #[serde(rename = "kind")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub kind: Option<String>,
-    #[serde(rename = "etag")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub etag: Option<String>,
-    /// The URL of this banner image.
-    #[serde(rename = "url")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub url: Option<String>,
-}
-
-/// Information about a video stream.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct VideoFileDetailsVideoStream {
-    /// The encoded video content's height in pixels.
-    #[serde(rename = "heightPixels")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub height_pixels: Option<u32>,
-    /// A value that uniquely identifies a video vendor. Typically, the value is a four-letter vendor code.
-    #[serde(rename = "vendor")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub vendor: Option<String>,
-    /// The video stream's frame rate, in frames per second.
-    #[serde(rename = "frameRateFps")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub frame_rate_fps: Option<f64>,
-    /// The video content's display aspect ratio, which specifies the aspect ratio in which the video should be displayed.
-    #[serde(rename = "aspectRatio")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub aspect_ratio: Option<f64>,
-    /// The amount that YouTube needs to rotate the original source content to properly display the video.
-    #[serde(rename = "rotation")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub rotation: Option<VideoFileDetailsVideoStreamRotation>,
-    /// u64: The video stream's bitrate, in bits per second.
-    #[serde(rename = "bitrateBps")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub bitrate_bps: Option<String>,
-    /// The encoded video content's width in pixels. You can calculate the video's encoding aspect ratio as width_pixels / height_pixels.
-    #[serde(rename = "widthPixels")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub width_pixels: Option<u32>,
-    /// The video codec that the stream uses.
-    #[serde(rename = "codec")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub codec: Option<String>,
-}
-
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct LiveStreamListResponse {
+    /// The token that can be used as the value of the pageToken parameter to retrieve the next page in the result set.
+    #[serde(rename = "nextPageToken")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub next_page_token: Option<String>,
+    #[serde(rename = "pageInfo")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub page_info: Option<PageInfo>,
     #[serde(rename = "tokenPagination")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub token_pagination: Option<TokenPagination>,
@@ -2519,474 +1231,362 @@
     #[serde(rename = "visitorId")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub visitor_id: Option<String>,
-    /// A list of live streams that match the request criteria.
-    #[serde(rename = "items")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub items: Option<Vec<LiveStream>>,
-    /// The token that can be used as the value of the pageToken parameter to retrieve the next page in the result set.
-    #[serde(rename = "nextPageToken")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub next_page_token: Option<String>,
-    /// Serialized EventId of the request which produced this response.
-    #[serde(rename = "eventId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub event_id: Option<String>,
-    #[serde(rename = "pageInfo")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub page_info: Option<PageInfo>,
-    /// The token that can be used as the value of the pageToken parameter to retrieve the previous page in the result set.
-    #[serde(rename = "prevPageToken")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub prev_page_token: Option<String>,
-    /// Identifies what kind of resource this is. Value: the fixed string "youtube#liveStreamListResponse".
-    #[serde(rename = "kind")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub kind: Option<String>,
-    /// Etag of this resource.
-    #[serde(rename = "etag")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub etag: Option<String>,
-}
-
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct LiveChatMessageDeletedDetails {
-    #[serde(rename = "deletedMessageId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub deleted_message_id: Option<String>,
-}
-
-/// Describes information necessary for ingesting an RTMP or an HTTP stream.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct IngestionInfo {
-    /// This ingestion url may be used instead of backupIngestionAddress in order to stream via RTMPS. Not applicable to non-RTMP streams.
-    #[serde(rename = "rtmpsBackupIngestionAddress")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub rtmps_backup_ingestion_address: Option<String>,
-    /// The backup ingestion URL that you should use to stream video to YouTube. You have the option of simultaneously streaming the content that you are sending to the ingestionAddress to this URL.
-    #[serde(rename = "backupIngestionAddress")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub backup_ingestion_address: Option<String>,
-    /// The HTTP or RTMP stream name that YouTube assigns to the video stream.
-    #[serde(rename = "streamName")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub stream_name: Option<String>,
-    /// This ingestion url may be used instead of ingestionAddress in order to stream via RTMPS. Not applicable to non-RTMP streams.
-    #[serde(rename = "rtmpsIngestionAddress")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub rtmps_ingestion_address: Option<String>,
-    /// The primary ingestion URL that you should use to stream video to YouTube. You must stream video to this URL. Depending on which application or tool you use to encode your video stream, you may need to enter the stream URL and stream name separately or you may need to concatenate them in the following format: *STREAM_URL/STREAM_NAME*
-    #[serde(rename = "ingestionAddress")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub ingestion_address: Option<String>,
-}
-
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct LiveChatBanSnippet {
-    /// The chat this ban is pertinent to.
-    #[serde(rename = "liveChatId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub live_chat_id: Option<String>,
-    #[serde(rename = "bannedUserDetails")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub banned_user_details: Option<ChannelProfileDetails>,
-    /// The type of ban.
-    #[serde(rename = "type")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub type_: Option<LiveChatBanSnippetType>,
-    /// u64: The duration of a ban, only filled if the ban has type TEMPORARY.
-    #[serde(rename = "banDurationSeconds")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub ban_duration_seconds: Option<String>,
-}
-
-/// Branding properties for images associated with the channel.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct ImageSettings {
-    #[serde(rename = "largeBrandedBannerImageUrl")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub large_branded_banner_image_url: Option<LocalizedProperty>,
-    #[serde(rename = "smallBrandedBannerImageUrl")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub small_branded_banner_image_url: Option<LocalizedProperty>,
-    /// Banner image. Tablet size low resolution (1138x188).
-    #[serde(rename = "bannerTabletLowImageUrl")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub banner_tablet_low_image_url: Option<String>,
-    #[serde(rename = "smallBrandedBannerImageImapScript")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub small_branded_banner_image_imap_script: Option<LocalizedProperty>,
-    #[serde(rename = "largeBrandedBannerImageImapScript")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub large_branded_banner_image_imap_script: Option<LocalizedProperty>,
-    /// Banner image. Tablet size extra high resolution (2560x424).
-    #[serde(rename = "bannerTabletExtraHdImageUrl")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub banner_tablet_extra_hd_image_url: Option<String>,
-    /// Banner image. Mobile size low resolution (320x88).
-    #[serde(rename = "bannerMobileLowImageUrl")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub banner_mobile_low_image_url: Option<String>,
-    /// The URL for a 1px by 1px tracking pixel that can be used to collect statistics for views of the channel or video pages.
-    #[serde(rename = "trackingImageUrl")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub tracking_image_url: Option<String>,
-    /// Banner image. Tablet size (1707x283).
-    #[serde(rename = "bannerTabletImageUrl")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub banner_tablet_image_url: Option<String>,
-    /// Banner image. Mobile size medium/high resolution (960x263).
-    #[serde(rename = "bannerMobileMediumHdImageUrl")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub banner_mobile_medium_hd_image_url: Option<String>,
-    /// Banner image. TV size low resolution (854x480).
-    #[serde(rename = "bannerTvLowImageUrl")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub banner_tv_low_image_url: Option<String>,
-    /// Banner image. TV size medium resolution (1280x720).
-    #[serde(rename = "bannerTvMediumImageUrl")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub banner_tv_medium_image_url: Option<String>,
-    #[serde(rename = "watchIconImageUrl")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub watch_icon_image_url: Option<String>,
-    /// Banner image. Mobile size high resolution (1440x395).
-    #[serde(rename = "bannerMobileExtraHdImageUrl")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub banner_mobile_extra_hd_image_url: Option<String>,
-    /// Banner image. TV size high resolution (1920x1080).
-    #[serde(rename = "bannerTvHighImageUrl")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub banner_tv_high_image_url: Option<String>,
-    /// Banner image. Desktop size (1060x175).
-    #[serde(rename = "bannerImageUrl")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub banner_image_url: Option<String>,
-    /// Banner image. Mobile size high resolution (1280x360).
-    #[serde(rename = "bannerMobileHdImageUrl")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub banner_mobile_hd_image_url: Option<String>,
-    /// Banner image. TV size extra high resolution (2120x1192).
-    #[serde(rename = "bannerTvImageUrl")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub banner_tv_image_url: Option<String>,
-    /// Banner image. Mobile size (640x175).
-    #[serde(rename = "bannerMobileImageUrl")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub banner_mobile_image_url: Option<String>,
-    /// This is generated when a ChannelBanner.Insert request has succeeded for the given channel.
-    #[serde(rename = "bannerExternalUrl")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub banner_external_url: Option<String>,
-    /// Banner image. Tablet size high resolution (2276x377).
-    #[serde(rename = "bannerTabletHdImageUrl")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub banner_tablet_hd_image_url: Option<String>,
-    #[serde(rename = "backgroundImageUrl")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub background_image_url: Option<LocalizedProperty>,
-}
-
-/// A *channel* resource contains information about a YouTube channel.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct Channel {
-    /// The ID that YouTube uses to uniquely identify the channel.
-    #[serde(rename = "id")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub id: Option<String>,
-    /// Localizations for different languages
-    #[serde(rename = "localizations")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub localizations: Option<HashMap<String, ChannelLocalization>>,
-    #[serde(rename = "snippet")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub snippet: Option<ChannelSnippet>,
-    #[serde(rename = "brandingSettings")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub branding_settings: Option<ChannelBrandingSettings>,
-    #[serde(rename = "conversionPings")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub conversion_pings: Option<ChannelConversionPings>,
-    #[serde(rename = "auditDetails")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub audit_details: Option<ChannelAuditDetails>,
-    #[serde(rename = "topicDetails")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub topic_details: Option<ChannelTopicDetails>,
-    #[serde(rename = "status")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub status: Option<ChannelStatus>,
-    /// Etag of this resource.
-    #[serde(rename = "etag")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub etag: Option<String>,
-    #[serde(rename = "contentDetails")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub content_details: Option<ChannelContentDetails>,
-    #[serde(rename = "contentOwnerDetails")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub content_owner_details: Option<ChannelContentOwnerDetails>,
-    /// Identifies what kind of resource this is. Value: the fixed string "youtube#channel".
-    #[serde(rename = "kind")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub kind: Option<String>,
-    #[serde(rename = "statistics")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub statistics: Option<ChannelStatistics>,
-}
-
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct PlaylistItemContentDetails {
-    /// A user-generated note for this item.
-    #[serde(rename = "note")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub note: Option<String>,
-    /// The ID that YouTube uses to uniquely identify a video. To retrieve the video resource, set the id query parameter to this value in your API request.
+}
+
+/// Comments written in (direct or indirect) reply to the top level comment.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct CommentThreadReplies {
+    /// A limited number of replies. Unless the number of replies returned equals total_reply_count in the snippet the returned replies are only a subset of the total number of replies.
+    #[serde(rename = "comments")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub comments: Option<Vec<Comment>>,
+}
+
+/// Basic details about a comment thread.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct CommentThreadSnippet {
+    /// Whether the current viewer of the thread can reply to it. This is viewer specific - other viewers may see a different value for this field.
+    #[serde(rename = "canReply")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub can_reply: Option<bool>,
+    /// The 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>,
+    /// 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 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 time, measured in seconds from the start of the video, when the video should start playing. (The playlist owner can specify the times when the video should start and stop playing when the video is played in the context of the playlist.) The default value is 0.
-    #[serde(rename = "startAt")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub start_at: Option<String>,
-    /// DateTime: The date and time that the video was published to YouTube.
-    #[serde(rename = "videoPublishedAt")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub video_published_at: Option<DateTime<Utc>>,
-    /// The time, measured in seconds from the start of the video, when the video should stop playing. (The playlist owner can specify the times when the video should start and stop playing when the video is played in the context of the playlist.) By default, assume that the video.endTime is the end of the video.
-    #[serde(rename = "endAt")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub end_at: Option<String>,
-}
-
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct LiveChatModeratorListResponse {
-    /// The visitorId identifies the visitor.
-    #[serde(rename = "visitorId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub visitor_id: Option<String>,
-    /// Etag of this resource.
-    #[serde(rename = "etag")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub etag: Option<String>,
-    /// A list of moderators that match the request criteria.
-    #[serde(rename = "items")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub items: Option<Vec<LiveChatModerator>>,
-    /// Identifies what kind of resource this is. Value: the fixed string "youtube#liveChatModeratorListResponse".
-    #[serde(rename = "kind")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub kind: Option<String>,
-    /// Serialized EventId of the request which produced this response.
-    #[serde(rename = "eventId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub event_id: Option<String>,
-    /// The token that can be used as the value of the pageToken parameter to retrieve the next page in the result set.
-    #[serde(rename = "nextPageToken")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub next_page_token: Option<String>,
-    /// The token that can be used as the value of the pageToken parameter to retrieve the previous page in the result set.
-    #[serde(rename = "prevPageToken")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub prev_page_token: Option<String>,
-    #[serde(rename = "pageInfo")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub page_info: Option<PageInfo>,
-    #[serde(rename = "tokenPagination")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub token_pagination: Option<TokenPagination>,
-}
-
-/// Details about a resource which is being promoted.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct ActivityContentDetailsPromotedItem {
-    /// The URL the client should ping to indicate that the user was shown this promoted item.
-    #[serde(rename = "creativeViewUrl")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub creative_view_url: Option<String>,
-    /// The custom call-to-action button text. If specified, it will override the default button text for the cta_type.
-    #[serde(rename = "customCtaButtonText")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub custom_cta_button_text: Option<String>,
-    /// The type of call-to-action, a message to the user indicating action that can be taken.
-    #[serde(rename = "ctaType")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub cta_type: Option<ActivityContentDetailsPromotedItemCtaType>,
-    /// The URL the client should direct the user to, if the user chooses to visit the advertiser's website.
-    #[serde(rename = "destinationUrl")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub destination_url: Option<String>,
-    /// The text description to accompany the promoted item.
-    #[serde(rename = "descriptionText")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub description_text: Option<String>,
-    /// The list of impression URLs. The client should ping all of these URLs to indicate that the user was shown this promoted item.
-    #[serde(rename = "impressionUrl")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub impression_url: Option<Vec<String>>,
-    /// The list of forecasting URLs. The client should ping all of these URLs when a promoted item is not available, to indicate that a promoted item could have been shown.
-    #[serde(rename = "forecastingUrl")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub forecasting_url: Option<Vec<String>>,
-    /// The URL the client should fetch to request a promoted item.
-    #[serde(rename = "adTag")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub ad_tag: Option<String>,
-    /// The URL the client should ping to indicate that the user clicked through on this promoted item.
-    #[serde(rename = "clickTrackingUrl")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub click_tracking_url: Option<String>,
-    /// The ID that YouTube uses to uniquely identify the promoted video.
-    #[serde(rename = "videoId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub video_id: Option<String>,
-}
-
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct ChannelListResponse {
-    #[serde(rename = "pageInfo")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub page_info: Option<PageInfo>,
-    #[serde(rename = "tokenPagination")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub token_pagination: Option<TokenPagination>,
-    /// Identifies what kind of resource this is. Value: the fixed string "youtube#channelListResponse".
-    #[serde(rename = "kind")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub kind: Option<String>,
-    /// The visitorId identifies the visitor.
-    #[serde(rename = "visitorId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub visitor_id: Option<String>,
-    /// The token that can be used as the value of the pageToken parameter to retrieve the previous page in the result set.
-    #[serde(rename = "prevPageToken")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub prev_page_token: Option<String>,
-    /// Etag of this resource.
-    #[serde(rename = "etag")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub etag: Option<String>,
-    #[serde(rename = "items")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub items: Option<Vec<Channel>>,
-    /// The token that can be used as the value of the pageToken parameter to retrieve the next page in the result set.
-    #[serde(rename = "nextPageToken")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub next_page_token: Option<String>,
-    /// Serialized EventId of the request which produced this response.
-    #[serde(rename = "eventId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub event_id: Option<String>,
-}
-
-/// The contentOwnerDetails object encapsulates channel data that is relevant for YouTube Partners linked with the channel.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct ChannelContentOwnerDetails {
-    /// DateTime: The date and time when the channel was linked to the content owner.
-    #[serde(rename = "timeLinked")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub time_linked: Option<DateTime<Utc>>,
-    /// The ID of the content owner linked to the channel.
-    #[serde(rename = "contentOwner")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub content_owner: Option<String>,
-}
-
-/// A `__videoAbuseReportReason__` resource identifies a reason that a video could be reported as abusive. Video abuse report reasons are used with `video.ReportAbuse`.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct VideoAbuseReportReason {
-    #[serde(rename = "snippet")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub snippet: Option<VideoAbuseReportReasonSnippet>,
-    /// Identifies what kind of resource this is. Value: the fixed string `"youtube#videoAbuseReportReason"`.
-    #[serde(rename = "kind")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub kind: Option<String>,
-    /// The ID of this abuse report reason.
+}
+
+/// 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 Australian Classification Board (ACB) or Australian Communications and Media Authority (ACMA) rating. ACMA ratings are used to classify children's television programming.
+    #[serde(rename = "acbRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub acb_rating: Option<ContentRatingAcbRating>,
+    /// The video's rating from 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 Anatel (Asociación Nacional de Televisión) rating for Chilean television.
+    #[serde(rename = "anatelRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub anatel_rating: Option<ContentRatingAnatelRating>,
+    /// The video's British Board of Film Classification (BBFC) rating.
+    #[serde(rename = "bbfcRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub bbfc_rating: Option<ContentRatingBbfcRating>,
+    /// The video's rating from 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 from the Austrian Board of Media Classification (Bundesministerium für Unterricht, Kunst und Kultur).
+    #[serde(rename = "bmukkRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub bmukk_rating: Option<ContentRatingBmukkRating>,
+    /// Rating system 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 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 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 Consejo de Calificación Cinematográfica (Chile) rating.
+    #[serde(rename = "cccRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub ccc_rating: Option<ContentRatingCccRating>,
+    /// The video's rating from Portugal's Comissão de Classificação de Espect´culos.
+    #[serde(rename = "cceRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub cce_rating: Option<ContentRatingCceRating>,
+    /// The video's rating in Switzerland.
+    #[serde(rename = "chfilmRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub chfilm_rating: Option<ContentRatingChfilmRating>,
+    /// 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 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 Romania's CONSILIUL NATIONAL AL AUDIOVIZUALULUI (CNA).
+    #[serde(rename = "cnaRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub cna_rating: Option<ContentRatingCnaRating>,
+    /// Rating system in France - Commission de classification cinematographique
+    #[serde(rename = "cncRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub cnc_rating: Option<ContentRatingCncRating>,
+    /// The video's rating from France's Conseil supérieur de l’audiovisuel, which rates broadcast content.
+    #[serde(rename = "csaRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub csa_rating: Option<ContentRatingCsaRating>,
+    /// The video's rating from 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 the Czech Republic.
+    #[serde(rename = "czfilmRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub czfilm_rating: Option<ContentRatingCzfilmRating>,
+    /// 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>,
+    /// 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>>,
+    /// 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 in Estonia.
+    #[serde(rename = "eefilmRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub eefilm_rating: Option<ContentRatingEefilmRating>,
+    /// The video's rating in Egypt.
+    #[serde(rename = "egfilmRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub egfilm_rating: Option<ContentRatingEgfilmRating>,
+    /// 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 Malaysia's Film Censorship Board.
+    #[serde(rename = "fcbmRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub fcbm_rating: Option<ContentRatingFcbmRating>,
+    /// The video's rating from 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>,
+    /// This property has been deprecated. Use the contentDetails.contentRating.cncRating instead.
+    #[serde(rename = "fmocRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub fmoc_rating: Option<ContentRatingFmocRating>,
+    /// The video's rating from South Africa's Film and Publication Board.
+    #[serde(rename = "fpbRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub fpb_rating: Option<ContentRatingFpbRating>,
+    /// 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 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 in Greece.
+    #[serde(rename = "grfilmRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub grfilm_rating: Option<ContentRatingGrfilmRating>,
+    /// 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 Irish Film Classification Office (IFCO - Ireland) rating. See the IFCO website for more information.
+    #[serde(rename = "ifcoRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub ifco_rating: Option<ContentRatingIfcoRating>,
+    /// The video's rating in Israel.
+    #[serde(rename = "ilfilmRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub ilfilm_rating: Option<ContentRatingIlfilmRating>,
+    /// The video's INCAA (Instituto Nacional de Cine y Artes Audiovisuales - Argentina) rating.
+    #[serde(rename = "incaaRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub incaa_rating: Option<ContentRatingIncaaRating>,
+    /// The video's rating from the Kenya Film Classification Board.
+    #[serde(rename = "kfcbRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub kfcb_rating: Option<ContentRatingKfcbRating>,
+    /// 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 Korea Media Rating Board (영상물등급위원회) rating. The KMRB rates videos in South Korea.
+    #[serde(rename = "kmrbRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub kmrb_rating: Option<ContentRatingKmrbRating>,
+    /// The video's rating from Indonesia's Lembaga Sensor Film.
+    #[serde(rename = "lsfRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub lsf_rating: Option<ContentRatingLsfRating>,
+    /// 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 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 system for Vietnam - MCST
+    #[serde(rename = "mcstRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub mcst_rating: Option<ContentRatingMcstRating>,
+    /// 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 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 Finland's Kansallinen Audiovisuaalinen Instituutti (National Audiovisual Institute).
+    #[serde(rename = "mekuRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub meku_rating: Option<ContentRatingMekuRating>,
+    /// The rating system for MENA countries, a clone of MPAA. It is needed to prevent titles go live w/o additional QC check, since some of them can be inappropriate for the countries at all. See b/33408548 for more details.
+    #[serde(rename = "menaMpaaRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub mena_mpaa_rating: Option<ContentRatingMenaMpaaRating>,
+    /// The video's rating from the 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 Ministerio de Cultura (Colombia) rating.
+    #[serde(rename = "mocRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub moc_rating: Option<ContentRatingMocRating>,
+    /// The video's rating from Taiwan's Ministry of Culture (文化部).
+    #[serde(rename = "moctwRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub moctw_rating: Option<ContentRatingMoctwRating>,
+    /// 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 rating system for trailer, DVD, and Ad in the US. See http://movielabs.com/md/ratings/v2.3/html/US_MPAAT_Ratings.html.
+    #[serde(rename = "mpaatRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub mpaat_rating: Option<ContentRatingMpaatRating>,
+    /// The video's rating from the Movie and Television Review and Classification Board (Philippines).
+    #[serde(rename = "mtrcbRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub mtrcb_rating: Option<ContentRatingMtrcbRating>,
+    /// The video's rating 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 in Poland.
+    #[serde(rename = "nbcplRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub nbcpl_rating: Option<ContentRatingNbcplRating>,
+    /// 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 Nigeria's National Film and Video Censors Board.
+    #[serde(rename = "nfvcbRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub nfvcb_rating: Option<ContentRatingNfvcbRating>,
+    /// The video's rating from the 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 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 Office of Film and Literature Classification (OFLC - New Zealand) rating.
+    #[serde(rename = "oflcRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub oflc_rating: Option<ContentRatingOflcRating>,
+    /// The video's rating in Peru.
+    #[serde(rename = "pefilmRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub pefilm_rating: Option<ContentRatingPefilmRating>,
+    /// The video's rating from the Hungarian Nemzeti Filmiroda, the Rating Committee of the National Office of Film.
+    #[serde(rename = "rcnofRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub rcnof_rating: Option<ContentRatingRcnofRating>,
+    /// The video's rating in Venezuela.
+    #[serde(rename = "resorteviolenciaRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub resorteviolencia_rating: Option<ContentRatingResorteviolenciaRating>,
+    /// 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 video's National Film Registry of the Russian Federation (MKRF - Russia) rating.
+    #[serde(rename = "russiaRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub russia_rating: Option<ContentRatingRussiaRating>,
+    /// The video's rating in Slovakia.
+    #[serde(rename = "skfilmRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub skfilm_rating: Option<ContentRatingSkfilmRating>,
+    /// The video's rating in Iceland.
+    #[serde(rename = "smaisRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub smais_rating: Option<ContentRatingSmaisRating>,
+    /// The video's rating from Statens medieråd (Sweden's National Media Council).
+    #[serde(rename = "smsaRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub smsa_rating: Option<ContentRatingSmsaRating>,
+    /// The video's TV Parental Guidelines (TVPG) rating.
+    #[serde(rename = "tvpgRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub tvpg_rating: Option<ContentRatingTvpgRating>,
+    /// 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>,
+}
+
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct Entity {
     #[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 MembershipsLevelListResponse {
-    /// Serialized EventId of the request which produced this response.
-    #[serde(rename = "eventId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub event_id: Option<String>,
-    /// Identifies what kind of resource this is. Value: the fixed string "youtube#membershipsLevelListResponse".
-    #[serde(rename = "kind")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub kind: Option<String>,
-    /// Etag of this resource.
-    #[serde(rename = "etag")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub etag: Option<String>,
-    /// A list of pricing levels offered by a creator to the fans.
-    #[serde(rename = "items")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub items: Option<Vec<MembershipsLevel>>,
-    /// The visitorId identifies the visitor.
-    #[serde(rename = "visitorId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub visitor_id: Option<String>,
-}
-
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct SuperChatEventSnippet {
-    /// A rendered string that displays the purchase amount and currency (e.g., "$1.00"). The string is rendered for the given language.
-    #[serde(rename = "displayString")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub display_string: Option<String>,
-    /// The tier for the paid message, which is based on the amount of money spent to purchase the message.
-    #[serde(rename = "messageType")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub message_type: Option<u32>,
-    /// u64: The purchase amount, in micros of the purchase currency. e.g., 1 is represented as 1000000.
-    #[serde(rename = "amountMicros")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub amount_micros: Option<String>,
-    /// The currency in which the purchase was made. ISO 4217.
-    #[serde(rename = "currency")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub currency: Option<String>,
-    #[serde(rename = "superStickerMetadata")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub super_sticker_metadata: Option<SuperStickerMetadata>,
-    /// Channel id where the event occurred.
-    #[serde(rename = "channelId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub channel_id: Option<String>,
-    #[serde(rename = "supporterDetails")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub supporter_details: Option<ChannelProfileDetails>,
-    /// DateTime: The date and time when the event occurred.
-    #[serde(rename = "createdAt")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub created_at: Option<DateTime<Utc>>,
-    /// The text contents of the comment left by the user.
-    #[serde(rename = "commentText")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub comment_text: Option<String>,
-    /// True if this event is a Super Sticker event.
-    #[serde(rename = "isSuperStickerEvent")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub is_super_sticker_event: Option<bool>,
-}
-
-/// Basic information about a third party account link, including its type and type-specific information.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct ThirdPartyLinkSnippet {
-    #[serde(rename = "channelToStoreLink")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub channel_to_store_link: Option<ChannelToStoreLinkDetails>,
-    /// Type of the link named after the entities that are being linked.
-    #[serde(rename = "type")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub type_: Option<ThirdPartyLinkSnippetType>,
+    #[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>,
+}
+
+/// 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>,
 }
 
 /// An *i18nLanguage* resource identifies a UI language currently supported by YouTube.
@@ -2996,17 +1596,1217 @@
     #[serde(rename = "etag")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub etag: Option<String>,
+    /// The ID that YouTube uses to uniquely identify the i18n language.
+    #[serde(rename = "id")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub id: Option<String>,
     /// 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 = "snippet")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub snippet: Option<I18nLanguageSnippet>,
+}
+
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct I18nLanguageListResponse {
+    /// Etag of this resource.
+    #[serde(rename = "etag")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub etag: Option<String>,
+    /// Serialized EventId of the request which produced this response.
+    #[serde(rename = "eventId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub event_id: Option<String>,
+    /// A list of 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>>,
+    /// 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>,
+    /// The visitorId identifies the visitor.
+    #[serde(rename = "visitorId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub visitor_id: Option<String>,
+}
+
+/// Basic details about an i18n language, such as language code and human-readable name.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct I18nLanguageSnippet {
+    /// A short BCP-47 code that uniquely identifies a language.
+    #[serde(rename = "hl")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub hl: Option<String>,
+    /// The human-readable name of the language in the language itself.
+    #[serde(rename = "name")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub name: Option<String>,
+}
+
+/// A *i18nRegion* resource identifies a region where YouTube is available.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct I18nRegion {
+    /// Etag of this resource.
+    #[serde(rename = "etag")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub etag: Option<String>,
+    /// The ID that YouTube uses to uniquely identify the i18n region.
+    #[serde(rename = "id")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub id: Option<String>,
+    /// Identifies what kind of resource this is. Value: the fixed string "youtube#i18nRegion".
+    #[serde(rename = "kind")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub kind: Option<String>,
+    #[serde(rename = "snippet")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub snippet: Option<I18nRegionSnippet>,
+}
+
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct I18nRegionListResponse {
+    /// Etag of this resource.
+    #[serde(rename = "etag")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub etag: Option<String>,
+    /// Serialized EventId of the request which produced this response.
+    #[serde(rename = "eventId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub event_id: Option<String>,
+    /// A list of regions where YouTube is available. In this map, the i18n region ID is the map key, and its value is the corresponding i18nRegion resource.
+    #[serde(rename = "items")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub items: Option<Vec<I18nRegion>>,
+    /// Identifies what kind of resource this is. Value: the fixed string "youtube#i18nRegionListResponse".
+    #[serde(rename = "kind")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub kind: Option<String>,
+    /// The visitorId identifies the visitor.
+    #[serde(rename = "visitorId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub visitor_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>,
+}
+
+/// Branding properties for images associated with the channel.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct ImageSettings {
+    #[serde(rename = "backgroundImageUrl")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub background_image_url: Option<LocalizedProperty>,
+    /// This is generated when a ChannelBanner.Insert request has succeeded for the given channel.
+    #[serde(rename = "bannerExternalUrl")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub banner_external_url: Option<String>,
+    /// Banner image. Desktop size (1060x175).
+    #[serde(rename = "bannerImageUrl")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub banner_image_url: Option<String>,
+    /// Banner image. Mobile size high resolution (1440x395).
+    #[serde(rename = "bannerMobileExtraHdImageUrl")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub banner_mobile_extra_hd_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. Mobile size (640x175).
+    #[serde(rename = "bannerMobileImageUrl")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub banner_mobile_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. Mobile size medium/high resolution (960x263).
+    #[serde(rename = "bannerMobileMediumHdImageUrl")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub banner_mobile_medium_hd_image_url: Option<String>,
+    /// Banner image. Tablet size extra high resolution (2560x424).
+    #[serde(rename = "bannerTabletExtraHdImageUrl")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub banner_tablet_extra_hd_image_url: Option<String>,
+    /// Banner image. Tablet size high resolution (2276x377).
+    #[serde(rename = "bannerTabletHdImageUrl")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub banner_tablet_hd_image_url: Option<String>,
+    /// Banner image. Tablet size (1707x283).
+    #[serde(rename = "bannerTabletImageUrl")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub banner_tablet_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. TV size high resolution (1920x1080).
+    #[serde(rename = "bannerTvHighImageUrl")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub banner_tv_high_image_url: Option<String>,
+    /// Banner image. TV size extra high resolution (2120x1192).
+    #[serde(rename = "bannerTvImageUrl")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub banner_tv_image_url: Option<String>,
+    /// Banner image. TV size low resolution (854x480).
+    #[serde(rename = "bannerTvLowImageUrl")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub banner_tv_low_image_url: Option<String>,
+    /// Banner image. TV size medium resolution (1280x720).
+    #[serde(rename = "bannerTvMediumImageUrl")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub banner_tv_medium_image_url: Option<String>,
+    #[serde(rename = "largeBrandedBannerImageImapScript")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub large_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>,
+    #[serde(rename = "smallBrandedBannerImageImapScript")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub small_branded_banner_image_imap_script: Option<LocalizedProperty>,
+    #[serde(rename = "smallBrandedBannerImageUrl")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub small_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>,
+    #[serde(rename = "watchIconImageUrl")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub watch_icon_image_url: Option<String>,
+}
+
+/// Describes information necessary for ingesting an RTMP or an HTTP stream.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct IngestionInfo {
+    /// The backup ingestion URL that you should use to stream video to YouTube. You have the option of simultaneously streaming the content that you are sending to the ingestionAddress to this URL.
+    #[serde(rename = "backupIngestionAddress")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub backup_ingestion_address: Option<String>,
+    /// The primary ingestion URL that you should use to stream video to YouTube. You must stream video to this URL. Depending on which application or tool you use to encode your video stream, you may need to enter the stream URL and stream name separately or you may need to concatenate them in the following format: *STREAM_URL/STREAM_NAME*
+    #[serde(rename = "ingestionAddress")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub ingestion_address: Option<String>,
+    /// This ingestion url may be used instead of backupIngestionAddress in order to stream via RTMPS. Not applicable to non-RTMP streams.
+    #[serde(rename = "rtmpsBackupIngestionAddress")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub rtmps_backup_ingestion_address: Option<String>,
+    /// This ingestion url may be used instead of ingestionAddress in order to stream via RTMPS. Not applicable to non-RTMP streams.
+    #[serde(rename = "rtmpsIngestionAddress")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub rtmps_ingestion_address: Option<String>,
+    /// The 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>,
+}
+
+/// LINT.IfChange Describes an invideo branding.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct InvideoBranding {
+    /// The bytes the uploaded image. Only used in api to youtube communication.
+    #[serde(rename = "imageBytes")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub image_bytes: Option<String>,
+    /// The 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>,
+    /// 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>,
+}
+
+/// Describes the spatial position of a visual widget inside a video. It is a union of various position types, out of which only will be set one.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct InvideoPosition {
+    /// Describes in which corner of the video the visual widget will appear.
+    #[serde(rename = "cornerPosition")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub corner_position: Option<InvideoPositionCornerPosition>,
+    /// Defines the position type.
+    #[serde(rename = "type")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub type_: Option<InvideoPositionType>,
+}
+
+/// 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 type_: Option<InvideoTimingType>,
+}
+
+#[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 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>,
+}
+
+/// A *liveBroadcast* resource represents an event that will be streamed, via live video, on YouTube.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct LiveBroadcast {
+    #[serde(rename = "contentDetails")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub content_details: Option<LiveBroadcastContentDetails>,
+    /// Etag of this resource.
+    #[serde(rename = "etag")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub etag: Option<String>,
+    /// The ID that YouTube assigns to uniquely identify the broadcast.
+    #[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#liveBroadcast".
+    #[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<LiveBroadcastSnippet>,
+    #[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>,
+}
+
+/// 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>,
+    /// DateTime: The date and time that the live stream referenced by boundStreamId was last updated.
+    #[serde(rename = "boundStreamLastUpdateTimeMs")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub bound_stream_last_update_time_ms: Option<DateTime<Utc>>,
+    #[serde(rename = "closedCaptionsType")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub closed_captions_type: Option<LiveBroadcastContentDetailsClosedCaptionsType>,
+    /// This setting indicates whether auto start is enabled for this broadcast. The default value for this property is false. This setting can only be used by Events.
+    #[serde(rename = "enableAutoStart")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub enable_auto_start: Option<bool>,
+    /// 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 HTTP POST closed captioning is enabled for this broadcast. The ingestion URL of the closed captions is returned through the liveStreams API. This is mutually exclusive with using the closed_captions_type property, and is equivalent to setting closed_captions_type to CLOSED_CAPTIONS_HTTP_POST.
+    #[serde(rename = "enableClosedCaptions")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub enable_closed_captions: Option<bool>,
+    /// This setting indicates whether YouTube should enable content encryption for the broadcast.
+    #[serde(rename = "enableContentEncryption")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub enable_content_encryption: Option<bool>,
+    /// This setting determines whether viewers can access DVR controls while watching the video. DVR controls enable the viewer to control the video playback experience by pausing, rewinding, or fast forwarding content. The default value for this property is true. *Important:* You must set the value to true and also set the enableArchive property's value to true if you want to make playback available immediately after the broadcast ends.
+    #[serde(rename = "enableDvr")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub enable_dvr: Option<bool>,
+    /// This setting indicates whether the broadcast video can be played in an embedded player. If you choose to archive the video (using the enableArchive property), this setting will also apply to the archived video.
+    #[serde(rename = "enableEmbed")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub enable_embed: Option<bool>,
+    /// Indicates whether this broadcast has low latency enabled.
+    #[serde(rename = "enableLowLatency")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub enable_low_latency: Option<bool>,
+    /// If both this and enable_low_latency are set, they must match. LATENCY_NORMAL should match enable_low_latency=false LATENCY_LOW should match enable_low_latency=true LATENCY_ULTRA_LOW should have enable_low_latency omitted.
+    #[serde(rename = "latencyPreference")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub latency_preference: Option<LiveBroadcastContentDetailsLatencyPreference>,
+    /// The mesh for projecting the video if projection is mesh. The mesh value must be a UTF-8 string containing the base-64 encoding of 3D mesh data that follows the Spherical Video V2 RFC specification for an mshp box, excluding the box size and type but including the following four reserved zero bytes for the version and flags.
+    #[serde(rename = "mesh")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub mesh: Option<String>,
+    #[serde(rename = "monitorStream")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub monitor_stream: Option<MonitorStreamInfo>,
+    /// The projection format of this broadcast. This defaults to rectangular.
+    #[serde(rename = "projection")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub projection: Option<LiveBroadcastContentDetailsProjection>,
+    /// 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>,
+    /// The 3D stereo layout of this broadcast. This defaults to mono.
+    #[serde(rename = "stereoLayout")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub stereo_layout: Option<LiveBroadcastContentDetailsStereoLayout>,
+}
+
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct LiveBroadcastListResponse {
+    /// Etag of this resource.
+    #[serde(rename = "etag")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub etag: Option<String>,
+    /// 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 broadcasts that match the request criteria.
+    #[serde(rename = "items")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub items: Option<Vec<LiveBroadcast>>,
+    /// 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>,
+    #[serde(rename = "pageInfo")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub page_info: Option<PageInfo>,
+    /// The token that can be used as the value of the pageToken parameter to retrieve the previous page in the result set.
+    #[serde(rename = "prevPageToken")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub prev_page_token: Option<String>,
+    #[serde(rename = "tokenPagination")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub token_pagination: Option<TokenPagination>,
+    /// The visitorId identifies the visitor.
+    #[serde(rename = "visitorId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub visitor_id: Option<String>,
+}
+
+/// Basic broadcast information.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct LiveBroadcastSnippet {
+    /// DateTime: The date and time that the broadcast actually ended. This information is only available once the broadcast's state is complete.
+    #[serde(rename = "actualEndTime")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub actual_end_time: Option<DateTime<Utc>>,
+    /// DateTime: The date and time that the broadcast actually started. This information is only available once the broadcast's state is live.
+    #[serde(rename = "actualStartTime")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub actual_start_time: Option<DateTime<Utc>>,
+    /// The ID that YouTube uses to uniquely identify the channel that is publishing the broadcast.
+    #[serde(rename = "channelId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub channel_id: Option<String>,
+    /// 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 id of the live chat for this broadcast.
+    #[serde(rename = "liveChatId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub live_chat_id: Option<String>,
+    /// DateTime: The date and time that the broadcast was added to YouTube's live broadcast schedule.
+    #[serde(rename = "publishedAt")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub published_at: Option<DateTime<Utc>>,
+    /// DateTime: The date and time that the broadcast is scheduled to start.
+    #[serde(rename = "scheduledEndTime")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub scheduled_end_time: Option<DateTime<Utc>>,
+    /// DateTime: The date and time that the broadcast is scheduled to end.
+    #[serde(rename = "scheduledStartTime")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub scheduled_start_time: Option<DateTime<Utc>>,
+    #[serde(rename = "thumbnails")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub thumbnails: Option<ThumbnailDetails>,
+    /// The broadcast's title. Note that the broadcast represents exactly one YouTube video. You can set this field by modifying the broadcast resource or by setting the title field of the corresponding video resource.
+    #[serde(rename = "title")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub title: Option<String>,
+}
+
+/// Statistics about the live broadcast. These represent a snapshot of the values at the time of the request. Statistics are only returned for live broadcasts.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct LiveBroadcastStatistics {
+    /// u64: The total number of live chat messages currently on the broadcast. The property and its value will be present if the broadcast is public, has the live chat feature enabled, and has at least one message. Note that this field will not be filled after the broadcast ends. So this property would not identify the number of chat messages for an archived video of a completed live broadcast.
+    #[serde(rename = "totalChatCount")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub total_chat_count: Option<String>,
+}
+
+/// 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>,
+    /// Priority of the live broadcast event (internal state).
+    #[serde(rename = "liveBroadcastPriority")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub live_broadcast_priority: Option<LiveBroadcastStatusLiveBroadcastPriority>,
+    /// Whether the broadcast is made for kids or not, decided by YouTube instead of the creator. This field is read only.
+    #[serde(rename = "madeForKids")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub made_for_kids: Option<bool>,
+    /// The broadcast's privacy status. Note that the broadcast represents exactly one YouTube video, so the privacy settings are identical to those supported for videos. In addition, you can set this field by modifying the broadcast resource or by setting the privacyStatus field of the corresponding video resource.
+    #[serde(rename = "privacyStatus")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub privacy_status: Option<LiveBroadcastStatusPrivacyStatus>,
+    /// The broadcast's recording status.
+    #[serde(rename = "recordingStatus")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub recording_status: Option<LiveBroadcastStatusRecordingStatus>,
+    /// 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>,
+}
+
+/// A `__liveChatBan__` resource represents a ban for a YouTube live chat.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct LiveChatBan {
+    /// Etag of this resource.
+    #[serde(rename = "etag")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub etag: Option<String>,
+    /// The ID that YouTube assigns to uniquely identify the ban.
+    #[serde(rename = "id")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub id: Option<String>,
+    /// Identifies what kind of resource this is. Value: the fixed string `"youtube#liveChatBan"`.
+    #[serde(rename = "kind")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub kind: Option<String>,
+    #[serde(rename = "snippet")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub snippet: Option<LiveChatBanSnippet>,
+}
+
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct LiveChatBanSnippet {
+    /// u64: The duration of a ban, only filled if the ban has type TEMPORARY.
+    #[serde(rename = "banDurationSeconds")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub ban_duration_seconds: Option<String>,
+    #[serde(rename = "bannedUserDetails")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub banned_user_details: Option<ChannelProfileDetails>,
+    /// The chat this ban is pertinent to.
+    #[serde(rename = "liveChatId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub live_chat_id: Option<String>,
+    /// The type of ban.
+    #[serde(rename = "type")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub type_: Option<LiveChatBanSnippetType>,
+}
+
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct LiveChatFanFundingEventDetails {
+    /// A rendered string that displays the fund amount and currency to the user.
+    #[serde(rename = "amountDisplayString")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub amount_display_string: Option<String>,
+    /// 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>,
+    /// 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 *liveChatMessage* resource represents a chat message in a YouTube Live Chat.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct LiveChatMessage {
+    #[serde(rename = "authorDetails")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub author_details: Option<LiveChatMessageAuthorDetails>,
+    /// Etag of this resource.
+    #[serde(rename = "etag")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub etag: Option<String>,
+    /// The ID that YouTube assigns to uniquely identify the message.
     #[serde(rename = "id")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub id: Option<String>,
+    /// Identifies what kind of resource this is. Value: the fixed string "youtube#liveChatMessage".
+    #[serde(rename = "kind")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub kind: Option<String>,
     #[serde(rename = "snippet")]
     #[serde(skip_serializing_if = "Option::is_none")]
-    pub snippet: Option<I18nLanguageSnippet>,
+    pub snippet: Option<LiveChatMessageSnippet>,
+}
+
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct LiveChatMessageAuthorDetails {
+    /// The YouTube channel ID.
+    #[serde(rename = "channelId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub channel_id: Option<String>,
+    /// The channel's URL.
+    #[serde(rename = "channelUrl")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub channel_url: Option<String>,
+    /// The channel's display name.
+    #[serde(rename = "displayName")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub display_name: Option<String>,
+    /// Whether the author is a moderator of the live chat.
+    #[serde(rename = "isChatModerator")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub is_chat_moderator: Option<bool>,
+    /// Whether the author is the owner of the live chat.
+    #[serde(rename = "isChatOwner")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub is_chat_owner: Option<bool>,
+    /// 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 channels's avatar URL.
+    #[serde(rename = "profileImageUrl")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub profile_image_url: Option<String>,
+}
+
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct LiveChatMessageDeletedDetails {
+    #[serde(rename = "deletedMessageId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub deleted_message_id: Option<String>,
+}
+
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct LiveChatMessageListResponse {
+    /// Etag of this resource.
+    #[serde(rename = "etag")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub etag: Option<String>,
+    /// Serialized EventId of the request which produced this response.
+    #[serde(rename = "eventId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub event_id: Option<String>,
+    #[serde(rename = "items")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub items: Option<Vec<LiveChatMessage>>,
+    /// Identifies what kind of resource this is. Value: the fixed string "youtube#liveChatMessageListResponse".
+    #[serde(rename = "kind")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub kind: Option<String>,
+    #[serde(rename = "nextPageToken")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub next_page_token: Option<String>,
+    /// DateTime: The date and time when the underlying stream went offline.
+    #[serde(rename = "offlineAt")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub offline_at: Option<DateTime<Utc>>,
+    #[serde(rename = "pageInfo")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub page_info: Option<PageInfo>,
+    /// The amount of time the client should wait before polling again.
+    #[serde(rename = "pollingIntervalMillis")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub polling_interval_millis: Option<u32>,
+    #[serde(rename = "tokenPagination")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub token_pagination: Option<TokenPagination>,
+    /// The visitorId identifies the visitor.
+    #[serde(rename = "visitorId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub visitor_id: Option<String>,
+}
+
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct LiveChatMessageRetractedDetails {
+    #[serde(rename = "retractedMessageId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub retracted_message_id: Option<String>,
+}
+
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct LiveChatMessageSnippet {
+    /// 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>,
+    /// Contains a string that can be displayed to the user. If this field is not present the message is silent, at the moment only messages of type TOMBSTONE and CHAT_ENDED_EVENT are silent.
+    #[serde(rename = "displayMessage")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub display_message: Option<String>,
+    #[serde(rename = "fanFundingEventDetails")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub fan_funding_event_details: Option<LiveChatFanFundingEventDetails>,
+    /// Whether the message has display content that should be displayed to users.
+    #[serde(rename = "hasDisplayContent")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub has_display_content: Option<bool>,
+    #[serde(rename = "liveChatId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub live_chat_id: Option<String>,
+    #[serde(rename = "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>,
+    /// DateTime: The date and time when the message was orignally published.
+    #[serde(rename = "publishedAt")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub published_at: Option<DateTime<Utc>>,
+    #[serde(rename = "superChatDetails")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub super_chat_details: Option<LiveChatSuperChatDetails>,
+    #[serde(rename = "superStickerDetails")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub super_sticker_details: Option<LiveChatSuperStickerDetails>,
+    #[serde(rename = "textMessageDetails")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub text_message_details: Option<LiveChatTextMessageDetails>,
+    /// The type of message, this will always be present, it determines the contents of the message as well as which fields will be present.
+    #[serde(rename = "type")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub type_: Option<LiveChatMessageSnippetType>,
+    #[serde(rename = "userBannedDetails")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub user_banned_details: Option<LiveChatUserBannedMessageDetails>,
+}
+
+/// 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 {
+    /// Etag of this resource.
+    #[serde(rename = "etag")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub etag: Option<String>,
+    /// The ID that YouTube assigns to uniquely identify the 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>,
+}
+
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct LiveChatModeratorListResponse {
+    /// Etag of this resource.
+    #[serde(rename = "etag")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub etag: Option<String>,
+    /// Serialized EventId of the request which produced this response.
+    #[serde(rename = "eventId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub event_id: Option<String>,
+    /// A list of moderators that match the request criteria.
+    #[serde(rename = "items")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub items: Option<Vec<LiveChatModerator>>,
+    /// Identifies what kind of resource this is. Value: the fixed string "youtube#liveChatModeratorListResponse".
+    #[serde(rename = "kind")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub kind: Option<String>,
+    /// The 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 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>,
+    /// The visitorId identifies the visitor.
+    #[serde(rename = "visitorId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub visitor_id: Option<String>,
+}
+
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct 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 LiveChatSuperChatDetails {
+    /// 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 currency in which the purchase was made.
+    #[serde(rename = "currency")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub currency: Option<String>,
+    /// The tier in which the amount belongs. Lower amounts belong to lower tiers. The lowest tier is 1.
+    #[serde(rename = "tier")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub tier: Option<u32>,
+    /// The comment added by the user to this Super Chat event.
+    #[serde(rename = "userComment")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub user_comment: Option<String>,
+}
+
+#[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 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>,
+    /// 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 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 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>,
+    /// The type of ban.
+    #[serde(rename = "banType")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub ban_type: Option<LiveChatUserBannedMessageDetailsBanType>,
+    #[serde(rename = "bannedUserDetails")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub banned_user_details: Option<ChannelProfileDetails>,
+}
+
+/// A live stream describes a live ingestion point.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct LiveStream {
+    #[serde(rename = "cdn")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub cdn: Option<CdnSettings>,
+    #[serde(rename = "contentDetails")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub content_details: Option<LiveStreamContentDetails>,
+    /// Etag of this resource.
+    #[serde(rename = "etag")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub etag: Option<String>,
+    /// The ID that YouTube assigns to uniquely identify the stream.
+    #[serde(rename = "id")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub id: Option<String>,
+    /// Identifies what kind of resource this is. Value: the fixed string "youtube#liveStream".
+    #[serde(rename = "kind")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub kind: Option<String>,
+    #[serde(rename = "snippet")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub snippet: Option<LiveStreamSnippet>,
+    #[serde(rename = "status")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub status: Option<LiveStreamStatus>,
+}
+
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct LiveStreamConfigurationIssue {
+    /// The long-form description of the issue and how to resolve it.
+    #[serde(rename = "description")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub description: Option<String>,
+    /// The short-form reason for this issue.
+    #[serde(rename = "reason")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub reason: Option<String>,
+    /// How severe this issue is to the stream.
+    #[serde(rename = "severity")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub severity: Option<LiveStreamConfigurationIssueSeverity>,
+    /// The kind of error happening.
+    #[serde(rename = "type")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub type_: Option<LiveStreamConfigurationIssueType>,
+}
+
+/// 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>,
+}
+
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct LiveStreamHealthStatus {
+    /// The configurations issues on this stream
+    #[serde(rename = "configurationIssues")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub configuration_issues: Option<Vec<LiveStreamConfigurationIssue>>,
+    /// u64: The last time this status was updated (in seconds)
+    #[serde(rename = "lastUpdateTimeSeconds")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub last_update_time_seconds: Option<String>,
+    /// The status code of this stream
+    #[serde(rename = "status")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub status: Option<LiveStreamHealthStatusStatus>,
+}
+
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct LiveStreamListResponse {
+    /// Etag of this resource.
+    #[serde(rename = "etag")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub etag: Option<String>,
+    /// Serialized EventId of the request which produced this response.
+    #[serde(rename = "eventId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub event_id: Option<String>,
+    /// A list of 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>,
+    /// 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 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>,
+    /// The visitorId identifies the visitor.
+    #[serde(rename = "visitorId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub visitor_id: Option<String>,
+}
+
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct LiveStreamSnippet {
+    /// The ID that YouTube uses to uniquely identify the channel that is transmitting the stream.
+    #[serde(rename = "channelId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub channel_id: Option<String>,
+    /// The stream's description. The value cannot be longer than 10000 characters.
+    #[serde(rename = "description")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub description: Option<String>,
+    #[serde(rename = "isDefaultStream")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub is_default_stream: Option<bool>,
+    /// DateTime: The date and time that the stream was created.
+    #[serde(rename = "publishedAt")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub published_at: Option<DateTime<Utc>>,
+    /// The stream's title. The value must be between 1 and 128 characters long.
+    #[serde(rename = "title")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub title: Option<String>,
+}
+
+/// Brief description of the live stream status.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct LiveStreamStatus {
+    #[serde(rename = "healthStatus")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub health_status: Option<LiveStreamHealthStatus>,
+    #[serde(rename = "streamStatus")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub stream_status: Option<LiveStreamStatusStreamStatus>,
+}
+
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct LocalizedProperty {
+    #[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>,
+    #[serde(rename = "localized")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub localized: Option<Vec<LocalizedString>>,
+}
+
+#[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 *member* resource represents a member for a YouTube channel. A member provides recurring monetary support to a creator and receives special benefits.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct Member {
+    /// Etag of this resource.
+    #[serde(rename = "etag")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub etag: Option<String>,
+    /// 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>,
+}
+
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct MemberListResponse {
+    /// Etag of this resource.
+    #[serde(rename = "etag")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub etag: Option<String>,
+    /// 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 members that match the request criteria.
+    #[serde(rename = "items")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub items: Option<Vec<Member>>,
+    /// Identifies what kind of resource this is. Value: the fixed string "youtube#memberListResponse".
+    #[serde(rename = "kind")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub kind: Option<String>,
+    /// The token that can be used as the value of the pageToken parameter to retrieve the next page in the result set.
+    #[serde(rename = "nextPageToken")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub next_page_token: Option<String>,
+    #[serde(rename = "pageInfo")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub page_info: Option<PageInfo>,
+    #[serde(rename = "tokenPagination")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub token_pagination: Option<TokenPagination>,
+    /// The visitorId identifies the visitor.
+    #[serde(rename = "visitorId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub visitor_id: Option<String>,
+}
+
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct MemberSnippet {
+    /// The id of the channel that's offering memberships.
+    #[serde(rename = "creatorChannelId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub creator_channel_id: Option<String>,
+    #[serde(rename = "memberDetails")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub member_details: Option<ChannelProfileDetails>,
+    #[serde(rename = "membershipsDetails")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub memberships_details: Option<MembershipsDetails>,
+}
+
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct 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>>,
+    /// 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>,
+    /// 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>>,
+}
+
+#[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 MembershipsDurationAtLevel {
+    /// 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>,
+    /// 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>,
+}
+
+/// 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>,
+    /// 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>,
+    #[serde(rename = "snippet")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub snippet: Option<MembershipsLevelSnippet>,
+}
+
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct MembershipsLevelListResponse {
+    /// Etag of this resource.
+    #[serde(rename = "etag")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub etag: Option<String>,
+    /// Serialized EventId of the request which produced this response.
+    #[serde(rename = "eventId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub event_id: Option<String>,
+    /// 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>,
+    /// The visitorId identifies the visitor.
+    #[serde(rename = "visitorId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub visitor_id: Option<String>,
+}
+
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct MembershipsLevelSnippet {
+    /// 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>,
+    #[serde(rename = "levelDetails")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub level_details: Option<LevelDetails>,
 }
 
 /// Settings and Info of the monitor stream
@@ -3026,13 +2826,581 @@
     pub enable_monitor_stream: 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 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>,
+}
+
+/// A *playlist* resource represents a YouTube playlist. A playlist is a collection of videos that can be viewed sequentially and shared with other users. A playlist can contain up to 200 videos, and YouTube does not limit the number of playlists that each user creates. By default, playlists are publicly visible to other users, but playlists can be public or private. YouTube also uses playlists to identify special collections of videos for a channel, such as: - uploaded videos - favorite videos - positively rated (liked) videos - watch history - watch later To be more specific, these lists are associated with a channel, which is a collection of a person, group, or company's videos, playlists, and other YouTube information. You can retrieve the playlist IDs for each of these lists from the channel resource for a given channel. You can then use the playlistItems.list method to retrieve any of those lists. You can also add or remove items from those lists by calling the playlistItems.insert and playlistItems.delete methods.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct Playlist {
+    #[serde(rename = "contentDetails")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub content_details: Option<PlaylistContentDetails>,
+    /// Etag of this resource.
+    #[serde(rename = "etag")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub etag: Option<String>,
+    /// The ID that YouTube uses to uniquely identify the playlist.
+    #[serde(rename = "id")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub id: Option<String>,
+    /// Identifies what kind of resource this is. Value: the fixed string "youtube#playlist".
+    #[serde(rename = "kind")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub kind: Option<String>,
+    /// Localizations for different languages
+    #[serde(rename = "localizations")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub localizations: Option<HashMap<String, PlaylistLocalization>>,
+    #[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>,
+    #[serde(rename = "status")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub status: Option<PlaylistStatus>,
+}
+
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct PlaylistContentDetails {
+    /// The number of videos in the playlist.
+    #[serde(rename = "itemCount")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub item_count: Option<u32>,
+}
+
+/// A *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 = "contentDetails")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub content_details: Option<PlaylistItemContentDetails>,
+    /// Etag of this resource.
+    #[serde(rename = "etag")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub etag: Option<String>,
+    /// The ID that YouTube uses to uniquely identify the playlist item.
+    #[serde(rename = "id")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub id: Option<String>,
+    /// Identifies what kind of resource this is. Value: the fixed string "youtube#playlistItem".
+    #[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<PlaylistItemSnippet>,
+    #[serde(rename = "status")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub status: Option<PlaylistItemStatus>,
+}
+
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct PlaylistItemContentDetails {
+    /// The time, measured in seconds from the start of the video, when the video should stop playing. (The playlist owner can specify the times when the video should start and stop playing when the video is played in the context of the playlist.) By default, assume that the video.endTime is the end of the video.
+    #[serde(rename = "endAt")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub end_at: Option<String>,
+    /// A user-generated note for this item.
+    #[serde(rename = "note")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub note: Option<String>,
+    /// The 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 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>,
+    /// DateTime: The date and time that the video was published to YouTube.
+    #[serde(rename = "videoPublishedAt")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub video_published_at: Option<DateTime<Utc>>,
+}
+
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct PlaylistItemListResponse {
+    #[serde(rename = "etag")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub etag: Option<String>,
+    /// Serialized EventId of the request which produced this response.
+    #[serde(rename = "eventId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub event_id: Option<String>,
+    /// 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>>,
+    /// 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 = "pageInfo")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub page_info: Option<PageInfo>,
+    /// The token that can be used as the value of the pageToken parameter to retrieve the previous page in the result set.
+    #[serde(rename = "prevPageToken")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub prev_page_token: Option<String>,
+    #[serde(rename = "tokenPagination")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub token_pagination: Option<TokenPagination>,
+    /// The visitorId identifies the visitor.
+    #[serde(rename = "visitorId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub visitor_id: Option<String>,
+}
+
+/// Basic details about a playlist, including title, description and thumbnails. Basic details of a YouTube Playlist item provided by the author. Next ID: 15
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct PlaylistItemSnippet {
+    /// The ID that YouTube uses to uniquely identify the user that added the item to the playlist.
+    #[serde(rename = "channelId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub channel_id: Option<String>,
+    /// Channel title for the channel that the playlist item belongs to.
+    #[serde(rename = "channelTitle")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub channel_title: Option<String>,
+    /// The item's description.
+    #[serde(rename = "description")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub description: 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 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>,
+    /// DateTime: The date and time that the item was added to the playlist.
+    #[serde(rename = "publishedAt")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub published_at: Option<DateTime<Utc>>,
+    #[serde(rename = "resourceId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub resource_id: Option<ResourceId>,
+    #[serde(rename = "thumbnails")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub thumbnails: Option<ThumbnailDetails>,
+    /// The item's title.
+    #[serde(rename = "title")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub title: Option<String>,
+    /// Channel id for the channel this video belongs to.
+    #[serde(rename = "videoOwnerChannelId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub video_owner_channel_id: Option<String>,
+    /// Channel title for the channel this video belongs to.
+    #[serde(rename = "videoOwnerChannelTitle")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub video_owner_channel_title: Option<String>,
+}
+
+/// 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>,
+}
+
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct PlaylistListResponse {
+    /// Etag of this resource.
+    #[serde(rename = "etag")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub etag: Option<String>,
+    /// 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 playlists that match the request criteria
+    #[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>,
+    /// 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 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>,
+    /// The visitorId identifies the visitor.
+    #[serde(rename = "visitorId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub visitor_id: Option<String>,
+}
+
+/// Playlist localization setting
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct PlaylistLocalization {
+    /// The localized strings for playlist's description.
+    #[serde(rename = "description")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub description: Option<String>,
+    /// The localized strings for playlist's title.
+    #[serde(rename = "title")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub title: Option<String>,
+}
+
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct 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 playlist, including title, description and thumbnails.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct PlaylistSnippet {
+    /// 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 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 playlist's description.
+    #[serde(rename = "description")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub description: Option<String>,
+    #[serde(rename = "localized")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub localized: Option<PlaylistLocalization>,
+    /// DateTime: The date and time that the playlist was created.
+    #[serde(rename = "publishedAt")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub published_at: Option<DateTime<Utc>>,
+    /// Keyword tags associated with the playlist.
+    #[serde(rename = "tags")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub tags: Option<Vec<String>>,
+    /// Note: if the playlist has a custom thumbnail, this field will not be populated. The video id selected by the user that will be used as the thumbnail of this playlist. This field defaults to the first publicly viewable video in the playlist, if: 1. The user has never selected a video to be the thumbnail of the playlist. 2. The user selects a video to be the thumbnail, and then removes that video from the playlist. 3. The user selects a non-owned video to be the thumbnail, but that video becomes private, or gets deleted.
+    #[serde(rename = "thumbnailVideoId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub thumbnail_video_id: Option<String>,
+    #[serde(rename = "thumbnails")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub thumbnails: Option<ThumbnailDetails>,
+    /// The playlist's title.
+    #[serde(rename = "title")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub title: Option<String>,
+}
+
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct PlaylistStatus {
+    /// The playlist's privacy status.
+    #[serde(rename = "privacyStatus")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub privacy_status: Option<PlaylistStatusPrivacyStatus>,
+}
+
+/// 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 RelatedEntity {
+    #[serde(rename = "entity")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub entity: Option<Entity>,
+}
+
+/// A resource id is a generic reference that points to another YouTube resource.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct ResourceId {
+    /// The ID that YouTube uses to uniquely identify the referred resource, if that resource is a channel. This property is only present if the resourceId.kind value is youtube#channel.
+    #[serde(rename = "channelId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub channel_id: Option<String>,
+    /// The type of the API resource.
+    #[serde(rename = "kind")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub kind: Option<String>,
+    /// The ID that YouTube uses to uniquely identify the referred resource, if that resource is a 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 video. This property is only present if the resourceId.kind value is youtube#video.
+    #[serde(rename = "videoId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub video_id: Option<String>,
+}
+
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct SearchListResponse {
+    /// 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>,
+    /// Pagination information for token pagination.
+    #[serde(rename = "items")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub items: Option<Vec<SearchResult>>,
+    /// Identifies what kind of resource this is. Value: the fixed string "youtube#searchListResponse".
+    #[serde(rename = "kind")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub kind: Option<String>,
+    /// 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 token that can be used as the value of the pageToken parameter to retrieve the previous page in the result set.
+    #[serde(rename = "prevPageToken")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub prev_page_token: Option<String>,
+    #[serde(rename = "regionCode")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub region_code: Option<String>,
+    #[serde(rename = "tokenPagination")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub token_pagination: Option<TokenPagination>,
+    /// The visitorId identifies the visitor.
+    #[serde(rename = "visitorId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub visitor_id: Option<String>,
+}
+
+/// A 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 = "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>,
+    #[serde(rename = "snippet")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub snippet: Option<SearchResultSnippet>,
+}
+
+/// Basic details about a search result, including title, description and thumbnails of the item referenced by the search result.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct SearchResultSnippet {
+    /// The value that YouTube uses to uniquely identify the channel that published the resource that the search result identifies.
+    #[serde(rename = "channelId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub channel_id: Option<String>,
+    /// The title of the channel that published the resource that the search result identifies.
+    #[serde(rename = "channelTitle")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub channel_title: Option<String>,
+    /// A description of the search result.
+    #[serde(rename = "description")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub description: Option<String>,
+    /// 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>,
+    /// DateTime: The creation date and time of the resource that the search result identifies.
+    #[serde(rename = "publishedAt")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub published_at: Option<DateTime<Utc>>,
+    #[serde(rename = "thumbnails")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub thumbnails: Option<ThumbnailDetails>,
+    /// The title of the search result.
+    #[serde(rename = "title")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub title: Option<String>,
+}
+
+/// A *subscription* resource contains information about a YouTube user subscription. A subscription notifies a user when new videos are added to a channel or when another user takes one of several actions on YouTube, such as uploading a video, rating a video, or commenting on a video.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct Subscription {
+    #[serde(rename = "contentDetails")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub content_details: Option<SubscriptionContentDetails>,
+    /// Etag of this resource.
+    #[serde(rename = "etag")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub etag: Option<String>,
+    /// The ID that YouTube uses to uniquely identify the subscription.
+    #[serde(rename = "id")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub id: Option<String>,
+    /// Identifies what kind of resource this is. Value: the fixed string "youtube#subscription".
+    #[serde(rename = "kind")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub kind: Option<String>,
+    #[serde(rename = "snippet")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub snippet: Option<SubscriptionSnippet>,
+    #[serde(rename = "subscriberSnippet")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub subscriber_snippet: Option<SubscriptionSubscriberSnippet>,
+}
+
+/// Details about the content to witch a subscription refers.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct SubscriptionContentDetails {
+    /// The type of activity this subscription is for (only uploads, everything).
+    #[serde(rename = "activityType")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub activity_type: Option<SubscriptionContentDetailsActivityType>,
+    /// The 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 SubscriptionListResponse {
+    /// Etag of this resource.
+    #[serde(rename = "etag")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub etag: Option<String>,
+    /// Serialized EventId of the request which produced this response.
+    #[serde(rename = "eventId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub event_id: Option<String>,
+    /// A list of subscriptions that match the request criteria.
+    #[serde(rename = "items")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub items: Option<Vec<Subscription>>,
+    /// Identifies what kind of resource this is. Value: the fixed string "youtube#subscriptionListResponse".
+    #[serde(rename = "kind")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub kind: Option<String>,
+    /// 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 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>,
+    /// The visitorId identifies the visitor.
+    #[serde(rename = "visitorId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub visitor_id: Option<String>,
+}
+
+/// Basic details about a subscription, including title, description and thumbnails of the subscribed item.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct SubscriptionSnippet {
+    /// The 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>,
+    /// DateTime: The date and time that the subscription was created.
+    #[serde(rename = "publishedAt")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub published_at: Option<DateTime<Utc>>,
+    #[serde(rename = "resourceId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub resource_id: Option<ResourceId>,
+    #[serde(rename = "thumbnails")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub thumbnails: Option<ThumbnailDetails>,
+    /// The subscription's title.
+    #[serde(rename = "title")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub title: Option<String>,
+}
+
+/// 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 description of the subscriber.
+    #[serde(rename = "description")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub description: Option<String>,
+    #[serde(rename = "thumbnails")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub thumbnails: Option<ThumbnailDetails>,
+    /// The title of the subscriber.
+    #[serde(rename = "title")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub title: 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")]
@@ -3041,12 +3409,108 @@
     #[serde(rename = "id")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub id: Option<String>,
+    /// Identifies what kind of resource this is. Value: the fixed string `"youtube#superChatEvent"`.
+    #[serde(rename = "kind")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub kind: Option<String>,
     #[serde(rename = "snippet")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub snippet: Option<SuperChatEventSnippet>,
 }
 
 #[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct SuperChatEventListResponse {
+    /// Etag of this resource.
+    #[serde(rename = "etag")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub etag: Option<String>,
+    /// Serialized EventId of the request which produced this response.
+    #[serde(rename = "eventId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub event_id: Option<String>,
+    /// A list of 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>,
+    #[serde(rename = "pageInfo")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub page_info: Option<PageInfo>,
+    #[serde(rename = "tokenPagination")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub token_pagination: Option<TokenPagination>,
+    /// The visitorId identifies the visitor.
+    #[serde(rename = "visitorId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub visitor_id: Option<String>,
+}
+
+#[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>,
+    /// Channel id where the event occurred.
+    #[serde(rename = "channelId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub channel_id: Option<String>,
+    /// 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>,
+    /// DateTime: The date and time when the event occurred.
+    #[serde(rename = "createdAt")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub created_at: Option<DateTime<Utc>>,
+    /// The 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>,
+    /// 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>,
+    /// The tier for the paid message, which is based on the amount of money spent to purchase the message.
+    #[serde(rename = "messageType")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub message_type: Option<u32>,
+    #[serde(rename = "superStickerMetadata")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub super_sticker_metadata: Option<SuperStickerMetadata>,
+    #[serde(rename = "supporterDetails")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub supporter_details: Option<ChannelProfileDetails>,
+}
+
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct SuperStickerMetadata {
+    /// Internationalized alt text that describes the sticker image and any animation associated with it.
+    #[serde(rename = "altText")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub alt_text: Option<String>,
+    /// Specifies the localization language in which the alt text is returned.
+    #[serde(rename = "altTextLanguage")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub alt_text_language: Option<String>,
+    /// Unique identifier of the Super Sticker. This is a shorter form of the alt_text that includes pack name and a recognizable characteristic of the sticker.
+    #[serde(rename = "stickerId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub sticker_id: Option<String>,
+}
+
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
 pub struct TestItem {
     /// i64:
     #[serde(rename = "gaia")]
@@ -3060,21 +3524,24 @@
     pub snippet: Option<TestItemTestItemSnippet>,
 }
 
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct TestItemTestItemSnippet {}
+
 /// A *third party account link* resource represents a link between a YouTube account or a channel and an account on a third-party service.
 #[derive(Serialize, Deserialize, Debug, Clone, Default)]
 pub struct ThirdPartyLink {
+    /// Etag of this resource
+    #[serde(rename = "etag")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub etag: Option<String>,
+    /// Identifies what kind of resource this is. Value: the fixed string "youtube#thirdPartyLink".
+    #[serde(rename = "kind")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub kind: Option<String>,
     /// The linking_token identifies a YouTube account and channel with which the third party account is linked.
     #[serde(rename = "linkingToken")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub linking_token: Option<String>,
-    /// Identifies what kind of resource this is. Value: the fixed string "youtube#thirdPartyLink".
-    #[serde(rename = "kind")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub kind: Option<String>,
-    /// Etag of this resource
-    #[serde(rename = "etag")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub etag: Option<String>,
     #[serde(rename = "snippet")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub snippet: Option<ThirdPartyLinkSnippet>,
@@ -3083,78 +3550,168 @@
     pub status: Option<ThirdPartyLinkStatus>,
 }
 
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct LiveStreamConfigurationIssue {
-    /// How severe this issue is to the stream.
-    #[serde(rename = "severity")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub severity: Option<LiveStreamConfigurationIssueSeverity>,
-    /// The kind of error happening.
+/// Basic information about a third party account link, including its type and type-specific information.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct ThirdPartyLinkSnippet {
+    #[serde(rename = "channelToStoreLink")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub channel_to_store_link: Option<ChannelToStoreLinkDetails>,
+    /// Type of the link named after the entities that are being linked.
     #[serde(rename = "type")]
     #[serde(skip_serializing_if = "Option::is_none")]
-    pub type_: Option<LiveStreamConfigurationIssueType>,
-    /// The short-form reason for this issue.
-    #[serde(rename = "reason")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub reason: Option<String>,
-    /// The long-form description of the issue and how to resolve it.
-    #[serde(rename = "description")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub description: Option<String>,
-}
-
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct MembershipsDuration {
-    /// The date and time when the user became a continuous member across all levels.
-    #[serde(rename = "memberSince")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub member_since: Option<String>,
-    /// The cumulative time the user has been a member across all levels in complete months (the time is rounded down to the nearest integer).
-    #[serde(rename = "memberTotalDurationMonths")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub member_total_duration_months: Option<i32>,
-}
-
-/// Recording information associated with the video.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct VideoRecordingDetails {
-    #[serde(rename = "location")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub location: Option<GeoPoint>,
-    /// DateTime: The date and time when the video was recorded.
-    #[serde(rename = "recordingDate")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub recording_date: Option<DateTime<Utc>>,
-    /// The text description of the location where the video was recorded.
-    #[serde(rename = "locationDescription")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub location_description: Option<String>,
-}
-
-/// ChannelSection localization setting
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct ChannelSectionLocalization {
-    /// The localized strings for channel section's title.
-    #[serde(rename = "title")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub title: Option<String>,
-}
-
-/// Freebase topic information related to the channel.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct ChannelTopicDetails {
-    /// A list of Wikipedia URLs that describe the channel's content.
-    #[serde(rename = "topicCategories")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub topic_categories: Option<Vec<String>>,
-    /// A list of Freebase topic IDs associated with the channel. You can retrieve information about each topic using the Freebase Topic API.
-    #[serde(rename = "topicIds")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub topic_ids: Option<Vec<String>>,
+    pub type_: Option<ThirdPartyLinkSnippetType>,
+}
+
+/// The third-party link status object contains information about the status of the link.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct ThirdPartyLinkStatus {
+    #[serde(rename = "linkStatus")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub link_status: Option<ThirdPartyLinkStatusLinkStatus>,
+}
+
+/// A thumbnail is an image representing a YouTube resource.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct Thumbnail {
+    /// (Optional) 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>,
+    /// (Optional) Width of the thumbnail image.
+    #[serde(rename = "width")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub width: Option<u32>,
+}
+
+/// Internal representation of thumbnails for a YouTube resource.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct ThumbnailDetails {
+    #[serde(rename = "default")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub default: Option<Thumbnail>,
+    #[serde(rename = "high")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub high: Option<Thumbnail>,
+    #[serde(rename = "maxres")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub maxres: Option<Thumbnail>,
+    #[serde(rename = "medium")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub medium: Option<Thumbnail>,
+    #[serde(rename = "standard")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub standard: Option<Thumbnail>,
+}
+
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct ThumbnailSetResponse {
+    /// Etag of this resource.
+    #[serde(rename = "etag")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub etag: Option<String>,
+    /// 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>>,
+    /// Identifies what kind of resource this is. Value: the fixed string "youtube#thumbnailSetResponse".
+    #[serde(rename = "kind")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub kind: Option<String>,
+    /// The visitorId identifies the visitor.
+    #[serde(rename = "visitorId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub visitor_id: Option<String>,
+}
+
+/// Stub token pagination template to suppress results.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct TokenPagination {}
+
+/// A *video* resource represents a YouTube video.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct Video {
+    #[serde(rename = "ageGating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub age_gating: Option<VideoAgeGating>,
+    #[serde(rename = "contentDetails")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub content_details: Option<VideoContentDetails>,
+    /// Etag of this resource.
+    #[serde(rename = "etag")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub etag: Option<String>,
+    #[serde(rename = "fileDetails")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub file_details: Option<VideoFileDetails>,
+    /// The ID that YouTube uses to uniquely identify the video.
+    #[serde(rename = "id")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub id: Option<String>,
+    /// Identifies what kind of resource this is. Value: the fixed string "youtube#video".
+    #[serde(rename = "kind")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub kind: Option<String>,
+    #[serde(rename = "liveStreamingDetails")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub live_streaming_details: Option<VideoLiveStreamingDetails>,
+    /// 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 = "monetizationDetails")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub monetization_details: Option<VideoMonetizationDetails>,
+    #[serde(rename = "player")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub player: Option<VideoPlayer>,
+    #[serde(rename = "processingDetails")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub processing_details: Option<VideoProcessingDetails>,
+    #[serde(rename = "projectDetails")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub project_details: Option<VideoProjectDetails>,
+    #[serde(rename = "recordingDetails")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub recording_details: Option<VideoRecordingDetails>,
+    #[serde(rename = "snippet")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub snippet: Option<VideoSnippet>,
+    #[serde(rename = "statistics")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub statistics: Option<VideoStatistics>,
+    #[serde(rename = "status")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub status: Option<VideoStatus>,
+    #[serde(rename = "suggestions")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub suggestions: Option<VideoSuggestions>,
+    #[serde(rename = "topicDetails")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub topic_details: Option<VideoTopicDetails>,
 }
 
 #[derive(Serialize, Deserialize, Debug, Clone, Default)]
 pub struct VideoAbuseReport {
+    /// Additional comments regarding the abuse report.
+    #[serde(rename = "comments")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub comments: Option<String>,
+    /// The language that the content was viewed in.
+    #[serde(rename = "language")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub language: Option<String>,
+    /// The high-level, or primary, reason that the content is abusive. The value is an abuse report reason ID.
+    #[serde(rename = "reasonId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub reason_id: Option<String>,
     /// The 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")]
@@ -3163,583 +3720,149 @@
     #[serde(rename = "videoId")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub video_id: Option<String>,
-    /// The language that the content was viewed in.
-    #[serde(rename = "language")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub language: Option<String>,
-    /// Additional comments regarding the abuse report.
-    #[serde(rename = "comments")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub comments: Option<String>,
-    /// The high-level, or primary, reason that the content is abusive. The value is an abuse report reason ID.
-    #[serde(rename = "reasonId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub reason_id: Option<String>,
-}
-
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct SuperChatEventListResponse {
-    /// Identifies what kind of resource this is. Value: the fixed string "youtube#superChatEventListResponse".
-    #[serde(rename = "kind")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub kind: Option<String>,
-    #[serde(rename = "pageInfo")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub page_info: Option<PageInfo>,
-    /// The visitorId identifies the visitor.
-    #[serde(rename = "visitorId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub visitor_id: Option<String>,
-    /// Serialized EventId of the request which produced this response.
-    #[serde(rename = "eventId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub event_id: Option<String>,
-    #[serde(rename = "tokenPagination")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub token_pagination: Option<TokenPagination>,
+}
+
+/// 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 {
     /// Etag of this resource.
     #[serde(rename = "etag")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub etag: Option<String>,
-    /// The token that can be used as the value of the pageToken parameter to retrieve the next page in the result set.
-    #[serde(rename = "nextPageToken")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub next_page_token: Option<String>,
-    /// A list of Super Chat purchases that match the request criteria.
-    #[serde(rename = "items")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub items: Option<Vec<SuperChatEvent>>,
-}
-
-/// The auditDetails object encapsulates channel data that is relevant for YouTube Partners during the audit process.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct ChannelAuditDetails {
-    /// Whether or not the channel has any copyright strikes.
-    #[serde(rename = "copyrightStrikesGoodStanding")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub copyright_strikes_good_standing: Option<bool>,
-    /// Whether or not the channel has any unresolved claims.
-    #[serde(rename = "contentIdClaimsGoodStanding")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub content_id_claims_good_standing: Option<bool>,
-    /// Whether or not the channel respects the community guidelines.
-    #[serde(rename = "communityGuidelinesGoodStanding")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub community_guidelines_good_standing: Option<bool>,
-}
-
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct VideoAgeGating {
-    /// Video game rating, if any.
-    #[serde(rename = "videoGameRating")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub video_game_rating: Option<VideoAgeGatingVideoGameRating>,
-    /// Age-restricted trailers. For redband trailers and adult-rated video-games. Only users aged 18+ can view the content. The the field is true the content is restricted to viewers aged 18+. Otherwise The field won't be present.
-    #[serde(rename = "restricted")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub restricted: Option<bool>,
-    /// Indicates whether or not the video has alcoholic beverage content. Only users of legal purchasing age in a particular country, as identified by ICAP, can view the content.
-    #[serde(rename = "alcoholContent")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub alcohol_content: Option<bool>,
-}
-
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct LiveStreamSnippet {
-    /// DateTime: The date and time that the stream was created.
-    #[serde(rename = "publishedAt")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub published_at: Option<DateTime<Utc>>,
-    /// The stream's title. The value must be between 1 and 128 characters long.
-    #[serde(rename = "title")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub title: Option<String>,
-    /// The stream's description. The value cannot be longer than 10000 characters.
-    #[serde(rename = "description")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub description: Option<String>,
-    #[serde(rename = "isDefaultStream")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub is_default_stream: Option<bool>,
-    /// The ID that YouTube uses to uniquely identify the channel that is transmitting the stream.
-    #[serde(rename = "channelId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub channel_id: Option<String>,
-}
-
-/// 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>>,
-}
-
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct PlaylistStatus {
-    /// The playlist's privacy status.
-    #[serde(rename = "privacyStatus")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub privacy_status: Option<PlaylistStatusPrivacyStatus>,
-}
-
-/// Pings that the app shall fire (authenticated by biscotti cookie). Each ping has a context, in which the app must fire the ping, and a url identifying the ping.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct ChannelConversionPing {
-    /// The url (without the schema) that the player shall send the ping to. It's at caller's descretion to decide which schema to use (http vs https) Example of a returned url: //googleads.g.doubleclick.net/pagead/ viewthroughconversion/962985656/?data=path%3DtHe_path%3Btype%3D cview%3Butuid%3DGISQtTNGYqaYl4sKxoVvKA&labe=default The caller must append biscotti authentication (ms param in case of mobile, for example) to this ping.
-    #[serde(rename = "conversionUrl")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub conversion_url: Option<String>,
-    /// Defines the context of the ping.
-    #[serde(rename = "context")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub context: Option<ChannelConversionPingContext>,
-}
-
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct ChannelSection {
-    #[serde(rename = "targeting")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub targeting: Option<ChannelSectionTargeting>,
-    /// The ID that YouTube uses to uniquely identify the channel section.
+    /// 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#channelSection".
+    /// 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<ChannelSectionSnippet>,
-    #[serde(rename = "contentDetails")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub content_details: Option<ChannelSectionContentDetails>,
-    /// Localizations for different languages
-    #[serde(rename = "localizations")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub localizations: Option<HashMap<String, ChannelSectionLocalization>>,
+    pub snippet: Option<VideoAbuseReportReasonSnippet>,
+}
+
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct VideoAbuseReportReasonListResponse {
     /// Etag of this resource.
     #[serde(rename = "etag")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub etag: Option<String>,
-}
-
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct LocalizedString {
-    #[serde(rename = "value")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub value: Option<String>,
-    #[serde(rename = "language")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub language: Option<String>,
-}
-
-/// Ratings schemes. The country-specific ratings are mostly for movies and shows. LINT.IfChange
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct ContentRating {
-    /// The video's Central Board of Film Certification (CBFC - India) rating.
-    #[serde(rename = "cbfcRating")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub cbfc_rating: Option<ContentRatingCbfcRating>,
-    /// The video's rating in Estonia.
-    #[serde(rename = "eefilmRating")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub eefilm_rating: Option<ContentRatingEefilmRating>,
-    /// Reasons that explain why the video received its FPB (South Africa) rating.
-    #[serde(rename = "fpbRatingReasons")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub fpb_rating_reasons: Option<Vec<ContentRatingFpbRatingReasons>>,
-    /// The video's rating from Nigeria's National Film and Video Censors Board.
-    #[serde(rename = "nfvcbRating")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub nfvcb_rating: Option<ContentRatingNfvcbRating>,
-    /// The video's rating from Hong Kong's Office for Film, Newspaper and Article Administration.
-    #[serde(rename = "fcoRating")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub fco_rating: Option<ContentRatingFcoRating>,
-    /// The video's NICAM/Kijkwijzer rating from the Nederlands Instituut voor de Classificatie van Audiovisuele Media (Netherlands).
-    #[serde(rename = "kijkwijzerRating")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub kijkwijzer_rating: Option<ContentRatingKijkwijzerRating>,
-    /// The video's British Board of Film Classification (BBFC) rating.
-    #[serde(rename = "bbfcRating")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub bbfc_rating: Option<ContentRatingBbfcRating>,
-    /// The video's rating in Venezuela.
-    #[serde(rename = "resorteviolenciaRating")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub resorteviolencia_rating: Option<ContentRatingResorteviolenciaRating>,
-    /// The video's rating from the Kenya Film Classification Board.
-    #[serde(rename = "kfcbRating")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub kfcb_rating: Option<ContentRatingKfcbRating>,
-    /// The video's rating in Israel.
-    #[serde(rename = "ilfilmRating")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub ilfilm_rating: Option<ContentRatingIlfilmRating>,
-    /// The video's rating from Taiwan's Ministry of Culture (文化部).
-    #[serde(rename = "moctwRating")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub moctw_rating: Option<ContentRatingMoctwRating>,
-    /// The video's rating from the Austrian Board of Media Classification (Bundesministerium für Unterricht, Kunst und Kultur).
-    #[serde(rename = "bmukkRating")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub bmukk_rating: Option<ContentRatingBmukkRating>,
-    /// The video's National Film Registry of the Russian Federation (MKRF - Russia) rating.
-    #[serde(rename = "russiaRating")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub russia_rating: Option<ContentRatingRussiaRating>,
-    /// Rating system for Canadian TV - Canadian TV Classification System The video's rating from the Canadian Radio-Television and Telecommunications Commission (CRTC) for Canadian English-language broadcasts. For more information, see the Canadian Broadcast Standards Council website.
-    #[serde(rename = "catvRating")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub catv_rating: Option<ContentRatingCatvRating>,
-    /// The video's Ministerio de Cultura (Colombia) rating.
-    #[serde(rename = "mocRating")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub moc_rating: Option<ContentRatingMocRating>,
-    /// The video's rating from Ireland's Raidió Teilifís Éireann.
-    #[serde(rename = "rteRating")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub rte_rating: Option<ContentRatingRteRating>,
-    /// The video's Anatel (Asociación Nacional de Televisión) rating for Chilean television.
-    #[serde(rename = "anatelRating")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub anatel_rating: Option<ContentRatingAnatelRating>,
-    /// The video's rating from Malta's Film Age-Classification Board.
-    #[serde(rename = "mccaaRating")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub mccaa_rating: Option<ContentRatingMccaaRating>,
-    /// The video's Motion Picture Association of America (MPAA) rating.
-    #[serde(rename = "mpaaRating")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub mpaa_rating: Option<ContentRatingMpaaRating>,
-    /// The video's TV Parental Guidelines (TVPG) rating.
-    #[serde(rename = "tvpgRating")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub tvpg_rating: Option<ContentRatingTvpgRating>,
-    /// The video's rating in Slovakia.
-    #[serde(rename = "skfilmRating")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub skfilm_rating: Option<ContentRatingSkfilmRating>,
-    /// The rating system for MENA countries, a clone of MPAA. It is needed to prevent titles go live w/o additional QC check, since some of them can be inappropriate for the countries at all. See b/33408548 for more details.
-    #[serde(rename = "menaMpaaRating")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub mena_mpaa_rating: Option<ContentRatingMenaMpaaRating>,
-    /// The video's Canadian Home Video Rating System (CHVRS) rating.
-    #[serde(rename = "chvrsRating")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub chvrs_rating: Option<ContentRatingChvrsRating>,
-    /// The video's rating in the Czech Republic.
-    #[serde(rename = "czfilmRating")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub czfilm_rating: Option<ContentRatingCzfilmRating>,
-    /// Rating system in France - Commission de classification cinematographique
-    #[serde(rename = "cncRating")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub cnc_rating: Option<ContentRatingCncRating>,
-    /// The video's rating from Singapore's Media Development Authority (MDA) and, specifically, it's Board of Film Censors (BFC).
-    #[serde(rename = "mdaRating")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub mda_rating: Option<ContentRatingMdaRating>,
-    /// The video's rating from Romania's CONSILIUL NATIONAL AL AUDIOVIZUALULUI (CNA).
-    #[serde(rename = "cnaRating")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub cna_rating: Option<ContentRatingCnaRating>,
-    /// Reasons that explain why the video received its DJCQT (Brazil) rating.
-    #[serde(rename = "djctqRatingReasons")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub djctq_rating_reasons: Option<Vec<ContentRatingDjctqRatingReasons>>,
-    /// This property has been deprecated. Use the contentDetails.contentRating.cncRating instead.
-    #[serde(rename = "fmocRating")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub fmoc_rating: Option<ContentRatingFmocRating>,
-    /// A rating that YouTube uses to identify age-restricted content.
-    #[serde(rename = "ytRating")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub yt_rating: Option<ContentRatingYtRating>,
-    /// The video's rating from the Movie and Television Review and Classification Board (Philippines).
-    #[serde(rename = "mtrcbRating")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub mtrcb_rating: Option<ContentRatingMtrcbRating>,
-    /// The video's Australian Classification Board (ACB) or Australian Communications and Media Authority (ACMA) rating. ACMA ratings are used to classify children's television programming.
-    #[serde(rename = "acbRating")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub acb_rating: Option<ContentRatingAcbRating>,
-    /// The video's rating from Finland's Kansallinen Audiovisuaalinen Instituutti (National Audiovisual Institute).
-    #[serde(rename = "mekuRating")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub meku_rating: Option<ContentRatingMekuRating>,
-    /// The video's rating from Indonesia's Lembaga Sensor Film.
-    #[serde(rename = "lsfRating")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub lsf_rating: Option<ContentRatingLsfRating>,
-    /// The video's Irish Film Classification Office (IFCO - Ireland) rating. See the IFCO website for more information.
-    #[serde(rename = "ifcoRating")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub ifco_rating: Option<ContentRatingIfcoRating>,
-    /// Rating system in Turkey - Evaluation and Classification Board of the Ministry of Culture and Tourism
-    #[serde(rename = "ecbmctRating")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub ecbmct_rating: Option<ContentRatingEcbmctRating>,
-    /// The video's rating from the Maldives National Bureau of Classification.
-    #[serde(rename = "nbcRating")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub nbc_rating: Option<ContentRatingNbcRating>,
-    /// The video's rating from Italy's Autorità per le Garanzie nelle Comunicazioni (AGCOM).
-    #[serde(rename = "agcomRating")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub agcom_rating: Option<ContentRatingAgcomRating>,
-    /// The video's rating from the Ministero dei Beni e delle Attività Culturali e del Turismo (Italy).
-    #[serde(rename = "mibacRating")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub mibac_rating: Option<ContentRatingMibacRating>,
-    /// The video's Instituto de la Cinematografía y de las Artes Audiovisuales (ICAA - Spain) rating.
-    #[serde(rename = "icaaRating")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub icaa_rating: Option<ContentRatingIcaaRating>,
-    /// The rating system for trailer, DVD, and Ad in the US. See http://movielabs.com/md/ratings/v2.3/html/US_MPAAT_Ratings.html.
-    #[serde(rename = "mpaatRating")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub mpaat_rating: Option<ContentRatingMpaatRating>,
-    /// The video's rating from Medietilsynet, the Norwegian Media Authority.
-    #[serde(rename = "medietilsynetRating")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub medietilsynet_rating: Option<ContentRatingMedietilsynetRating>,
-    /// The video's rating in Greece.
-    #[serde(rename = "grfilmRating")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub grfilm_rating: Option<ContentRatingGrfilmRating>,
-    /// The video's Eirin (映倫) rating. Eirin is the Japanese rating system.
-    #[serde(rename = "eirinRating")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub eirin_rating: Option<ContentRatingEirinRating>,
-    /// The video's rating in Poland.
-    #[serde(rename = "nbcplRating")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub nbcpl_rating: Option<ContentRatingNbcplRating>,
-    /// The video's rating in Peru.
-    #[serde(rename = "pefilmRating")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub pefilm_rating: Option<ContentRatingPefilmRating>,
-    /// The video's Freiwillige Selbstkontrolle der Filmwirtschaft (FSK - Germany) rating.
-    #[serde(rename = "fskRating")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub fsk_rating: Option<ContentRatingFskRating>,
-    /// The video's Office of Film and Literature Classification (OFLC - New Zealand) rating.
-    #[serde(rename = "oflcRating")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub oflc_rating: Option<ContentRatingOflcRating>,
-    /// The video's rating from Statens medieråd (Sweden's National Media Council).
-    #[serde(rename = "smsaRating")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub smsa_rating: Option<ContentRatingSmsaRating>,
-    /// The video's rating in Egypt.
-    #[serde(rename = "egfilmRating")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub egfilm_rating: Option<ContentRatingEgfilmRating>,
-    /// The video's rating in Iceland.
-    #[serde(rename = "smaisRating")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub smais_rating: Option<ContentRatingSmaisRating>,
-    /// The video's rating from Luxembourg's Commission de surveillance de la classification des films (CSCF).
-    #[serde(rename = "cscfRating")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub cscf_rating: Option<ContentRatingCscfRating>,
-    /// The video's rating from the Canadian Radio-Television and Telecommunications Commission (CRTC) for Canadian French-language broadcasts. For more information, see the Canadian Broadcast Standards Council website.
-    #[serde(rename = "catvfrRating")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub catvfr_rating: Option<ContentRatingCatvfrRating>,
-    /// The video's rating from Portugal's Comissão de Classificação de Espect´culos.
-    #[serde(rename = "cceRating")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub cce_rating: Option<ContentRatingCceRating>,
-    /// The video's rating from South Africa's Film and Publication Board.
-    #[serde(rename = "fpbRating")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub fpb_rating: Option<ContentRatingFpbRating>,
-    /// The video's rating system for Vietnam - MCST
-    #[serde(rename = "mcstRating")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub mcst_rating: Option<ContentRatingMcstRating>,
-    /// The video's rating from the Danish Film Institute's (Det Danske Filminstitut) Media Council for Children and Young People.
-    #[serde(rename = "mccypRating")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub mccyp_rating: Option<ContentRatingMccypRating>,
-    /// The video's rating from Malaysia's Film Censorship Board.
-    #[serde(rename = "fcbmRating")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub fcbm_rating: Option<ContentRatingFcbmRating>,
-    /// The National Media Council ratings system for United Arab Emirates.
-    #[serde(rename = "nmcRating")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub nmc_rating: Option<ContentRatingNmcRating>,
-    /// The video's rating in Switzerland.
-    #[serde(rename = "chfilmRating")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub chfilm_rating: Option<ContentRatingChfilmRating>,
-    /// The video's rating from the Nacionãlais Kino centrs (National Film Centre of Latvia).
-    #[serde(rename = "nkclvRating")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub nkclv_rating: Option<ContentRatingNkclvRating>,
-    /// The video's rating from the Bulgarian National Film Center.
-    #[serde(rename = "nfrcRating")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub nfrc_rating: Option<ContentRatingNfrcRating>,
-    /// The video's Departamento de Justiça, Classificação, Qualificação e Títulos (DJCQT - Brazil) rating.
-    #[serde(rename = "djctqRating")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub djctq_rating: Option<ContentRatingDjctqRating>,
-    /// The video's rating from Thailand's Board of Film and Video Censors.
-    #[serde(rename = "bfvcRating")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub bfvc_rating: Option<ContentRatingBfvcRating>,
-    /// The video's INCAA (Instituto Nacional de Cine y Artes Audiovisuales - Argentina) rating.
-    #[serde(rename = "incaaRating")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub incaa_rating: Option<ContentRatingIncaaRating>,
-    /// The video's rating from the Commission de Contrôle des Films (Belgium).
-    #[serde(rename = "cicfRating")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub cicf_rating: Option<ContentRatingCicfRating>,
-    /// The video's Korea Media Rating Board (영상물등급위원회) rating. The KMRB rates videos in South Korea.
-    #[serde(rename = "kmrbRating")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub kmrb_rating: Option<ContentRatingKmrbRating>,
-    /// The video's Consejo de Calificación Cinematográfica (Chile) rating.
-    #[serde(rename = "cccRating")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub ccc_rating: Option<ContentRatingCccRating>,
-    /// The video's rating from France's Conseil supérieur de l’audiovisuel, which rates broadcast content.
-    #[serde(rename = "csaRating")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub csa_rating: Option<ContentRatingCsaRating>,
-    /// The video's rating from the Hungarian Nemzeti Filmiroda, the Rating Committee of the National Office of Film.
-    #[serde(rename = "rcnofRating")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub rcnof_rating: Option<ContentRatingRcnofRating>,
-    /// The video's General Directorate of Radio, Television and Cinematography (Mexico) rating.
-    #[serde(rename = "rtcRating")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub rtc_rating: Option<ContentRatingRtcRating>,
-}
-
-/// A `__liveChatBan__` resource represents a ban for a YouTube live chat.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct LiveChatBan {
-    /// Identifies what kind of resource this is. Value: the fixed string `"youtube#liveChatBan"`.
+    /// Serialized EventId of the request which produced this response.
+    #[serde(rename = "eventId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub event_id: Option<String>,
+    /// A list of valid abuse reasons that are used with `video.ReportAbuse`.
+    #[serde(rename = "items")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub items: Option<Vec<VideoAbuseReportReason>>,
+    /// Identifies what kind of resource this is. Value: the fixed string `"youtube#videoAbuseReportReasonListResponse"`.
+    #[serde(rename = "kind")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub kind: Option<String>,
+    /// The `visitorId` identifies the visitor.
+    #[serde(rename = "visitorId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub visitor_id: Option<String>,
+}
+
+/// Basic details about a video category, such as its localized title.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct VideoAbuseReportReasonSnippet {
+    /// The localized label belonging to this abuse report reason.
+    #[serde(rename = "label")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub label: Option<String>,
+    /// The secondary reasons associated with this reason, if any are available. (There might be 0 or more.)
+    #[serde(rename = "secondaryReasons")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub secondary_reasons: Option<Vec<VideoAbuseReportSecondaryReason>>,
+}
+
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct VideoAbuseReportSecondaryReason {
+    /// The ID of this abuse report secondary reason.
+    #[serde(rename = "id")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub id: Option<String>,
+    /// The localized label for this abuse report secondary reason.
+    #[serde(rename = "label")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub label: Option<String>,
+}
+
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct VideoAgeGating {
+    /// Indicates whether or not the video has alcoholic beverage content. Only users of legal purchasing age in a particular country, as identified by ICAP, can view the content.
+    #[serde(rename = "alcoholContent")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub alcohol_content: Option<bool>,
+    /// Age-restricted trailers. For redband trailers and adult-rated video-games. Only users aged 18+ can view the content. The the field is true the content is restricted to viewers aged 18+. Otherwise The field won't be present.
+    #[serde(rename = "restricted")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub restricted: Option<bool>,
+    /// Video game rating, if any.
+    #[serde(rename = "videoGameRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub video_game_rating: Option<VideoAgeGatingVideoGameRating>,
+}
+
+/// 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>,
+    /// The ID that YouTube uses to uniquely identify the video category.
+    #[serde(rename = "id")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub id: Option<String>,
+    /// Identifies what kind of resource this is. Value: the fixed string "youtube#videoCategory".
     #[serde(rename = "kind")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub kind: Option<String>,
     #[serde(rename = "snippet")]
     #[serde(skip_serializing_if = "Option::is_none")]
-    pub snippet: Option<LiveChatBanSnippet>,
-    /// Etag of this resource.
-    #[serde(rename = "etag")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub etag: Option<String>,
-    /// The ID that YouTube assigns to uniquely identify the ban.
-    #[serde(rename = "id")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub id: Option<String>,
-}
-
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct VideoListResponse {
-    /// Serialized EventId of the request which produced this response.
-    #[serde(rename = "eventId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub event_id: Option<String>,
+    pub snippet: Option<VideoCategorySnippet>,
+}
+
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct VideoCategoryListResponse {
     /// Etag of this resource.
     #[serde(rename = "etag")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub etag: Option<String>,
+    /// Serialized EventId of the request which produced this response.
+    #[serde(rename = "eventId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub event_id: Option<String>,
+    /// A list of 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<Video>>,
-    /// 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#videoListResponse".
+    pub items: Option<Vec<VideoCategory>>,
+    /// 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>,
-    #[serde(rename = "tokenPagination")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub token_pagination: Option<TokenPagination>,
-    /// The token that can be used as the value of the pageToken parameter to retrieve the previous page in the result set.
-    #[serde(rename = "prevPageToken")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub prev_page_token: Option<String>,
     /// The token that can be used as the value of the pageToken parameter to retrieve the next page in the result set.
     #[serde(rename = "nextPageToken")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub next_page_token: Option<String>,
-}
-
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct LiveChatUserBannedMessageDetails {
-    /// u64: The duration of the ban. This property is only present if the banType is temporary.
-    #[serde(rename = "banDurationSeconds")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub ban_duration_seconds: Option<String>,
-    #[serde(rename = "bannedUserDetails")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub banned_user_details: Option<ChannelProfileDetails>,
-    /// The type of ban.
-    #[serde(rename = "banType")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub ban_type: Option<LiveChatUserBannedMessageDetailsBanType>,
-}
-
-/// Specifies suggestions on how to improve video content, including encoding hints, tag suggestions, and editor suggestions.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct VideoSuggestions {
-    /// A list of video editing operations that might improve the video quality or playback experience of the uploaded video.
-    #[serde(rename = "editorSuggestions")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub editor_suggestions: Option<Vec<VideoSuggestionsEditorSuggestions>>,
-    /// A list of reasons why YouTube may have difficulty transcoding the uploaded video or that might result in an erroneous transcoding. These warnings are generated before YouTube actually processes the uploaded video file. In addition, they identify issues that are unlikely to cause the video processing to fail but that might cause problems such as sync issues, video artifacts, or a missing audio track.
-    #[serde(rename = "processingWarnings")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub processing_warnings: Option<Vec<VideoSuggestionsProcessingWarnings>>,
-    /// A list of keyword tags that could be added to the video's metadata to increase the likelihood that users will locate your video when searching or browsing on YouTube.
-    #[serde(rename = "tagSuggestions")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub tag_suggestions: Option<Vec<VideoSuggestionsTagSuggestion>>,
-    /// A list of errors that will prevent YouTube from successfully processing the uploaded video video. These errors indicate that, regardless of the video's current processing status, eventually, that status will almost certainly be failed.
-    #[serde(rename = "processingErrors")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub processing_errors: Option<Vec<VideoSuggestionsProcessingErrors>>,
-    /// A list of suggestions that may improve YouTube's ability to process the video.
-    #[serde(rename = "processingHints")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub processing_hints: Option<Vec<VideoSuggestionsProcessingHints>>,
-}
-
-/// A *member* resource represents a member for a YouTube channel. A member provides recurring monetary support to a creator and receives special benefits.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct Member {
-    /// Identifies what kind of resource this is. Value: the fixed string "youtube#member".
-    #[serde(rename = "kind")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub kind: Option<String>,
-    /// Etag of this resource.
-    #[serde(rename = "etag")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub etag: Option<String>,
-    #[serde(rename = "snippet")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub snippet: Option<MemberSnippet>,
+    #[serde(rename = "pageInfo")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub page_info: Option<PageInfo>,
+    /// The token that can be used as the value of the pageToken parameter to retrieve the previous page in the result set.
+    #[serde(rename = "prevPageToken")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub prev_page_token: Option<String>,
+    #[serde(rename = "tokenPagination")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub token_pagination: Option<TokenPagination>,
+    /// The visitorId identifies the visitor.
+    #[serde(rename = "visitorId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub visitor_id: Option<String>,
 }
 
 /// Basic details about a video category, such as its localized title.
@@ -3748,56 +3871,86 @@
     #[serde(rename = "assignable")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub assignable: Option<bool>,
-    /// The video category's title.
-    #[serde(rename = "title")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub title: Option<String>,
     /// The YouTube channel that created the video category.
     #[serde(rename = "channelId")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub channel_id: Option<String>,
-}
-
-/// A live stream describes a live ingestion point.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct LiveStream {
-    #[serde(rename = "status")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub status: Option<LiveStreamStatus>,
-    #[serde(rename = "contentDetails")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub content_details: Option<LiveStreamContentDetails>,
-    /// Identifies what kind of resource this is. Value: the fixed string "youtube#liveStream".
-    #[serde(rename = "kind")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub kind: Option<String>,
-    #[serde(rename = "cdn")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub cdn: Option<CdnSettings>,
-    /// The ID that YouTube assigns to uniquely identify the stream.
-    #[serde(rename = "id")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub id: Option<String>,
-    #[serde(rename = "snippet")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub snippet: Option<LiveStreamSnippet>,
-    /// Etag of this resource.
-    #[serde(rename = "etag")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub etag: Option<String>,
+    /// The video category's title.
+    #[serde(rename = "title")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub title: 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<VideoContentDetailsCaption>,
+    #[serde(rename = "contentRating")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub content_rating: Option<ContentRating>,
+    #[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<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>,
+    /// 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>,
+    /// 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<VideoContentDetailsProjection>,
+    #[serde(rename = "regionRestriction")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub region_restriction: Option<VideoContentDetailsRegionRestriction>,
+}
+
+/// DEPRECATED Region restriction of the video.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct VideoContentDetailsRegionRestriction {
+    /// A list of region codes that identify countries where the video is viewable. If this property is present and a country is not listed in its value, then the video is blocked from appearing in that country. If this property is present and contains an empty list, the video is blocked in all countries.
+    #[serde(rename = "allowed")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub allowed: Option<Vec<String>>,
+    /// A list of region codes that identify countries where the video is blocked. If this property is present and a country is not listed in its value, then the video is viewable in that country. If this property is present and contains an empty list, the video is viewable in all countries.
+    #[serde(rename = "blocked")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub blocked: Option<Vec<String>>,
 }
 
 /// Describes original video file properties, including technical details about audio and video streams, but also metadata information like content length, digitization time, or geotagging information.
 #[derive(Serialize, Deserialize, Debug, Clone, Default)]
 pub struct VideoFileDetails {
-    /// A list of video streams contained in the uploaded video file. Each item in the list contains detailed metadata about a video stream.
-    #[serde(rename = "videoStreams")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub video_streams: Option<Vec<VideoFileDetailsVideoStream>>,
     /// A list of audio streams contained in the uploaded video file. Each item in the list contains detailed metadata about an audio stream.
     #[serde(rename = "audioStreams")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub audio_streams: Option<Vec<VideoFileDetailsAudioStream>>,
+    /// u64: The uploaded video file's combined (video and audio) bitrate in bits per second.
+    #[serde(rename = "bitrateBps")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub bitrate_bps: Option<String>,
+    /// The uploaded video file's container format.
+    #[serde(rename = "container")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub container: 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")]
@@ -3806,26 +3959,167 @@
     #[serde(rename = "durationMs")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub duration_ms: Option<String>,
-    /// The uploaded video file's container format.
-    #[serde(rename = "container")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub container: Option<String>,
+    /// The uploaded file's name. This field is present whether a video file or another type of file was uploaded.
+    #[serde(rename = "fileName")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub file_name: Option<String>,
+    /// u64: The uploaded file's size in bytes. This field is present whether a video file or another type of file was uploaded.
+    #[serde(rename = "fileSize")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub file_size: Option<String>,
     /// The uploaded file's type as detected by YouTube's video processing engine. Currently, YouTube only processes video files, but this field is present whether a video file or another type of file was uploaded.
     #[serde(rename = "fileType")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub file_type: Option<VideoFileDetailsFileType>,
-    /// u64: The uploaded video file's combined (video and audio) bitrate in bits per second.
+    /// 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>>,
+}
+
+/// 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>,
+}
+
+/// Information about a video stream.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct VideoFileDetailsVideoStream {
+    /// The video content's display aspect ratio, which specifies the aspect ratio in which the video should be displayed.
+    #[serde(rename = "aspectRatio")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub aspect_ratio: Option<f64>,
+    /// 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>,
-    /// u64: The uploaded file's size in bytes. This field is present whether a video file or another type of file was uploaded.
-    #[serde(rename = "fileSize")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub file_size: Option<String>,
-    /// The uploaded file's name. This field is present whether a video file or another type of file was uploaded.
-    #[serde(rename = "fileName")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub file_name: Option<String>,
+    /// The video codec that the stream uses.
+    #[serde(rename = "codec")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub codec: Option<String>,
+    /// The video stream's frame rate, in frames per second.
+    #[serde(rename = "frameRateFps")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub frame_rate_fps: Option<f64>,
+    /// The encoded video content's height in pixels.
+    #[serde(rename = "heightPixels")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub height_pixels: Option<u32>,
+    /// The amount that YouTube needs to rotate the original source content to properly display the video.
+    #[serde(rename = "rotation")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub rotation: Option<VideoFileDetailsVideoStreamRotation>,
+    /// A 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 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>,
+}
+
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct VideoListResponse {
+    /// Etag of this resource.
+    #[serde(rename = "etag")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub etag: Option<String>,
+    /// Serialized EventId of the request which produced this response.
+    #[serde(rename = "eventId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub event_id: Option<String>,
+    #[serde(rename = "items")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub items: Option<Vec<Video>>,
+    /// Identifies what kind of resource this is. Value: the fixed string "youtube#videoListResponse".
+    #[serde(rename = "kind")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub kind: Option<String>,
+    /// 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 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>,
+    /// The visitorId identifies the visitor.
+    #[serde(rename = "visitorId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub visitor_id: 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>,
+    /// DateTime: The time that the broadcast actually ended. This value will not be available until the broadcast is over.
+    #[serde(rename = "actualEndTime")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub actual_end_time: Option<DateTime<Utc>>,
+    /// DateTime: The time that the broadcast actually started. This value will not be available until the broadcast begins.
+    #[serde(rename = "actualStartTime")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub actual_start_time: Option<DateTime<Utc>>,
+    /// u64: The number of viewers currently watching the broadcast. The property and its value will be present if the broadcast has current viewers and the broadcast owner has not hidden the viewcount for the video. Note that YouTube stops tracking the number of concurrent viewers for a broadcast when the broadcast ends. So, this property would not identify the number of viewers watching an archived video of a live broadcast that already ended.
+    #[serde(rename = "concurrentViewers")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub concurrent_viewers: Option<String>,
+    /// DateTime: The time that the broadcast is scheduled to end. If the value is empty or the property is not present, then the broadcast is scheduled to contiue indefinitely.
+    #[serde(rename = "scheduledEndTime")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub scheduled_end_time: Option<DateTime<Utc>>,
+    /// DateTime: The time that the broadcast is scheduled to begin.
+    #[serde(rename = "scheduledStartTime")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub scheduled_start_time: Option<DateTime<Utc>>,
+}
+
+/// Localized versions of certain video properties (e.g. title).
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct VideoLocalization {
+    /// Localized version of the video's description.
+    #[serde(rename = "description")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub description: Option<String>,
+    /// Localized version of the video's title.
+    #[serde(rename = "title")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub title: Option<String>,
+}
+
+/// 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>,
 }
 
 /// Player to be used for a video playback.
@@ -3845,509 +4139,78 @@
     pub embed_width: Option<String>,
 }
 
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct LiveBroadcastListResponse {
-    /// Etag of this resource.
-    #[serde(rename = "etag")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    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>,
-    #[serde(rename = "tokenPagination")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub token_pagination: Option<TokenPagination>,
-    /// The token that can be used as the value of the pageToken parameter to retrieve the next page in the result set.
-    #[serde(rename = "nextPageToken")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub next_page_token: Option<String>,
-    #[serde(rename = "pageInfo")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub page_info: Option<PageInfo>,
-    /// 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>,
-    /// A list of broadcasts that match the request criteria.
-    #[serde(rename = "items")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub items: Option<Vec<LiveBroadcast>>,
-}
-
-/// Statistics about a channel: number of subscribers, number of videos in the channel, etc.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct ChannelStatistics {
-    /// u64: The number of subscribers that the channel has.
-    #[serde(rename = "subscriberCount")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub subscriber_count: Option<String>,
-    /// u64: The number of comments for the channel.
-    #[serde(rename = "commentCount")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub comment_count: Option<String>,
-    /// u64: The number of times the channel has been viewed.
-    #[serde(rename = "viewCount")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub view_count: Option<String>,
-    /// Whether or not the number of subscribers is shown for this user.
-    #[serde(rename = "hiddenSubscriberCount")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub hidden_subscriber_count: Option<bool>,
-    /// u64: The number of videos uploaded to the channel.
-    #[serde(rename = "videoCount")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub video_count: Option<String>,
-}
-
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct PlaylistContentDetails {
-    /// The number of videos in the playlist.
-    #[serde(rename = "itemCount")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub item_count: Option<u32>,
-}
-
-/// Basic details about an activity, including title, description, thumbnails, activity type and group. Next ID: 12
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct ActivitySnippet {
-    #[serde(rename = "thumbnails")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub thumbnails: Option<ThumbnailDetails>,
-    /// The title of the resource primarily associated with the activity.
-    #[serde(rename = "title")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub title: Option<String>,
-    /// Channel title for the channel responsible for this activity
-    #[serde(rename = "channelTitle")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub channel_title: Option<String>,
-    /// The description of the resource primarily associated with the activity. @mutable youtube.activities.insert
-    #[serde(rename = "description")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub description: Option<String>,
-    /// The type of activity that the resource describes.
-    #[serde(rename = "type")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub type_: Option<ActivitySnippetType>,
-    /// The ID that YouTube uses to uniquely identify the channel associated with the activity.
-    #[serde(rename = "channelId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub channel_id: Option<String>,
-    /// DateTime: The date and time that the video was uploaded.
-    #[serde(rename = "publishedAt")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub published_at: Option<DateTime<Utc>>,
-    /// The group ID associated with the activity. A group ID identifies user events that are associated with the same user and resource. For example, if a user rates a video and marks the same video as a favorite, the entries for those events would have the same group ID in the user's activity feed. In your user interface, you can avoid repetition by grouping events with the same groupId value.
-    #[serde(rename = "groupId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub group_id: Option<String>,
-}
-
-/// Details about a resource which was added to a channel.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct ActivityContentDetailsChannelItem {
-    #[serde(rename = "resourceId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub resource_id: Option<ResourceId>,
-}
-
-/// Live broadcast state.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct LiveBroadcastStatus {
-    /// The broadcast's status. The status can be updated using the API's liveBroadcasts.transition method.
-    #[serde(rename = "lifeCycleStatus")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub life_cycle_status: Option<LiveBroadcastStatusLifeCycleStatus>,
-    /// The broadcast's privacy status. Note that the broadcast represents exactly one YouTube video, so the privacy settings are identical to those supported for videos. In addition, you can set this field by modifying the broadcast resource or by setting the privacyStatus field of the corresponding video resource.
-    #[serde(rename = "privacyStatus")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub privacy_status: Option<LiveBroadcastStatusPrivacyStatus>,
-    /// The broadcast's recording status.
-    #[serde(rename = "recordingStatus")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub recording_status: Option<LiveBroadcastStatusRecordingStatus>,
-    /// Priority of the live broadcast event (internal state).
-    #[serde(rename = "liveBroadcastPriority")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub live_broadcast_priority: Option<LiveBroadcastStatusLiveBroadcastPriority>,
-    /// Whether the broadcast is made for kids or not, decided by YouTube instead of the creator. This field is read only.
-    #[serde(rename = "madeForKids")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub made_for_kids: Option<bool>,
-    /// This field will be set to True if the creator declares the broadcast to be kids only: go/live-cw-work.
-    #[serde(rename = "selfDeclaredMadeForKids")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub self_declared_made_for_kids: Option<bool>,
-}
-
-/// Detailed settings of a stream.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct LiveStreamContentDetails {
-    /// Indicates whether the stream is reusable, which means that it can be bound to multiple broadcasts. It is common for broadcasters to reuse the same stream for many different broadcasts if those broadcasts occur at different times. If you set this value to false, then the stream will not be reusable, which means that it can only be bound to one broadcast. Non-reusable streams differ from reusable streams in the following ways: - A non-reusable stream can only be bound to one broadcast. - A non-reusable stream might be deleted by an automated process after the broadcast ends. - The liveStreams.list method does not list non-reusable streams if you call the method and set the mine parameter to true. The only way to use that method to retrieve the resource for a non-reusable stream is to use the id parameter to identify the stream.
-    #[serde(rename = "isReusable")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub is_reusable: Option<bool>,
-    /// The ingestion URL where the closed captions of this stream are sent.
-    #[serde(rename = "closedCaptionsIngestionUrl")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub closed_captions_ingestion_url: Option<String>,
-}
-
-/// Details about a channel bulletin post.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct ActivityContentDetailsBulletin {
-    #[serde(rename = "resourceId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub resource_id: Option<ResourceId>,
-}
-
-/// Information about a video that was marked as a favorite video.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct ActivityContentDetailsFavorite {
-    #[serde(rename = "resourceId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub resource_id: Option<ResourceId>,
-}
-
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct LiveChatSuperChatDetails {
-    /// The comment added by the user to this Super Chat event.
-    #[serde(rename = "userComment")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub user_comment: Option<String>,
-    /// A rendered string that displays the fund amount and currency to the user.
-    #[serde(rename = "amountDisplayString")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub amount_display_string: Option<String>,
-    /// The tier in which the amount belongs. Lower amounts belong to lower tiers. The lowest tier is 1.
-    #[serde(rename = "tier")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub tier: Option<u32>,
-    /// u64: The amount purchased by the user, in micros (1,750,000 micros = 1.75).
-    #[serde(rename = "amountMicros")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub amount_micros: Option<String>,
-    /// The currency in which the purchase was made.
-    #[serde(rename = "currency")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub currency: Option<String>,
-}
-
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct AbuseReport {
-    #[serde(rename = "relatedEntities")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub related_entities: Option<Vec<RelatedEntity>>,
-    #[serde(rename = "abuseTypes")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub abuse_types: Option<Vec<AbuseType>>,
-    #[serde(rename = "subject")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub subject: Option<Entity>,
-    #[serde(rename = "description")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub description: Option<String>,
-}
-
-/// Localized versions of certain video properties (e.g. title).
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct VideoLocalization {
-    /// Localized version of the video's description.
-    #[serde(rename = "description")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub description: Option<String>,
-    /// Localized version of the video's title.
-    #[serde(rename = "title")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub title: Option<String>,
+/// 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 video editing suggestions, which might improve video quality or the playback experience, are available for the video. You can retrieve these suggestions by requesting the suggestions part in your videos.list() request.
+    #[serde(rename = "editorSuggestionsAvailability")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub editor_suggestions_availability: Option<String>,
+    /// This value indicates whether file details are available for the uploaded video. You can retrieve a video's file details by requesting the fileDetails part in your videos.list() request.
+    #[serde(rename = "fileDetailsAvailability")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub file_details_availability: Option<String>,
+    /// The reason that YouTube failed to process the video. This property will only have a value if the processingStatus property's value is failed.
+    #[serde(rename = "processingFailureReason")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub processing_failure_reason: Option<VideoProcessingDetailsProcessingFailureReason>,
+    /// 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>,
+    /// 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 keyword (tag) suggestions are available for the video. Tags can be added to a video's metadata to make it easier for other users to find the video. You can retrieve these suggestions by requesting the suggestions part in your videos.list() request.
+    #[serde(rename = "tagSuggestionsAvailability")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub tag_suggestions_availability: Option<String>,
+    /// This value indicates whether thumbnail images have been generated for the video.
+    #[serde(rename = "thumbnailsAvailability")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub thumbnails_availability: Option<String>,
+}
+
+/// Video processing progress and completion time estimate.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct VideoProcessingDetailsProcessingProgress {
+    /// u64: The number of parts of the video that YouTube has already processed. You can estimate the percentage of the video that YouTube has already processed by calculating: 100 * parts_processed / parts_total Note that since the estimated number of parts could increase without a corresponding increase in the number of parts that have already been processed, it is possible that the calculated progress could periodically decrease while YouTube processes a video.
+    #[serde(rename = "partsProcessed")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub parts_processed: Option<String>,
+    /// u64: An estimate of the total number of parts that need to be processed for the video. The number may be updated with more precise estimates while YouTube processes the video.
+    #[serde(rename = "partsTotal")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub parts_total: Option<String>,
+    /// 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>,
 }
 
 /// DEPRECATED. b/157517979: This part was never populated after it was added. However, it sees non-zero traffic because there is generated client code in the wild that refers to it [1]. We keep this field and do NOT remove it because otherwise V3 would return an error when this part gets requested [2]. [1] https://developers.google.com/resources/api-libraries/documentation/youtube/v3/csharp/latest/classGoogle_1_1Apis_1_1YouTube_1_1v3_1_1Data_1_1VideoProjectDetails.html [2] http://google3/video/youtube/src/python/servers/data_api/common.py?l=1565-1569&rcl=344141677
 #[derive(Serialize, Deserialize, Debug, Clone, Default)]
 pub struct VideoProjectDetails {}
 
-/// Describes a temporal position of a visual widget inside a video.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct InvideoTiming {
-    /// u64: Defines the time at which the promotion will appear. Depending on the value of type the value of the offsetMs field will represent a time offset from the start or from the end of the video, expressed in milliseconds.
-    #[serde(rename = "offsetMs")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub offset_ms: Option<String>,
-    /// Describes a timing type. If the value is offsetFromStart, then the offsetMs field represents an offset from the start of the video. If the value is offsetFromEnd, then the offsetMs field represents an offset from the end of the video.
-    #[serde(rename = "type")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub type_: Option<InvideoTimingType>,
-    /// u64: Defines the duration in milliseconds for which the promotion should be displayed. If missing, the client should use the default.
-    #[serde(rename = "durationMs")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub duration_ms: Option<String>,
-}
-
-/// A thumbnail is an image representing a YouTube resource.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct Thumbnail {
-    /// (Optional) Height of the thumbnail image.
-    #[serde(rename = "height")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub height: Option<u32>,
-    /// (Optional) Width of the thumbnail image.
-    #[serde(rename = "width")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub width: Option<u32>,
-    /// The thumbnail image's URL.
-    #[serde(rename = "url")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub url: Option<String>,
-}
-
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct SubscriptionListResponse {
-    /// The visitorId identifies the visitor.
-    #[serde(rename = "visitorId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub visitor_id: Option<String>,
-    /// The token that can be used as the value of the pageToken parameter to retrieve the next page in the result set.
-    #[serde(rename = "nextPageToken")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub next_page_token: Option<String>,
-    /// Serialized EventId of the request which produced this response.
-    #[serde(rename = "eventId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub event_id: Option<String>,
-    /// Etag of this resource.
-    #[serde(rename = "etag")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub etag: Option<String>,
-    /// The token that can be used as the value of the pageToken parameter to retrieve the previous page in the result set.
-    #[serde(rename = "prevPageToken")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub prev_page_token: Option<String>,
-    /// Identifies what kind of resource this is. Value: the fixed string "youtube#subscriptionListResponse".
-    #[serde(rename = "kind")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub kind: Option<String>,
-    #[serde(rename = "pageInfo")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub page_info: Option<PageInfo>,
-    /// A list of subscriptions that match the request criteria.
-    #[serde(rename = "items")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub items: Option<Vec<Subscription>>,
-    #[serde(rename = "tokenPagination")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub token_pagination: Option<TokenPagination>,
-}
-
-/// A *liveBroadcast* resource represents an event that will be streamed, via live video, on YouTube.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct LiveBroadcast {
-    /// Etag of this resource.
-    #[serde(rename = "etag")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub etag: Option<String>,
-    #[serde(rename = "statistics")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub statistics: Option<LiveBroadcastStatistics>,
-    #[serde(rename = "status")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub status: Option<LiveBroadcastStatus>,
-    /// The ID that YouTube assigns to uniquely identify the broadcast.
-    #[serde(rename = "id")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub id: Option<String>,
-    #[serde(rename = "contentDetails")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub content_details: Option<LiveBroadcastContentDetails>,
-    #[serde(rename = "snippet")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub snippet: Option<LiveBroadcastSnippet>,
-    /// Identifies what kind of resource this is. Value: the fixed string "youtube#liveBroadcast".
-    #[serde(rename = "kind")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub kind: Option<String>,
-}
-
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct I18nLanguageListResponse {
-    /// A list of supported i18n languages. In this map, the i18n language ID is the map key, and its value is the corresponding i18nLanguage resource.
-    #[serde(rename = "items")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub items: Option<Vec<I18nLanguage>>,
-    /// The visitorId identifies the visitor.
-    #[serde(rename = "visitorId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub visitor_id: Option<String>,
-    /// Etag of this resource.
-    #[serde(rename = "etag")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub etag: Option<String>,
-    /// Serialized EventId of the request which produced this response.
-    #[serde(rename = "eventId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub event_id: Option<String>,
-    /// Identifies what kind of resource this is. Value: the fixed string "youtube#i18nLanguageListResponse".
-    #[serde(rename = "kind")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub kind: Option<String>,
-}
-
-/// Information about a resource that received a comment.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct ActivityContentDetailsComment {
-    #[serde(rename = "resourceId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub resource_id: Option<ResourceId>,
-}
-
-/// JSON template for the status part of a channel.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct ChannelStatus {
-    #[serde(rename = "selfDeclaredMadeForKids")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub self_declared_made_for_kids: Option<bool>,
-    #[serde(rename = "madeForKids")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub made_for_kids: Option<bool>,
-    /// Privacy status of the channel.
-    #[serde(rename = "privacyStatus")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub privacy_status: Option<ChannelStatusPrivacyStatus>,
-    /// If true, then the user is linked to either a YouTube username or G+ account. Otherwise, the user doesn't have a public YouTube identity.
-    #[serde(rename = "isLinked")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub is_linked: Option<bool>,
-    /// The long uploads status of this channel. See https://support.google.com/youtube/answer/71673 for more information.
-    #[serde(rename = "longUploadsStatus")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub long_uploads_status: Option<ChannelStatusLongUploadsStatus>,
-}
-
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct LiveChatModeratorSnippet {
-    #[serde(rename = "moderatorDetails")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub moderator_details: Option<ChannelProfileDetails>,
-    /// The ID of the live chat this moderator can act on.
-    #[serde(rename = "liveChatId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub live_chat_id: Option<String>,
-}
-
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct LocalizedProperty {
-    #[serde(rename = "defaultLanguage")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub default_language: Option<LanguageTag>,
-    #[serde(rename = "localized")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub localized: Option<Vec<LocalizedString>>,
-    #[serde(rename = "default")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub default: Option<String>,
-}
-
-/// Information about a channel that a user subscribed to.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct ActivityContentDetailsSubscription {
-    #[serde(rename = "resourceId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub resource_id: Option<ResourceId>,
-}
-
-/// A *subscription* resource contains information about a YouTube user subscription. A subscription notifies a user when new videos are added to a channel or when another user takes one of several actions on YouTube, such as uploading a video, rating a video, or commenting on a video.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct Subscription {
-    /// The ID that YouTube uses to uniquely identify the subscription.
-    #[serde(rename = "id")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub id: Option<String>,
-    #[serde(rename = "subscriberSnippet")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub subscriber_snippet: Option<SubscriptionSubscriberSnippet>,
-    /// Identifies what kind of resource this is. Value: the fixed string "youtube#subscription".
-    #[serde(rename = "kind")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub kind: Option<String>,
-    #[serde(rename = "contentDetails")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub content_details: Option<SubscriptionContentDetails>,
-    #[serde(rename = "snippet")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub snippet: Option<SubscriptionSnippet>,
-    /// Etag of this resource.
-    #[serde(rename = "etag")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub etag: Option<String>,
-}
-
-/// A resource id is a generic reference that points to another YouTube resource.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct ResourceId {
-    /// The type of the API resource.
-    #[serde(rename = "kind")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub kind: Option<String>,
-    /// The ID that YouTube uses to uniquely identify the referred resource, if that resource is a playlist. This property is only present if the resourceId.kind value is youtube#playlist.
-    #[serde(rename = "playlistId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub playlist_id: Option<String>,
-    /// The ID that YouTube uses to uniquely identify the referred resource, if that resource is a channel. This property is only present if the resourceId.kind value is youtube#channel.
-    #[serde(rename = "channelId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub channel_id: Option<String>,
-    /// The ID that YouTube uses to uniquely identify the referred resource, if that resource is a video. This property is only present if the resourceId.kind value is youtube#video.
+/// 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<VideoRatingRating>,
+    /// 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 VideoAbuseReportSecondaryReason {
-    /// The localized label for this abuse report secondary reason.
-    #[serde(rename = "label")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub label: Option<String>,
-    /// The ID of this abuse report secondary reason.
-    #[serde(rename = "id")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub id: Option<String>,
-}
-
-/// Details about a social network post.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct ActivityContentDetailsSocial {
-    /// The name of the social network.
-    #[serde(rename = "type")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub type_: Option<ActivityContentDetailsSocialType>,
-    #[serde(rename = "resourceId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub resource_id: Option<ResourceId>,
-    /// The URL of the social network post.
-    #[serde(rename = "referenceUrl")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub reference_url: Option<String>,
-    /// The author of the social network post.
-    #[serde(rename = "author")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub author: Option<String>,
-    /// An image of the post's author.
-    #[serde(rename = "imageUrl")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub image_url: Option<String>,
-}
-
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct ChannelSectionListResponse {
+pub struct VideoRatingListResponse {
     /// Etag of this resource.
     #[serde(rename = "etag")]
     #[serde(skip_serializing_if = "Option::is_none")]
@@ -4356,973 +4219,252 @@
     #[serde(rename = "eventId")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub event_id: Option<String>,
-    /// A list of ChannelSections that match the request criteria.
+    /// A list of ratings that match the request criteria.
     #[serde(rename = "items")]
     #[serde(skip_serializing_if = "Option::is_none")]
-    pub items: Option<Vec<ChannelSection>>,
+    pub items: Option<Vec<VideoRating>>,
+    /// Identifies what kind of resource this is. Value: the fixed string "youtube#videoGetRatingResponse".
+    #[serde(rename = "kind")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub kind: Option<String>,
     /// 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#channelSectionListResponse".
-    #[serde(rename = "kind")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub kind: Option<String>,
-}
-
-/// Describes the spatial position of a visual widget inside a video. It is a union of various position types, out of which only will be set one.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct InvideoPosition {
-    /// Describes in which corner of the video the visual widget will appear.
-    #[serde(rename = "cornerPosition")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub corner_position: Option<InvideoPositionCornerPosition>,
-    /// Defines the position type.
-    #[serde(rename = "type")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub type_: Option<InvideoPositionType>,
-}
-
-/// The conversionPings object encapsulates information about conversion pings that need to be respected by the channel.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct ChannelConversionPings {
-    /// Pings that the app shall fire (authenticated by biscotti cookie). Each ping has a context, in which the app must fire the ping, and a url identifying the ping.
-    #[serde(rename = "pings")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub pings: Option<Vec<ChannelConversionPing>>,
-}
-
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct LiveChatMessageSnippet {
-    #[serde(rename = "superChatDetails")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub super_chat_details: Option<LiveChatSuperChatDetails>,
-    /// Contains a string that can be displayed to the user. If this field is not present the message is silent, at the moment only messages of type TOMBSTONE and CHAT_ENDED_EVENT are silent.
-    #[serde(rename = "displayMessage")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub display_message: Option<String>,
-    #[serde(rename = "fanFundingEventDetails")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub fan_funding_event_details: Option<LiveChatFanFundingEventDetails>,
-    /// DateTime: The date and time when the message was orignally published.
+}
+
+/// Recording information associated with the video.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct VideoRecordingDetails {
+    #[serde(rename = "location")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub location: Option<GeoPoint>,
+    /// The text description of the location where the video was recorded.
+    #[serde(rename = "locationDescription")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub location_description: Option<String>,
+    /// DateTime: The date and time when the video was recorded.
+    #[serde(rename = "recordingDate")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub recording_date: Option<DateTime<Utc>>,
+}
+
+/// Basic details about a video, including title, description, uploader, thumbnails and category.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct VideoSnippet {
+    /// The YouTube video category associated with the video.
+    #[serde(rename = "categoryId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub category_id: Option<String>,
+    /// The ID that YouTube uses to uniquely identify the channel that the video was uploaded to.
+    #[serde(rename = "channelId")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub channel_id: Option<String>,
+    /// 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 default_audio_language property specifies the language spoken in the video's default audio track.
+    #[serde(rename = "defaultAudioLanguage")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub default_audio_language: Option<String>,
+    /// The 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>,
+    /// 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>,
+    #[serde(rename = "localized")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub localized: Option<VideoLocalization>,
+    /// DateTime: The date and time when the video was uploaded.
     #[serde(rename = "publishedAt")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub published_at: Option<DateTime<Utc>>,
-    #[serde(rename = "userBannedDetails")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub user_banned_details: Option<LiveChatUserBannedMessageDetails>,
-    #[serde(rename = "messageDeletedDetails")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub message_deleted_details: Option<LiveChatMessageDeletedDetails>,
-    #[serde(rename = "messageRetractedDetails")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub message_retracted_details: Option<LiveChatMessageRetractedDetails>,
-    /// The type of message, this will always be present, it determines the contents of the message as well as which fields will be present.
-    #[serde(rename = "type")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub type_: Option<LiveChatMessageSnippetType>,
-    /// The ID of the user that authored this message, this field is not always filled. textMessageEvent - the user that wrote the message fanFundingEvent - the user that funded the broadcast newSponsorEvent - the user that just became a sponsor messageDeletedEvent - the moderator that took the action messageRetractedEvent - the author that retracted their message userBannedEvent - the moderator that took the action superChatEvent - the user that made the purchase
-    #[serde(rename = "authorChannelId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub author_channel_id: Option<String>,
-    #[serde(rename = "superStickerDetails")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub super_sticker_details: Option<LiveChatSuperStickerDetails>,
-    /// Whether the message has display content that should be displayed to users.
-    #[serde(rename = "hasDisplayContent")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub has_display_content: Option<bool>,
-    #[serde(rename = "liveChatId")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub live_chat_id: Option<String>,
-    #[serde(rename = "textMessageDetails")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub text_message_details: Option<LiveChatTextMessageDetails>,
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ChannelSectionSnippetStyle {
-    Undefined,
-    #[serde(rename = "channelsectionStyleUnspecified")]
-    ChannelsectionStyleUnspecified,
-    #[serde(rename = "horizontalRow")]
-    HorizontalRow,
-    #[serde(rename = "verticalList")]
-    VerticalList,
-}
-
-impl std::default::Default for ChannelSectionSnippetStyle {
-    fn default() -> ChannelSectionSnippetStyle {
-        ChannelSectionSnippetStyle::Undefined
-    }
-}
-
-impl std::fmt::Display for ChannelSectionSnippetStyle {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ChannelSectionSnippetStyle::Undefined => write!(f, "undefined"),
-            ChannelSectionSnippetStyle::ChannelsectionStyleUnspecified => {
-                write!(f, "channelsectionStyleUnspecified")
-            }
-            ChannelSectionSnippetStyle::HorizontalRow => write!(f, "horizontalRow"),
-            ChannelSectionSnippetStyle::VerticalList => write!(f, "verticalList"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ChannelSectionSnippetType {
-    Undefined,
-    #[serde(rename = "channelsectionTypeUnspecified")]
-    ChannelsectionTypeUnspecified,
-    #[serde(rename = "singlePlaylist")]
-    SinglePlaylist,
-    #[serde(rename = "multiplePlaylists")]
-    MultiplePlaylists,
-    #[serde(rename = "popularUploads")]
-    PopularUploads,
-    #[serde(rename = "recentUploads")]
-    RecentUploads,
-    #[serde(rename = "likes")]
-    Likes,
-    #[serde(rename = "allPlaylists")]
-    AllPlaylists,
-    #[serde(rename = "likedPlaylists")]
-    LikedPlaylists,
-    #[serde(rename = "recentPosts")]
-    RecentPosts,
-    #[serde(rename = "recentActivity")]
-    RecentActivity,
-    #[serde(rename = "liveEvents")]
-    LiveEvents,
-    #[serde(rename = "upcomingEvents")]
-    UpcomingEvents,
-    #[serde(rename = "completedEvents")]
-    CompletedEvents,
-    #[serde(rename = "multipleChannels")]
-    MultipleChannels,
-    #[serde(rename = "postedVideos")]
-    PostedVideos,
-    #[serde(rename = "postedPlaylists")]
-    PostedPlaylists,
-    #[serde(rename = "subscriptions")]
-    Subscriptions,
-}
-
-impl std::default::Default for ChannelSectionSnippetType {
-    fn default() -> ChannelSectionSnippetType {
-        ChannelSectionSnippetType::Undefined
-    }
-}
-
-impl std::fmt::Display for ChannelSectionSnippetType {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ChannelSectionSnippetType::Undefined => write!(f, "undefined"),
-            ChannelSectionSnippetType::ChannelsectionTypeUnspecified => {
-                write!(f, "channelsectionTypeUnspecified")
-            }
-            ChannelSectionSnippetType::SinglePlaylist => write!(f, "singlePlaylist"),
-            ChannelSectionSnippetType::MultiplePlaylists => write!(f, "multiplePlaylists"),
-            ChannelSectionSnippetType::PopularUploads => write!(f, "popularUploads"),
-            ChannelSectionSnippetType::RecentUploads => write!(f, "recentUploads"),
-            ChannelSectionSnippetType::Likes => write!(f, "likes"),
-            ChannelSectionSnippetType::AllPlaylists => write!(f, "allPlaylists"),
-            ChannelSectionSnippetType::LikedPlaylists => write!(f, "likedPlaylists"),
-            ChannelSectionSnippetType::RecentPosts => write!(f, "recentPosts"),
-            ChannelSectionSnippetType::RecentActivity => write!(f, "recentActivity"),
-            ChannelSectionSnippetType::LiveEvents => write!(f, "liveEvents"),
-            ChannelSectionSnippetType::UpcomingEvents => write!(f, "upcomingEvents"),
-            ChannelSectionSnippetType::CompletedEvents => write!(f, "completedEvents"),
-            ChannelSectionSnippetType::MultipleChannels => write!(f, "multipleChannels"),
-            ChannelSectionSnippetType::PostedVideos => write!(f, "postedVideos"),
-            ChannelSectionSnippetType::PostedPlaylists => write!(f, "postedPlaylists"),
-            ChannelSectionSnippetType::Subscriptions => write!(f, "subscriptions"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum PlaylistItemStatusPrivacyStatus {
-    Undefined,
-    #[serde(rename = "public")]
-    Public,
-    #[serde(rename = "unlisted")]
-    Unlisted,
-    #[serde(rename = "private")]
-    Private,
-}
-
-impl std::default::Default for PlaylistItemStatusPrivacyStatus {
-    fn default() -> PlaylistItemStatusPrivacyStatus {
-        PlaylistItemStatusPrivacyStatus::Undefined
-    }
-}
-
-impl std::fmt::Display for PlaylistItemStatusPrivacyStatus {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            PlaylistItemStatusPrivacyStatus::Undefined => write!(f, "undefined"),
-            PlaylistItemStatusPrivacyStatus::Public => write!(f, "public"),
-            PlaylistItemStatusPrivacyStatus::Unlisted => write!(f, "unlisted"),
-            PlaylistItemStatusPrivacyStatus::Private => write!(f, "private"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum VideoSnippetLiveBroadcastContent {
-    Undefined,
-    #[serde(rename = "none")]
-    None,
-    /// The live broadcast is upcoming.
-    #[serde(rename = "upcoming")]
-    Upcoming,
-    /// The live broadcast is active.
-    #[serde(rename = "live")]
-    Live,
-    /// The live broadcast has been completed.
-    #[serde(rename = "completed")]
-    Completed,
-}
-
-impl std::default::Default for VideoSnippetLiveBroadcastContent {
-    fn default() -> VideoSnippetLiveBroadcastContent {
-        VideoSnippetLiveBroadcastContent::Undefined
-    }
-}
-
-impl std::fmt::Display for VideoSnippetLiveBroadcastContent {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            VideoSnippetLiveBroadcastContent::Undefined => write!(f, "undefined"),
-            VideoSnippetLiveBroadcastContent::None => write!(f, "none"),
-            VideoSnippetLiveBroadcastContent::Upcoming => write!(f, "upcoming"),
-            VideoSnippetLiveBroadcastContent::Live => write!(f, "live"),
-            VideoSnippetLiveBroadcastContent::Completed => write!(f, "completed"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum CdnSettingsIngestionType {
-    Undefined,
-    #[serde(rename = "rtmp")]
-    Rtmp,
-    #[serde(rename = "dash")]
-    Dash,
-    #[serde(rename = "webrtc")]
-    Webrtc,
-    #[serde(rename = "hls")]
-    Hls,
-}
-
-impl std::default::Default for CdnSettingsIngestionType {
-    fn default() -> CdnSettingsIngestionType {
-        CdnSettingsIngestionType::Undefined
-    }
-}
-
-impl std::fmt::Display for CdnSettingsIngestionType {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            CdnSettingsIngestionType::Undefined => write!(f, "undefined"),
-            CdnSettingsIngestionType::Rtmp => write!(f, "rtmp"),
-            CdnSettingsIngestionType::Dash => write!(f, "dash"),
-            CdnSettingsIngestionType::Webrtc => write!(f, "webrtc"),
-            CdnSettingsIngestionType::Hls => write!(f, "hls"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum CdnSettingsFrameRate {
-    Undefined,
-    #[serde(rename = "30fps")]
-    _30fps,
-    #[serde(rename = "60fps")]
-    _60fps,
-    #[serde(rename = "variable")]
-    Variable,
-}
-
-impl std::default::Default for CdnSettingsFrameRate {
-    fn default() -> CdnSettingsFrameRate {
-        CdnSettingsFrameRate::Undefined
-    }
-}
-
-impl std::fmt::Display for CdnSettingsFrameRate {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            CdnSettingsFrameRate::Undefined => write!(f, "undefined"),
-            CdnSettingsFrameRate::_30fps => write!(f, "30fps"),
-            CdnSettingsFrameRate::_60fps => write!(f, "60fps"),
-            CdnSettingsFrameRate::Variable => write!(f, "variable"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum CdnSettingsResolution {
-    Undefined,
-    #[serde(rename = "240p")]
-    _240p,
-    #[serde(rename = "360p")]
-    _360p,
-    #[serde(rename = "480p")]
-    _480p,
-    #[serde(rename = "720p")]
-    _720p,
-    #[serde(rename = "1080p")]
-    _1080p,
-    #[serde(rename = "1440p")]
-    _1440p,
-    #[serde(rename = "2160p")]
-    _2160p,
-    #[serde(rename = "variable")]
-    Variable,
-}
-
-impl std::default::Default for CdnSettingsResolution {
-    fn default() -> CdnSettingsResolution {
-        CdnSettingsResolution::Undefined
-    }
-}
-
-impl std::fmt::Display for CdnSettingsResolution {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            CdnSettingsResolution::Undefined => write!(f, "undefined"),
-            CdnSettingsResolution::_240p => write!(f, "240p"),
-            CdnSettingsResolution::_360p => write!(f, "360p"),
-            CdnSettingsResolution::_480p => write!(f, "480p"),
-            CdnSettingsResolution::_720p => write!(f, "720p"),
-            CdnSettingsResolution::_1080p => write!(f, "1080p"),
-            CdnSettingsResolution::_1440p => write!(f, "1440p"),
-            CdnSettingsResolution::_2160p => write!(f, "2160p"),
-            CdnSettingsResolution::Variable => write!(f, "variable"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum LiveBroadcastContentDetailsProjection {
-    Undefined,
-    #[serde(rename = "projectionUnspecified")]
-    ProjectionUnspecified,
-    #[serde(rename = "rectangular")]
-    Rectangular,
-    #[serde(rename = "360")]
-    _360,
-    #[serde(rename = "mesh")]
-    Mesh,
-}
-
-impl std::default::Default for LiveBroadcastContentDetailsProjection {
-    fn default() -> LiveBroadcastContentDetailsProjection {
-        LiveBroadcastContentDetailsProjection::Undefined
-    }
-}
-
-impl std::fmt::Display for LiveBroadcastContentDetailsProjection {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            LiveBroadcastContentDetailsProjection::Undefined => write!(f, "undefined"),
-            LiveBroadcastContentDetailsProjection::ProjectionUnspecified => {
-                write!(f, "projectionUnspecified")
-            }
-            LiveBroadcastContentDetailsProjection::Rectangular => write!(f, "rectangular"),
-            LiveBroadcastContentDetailsProjection::_360 => write!(f, "360"),
-            LiveBroadcastContentDetailsProjection::Mesh => write!(f, "mesh"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum LiveBroadcastContentDetailsStereoLayout {
-    Undefined,
-    #[serde(rename = "stereoLayoutUnspecified")]
-    StereoLayoutUnspecified,
-    #[serde(rename = "mono")]
-    Mono,
-    #[serde(rename = "leftRight")]
-    LeftRight,
-    #[serde(rename = "topBottom")]
-    TopBottom,
-}
-
-impl std::default::Default for LiveBroadcastContentDetailsStereoLayout {
-    fn default() -> LiveBroadcastContentDetailsStereoLayout {
-        LiveBroadcastContentDetailsStereoLayout::Undefined
-    }
-}
-
-impl std::fmt::Display for LiveBroadcastContentDetailsStereoLayout {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            LiveBroadcastContentDetailsStereoLayout::Undefined => write!(f, "undefined"),
-            LiveBroadcastContentDetailsStereoLayout::StereoLayoutUnspecified => {
-                write!(f, "stereoLayoutUnspecified")
-            }
-            LiveBroadcastContentDetailsStereoLayout::Mono => write!(f, "mono"),
-            LiveBroadcastContentDetailsStereoLayout::LeftRight => write!(f, "leftRight"),
-            LiveBroadcastContentDetailsStereoLayout::TopBottom => write!(f, "topBottom"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum LiveBroadcastContentDetailsClosedCaptionsType {
-    Undefined,
-    #[serde(rename = "closedCaptionsTypeUnspecified")]
-    ClosedCaptionsTypeUnspecified,
-    #[serde(rename = "closedCaptionsDisabled")]
-    ClosedCaptionsDisabled,
-    #[serde(rename = "closedCaptionsHttpPost")]
-    ClosedCaptionsHttpPost,
-    #[serde(rename = "closedCaptionsEmbedded")]
-    ClosedCaptionsEmbedded,
-}
-
-impl std::default::Default for LiveBroadcastContentDetailsClosedCaptionsType {
-    fn default() -> LiveBroadcastContentDetailsClosedCaptionsType {
-        LiveBroadcastContentDetailsClosedCaptionsType::Undefined
-    }
-}
-
-impl std::fmt::Display for LiveBroadcastContentDetailsClosedCaptionsType {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            LiveBroadcastContentDetailsClosedCaptionsType::Undefined => write!(f, "undefined"),
-            LiveBroadcastContentDetailsClosedCaptionsType::ClosedCaptionsTypeUnspecified => {
-                write!(f, "closedCaptionsTypeUnspecified")
-            }
-            LiveBroadcastContentDetailsClosedCaptionsType::ClosedCaptionsDisabled => {
-                write!(f, "closedCaptionsDisabled")
-            }
-            LiveBroadcastContentDetailsClosedCaptionsType::ClosedCaptionsHttpPost => {
-                write!(f, "closedCaptionsHttpPost")
-            }
-            LiveBroadcastContentDetailsClosedCaptionsType::ClosedCaptionsEmbedded => {
-                write!(f, "closedCaptionsEmbedded")
-            }
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum LiveBroadcastContentDetailsLatencyPreference {
-    Undefined,
-    #[serde(rename = "latencyPreferenceUnspecified")]
-    LatencyPreferenceUnspecified,
-    /// Best for: highest quality viewer playbacks and higher resolutions.
-    #[serde(rename = "normal")]
-    Normal,
-    /// Best for: near real-time interaction, with minimal playback buffering.
-    #[serde(rename = "low")]
-    Low,
-    /// Best for: real-time interaction Does not support: Closed captions, 1440p, and 4k resolutions
-    #[serde(rename = "ultraLow")]
-    UltraLow,
-}
-
-impl std::default::Default for LiveBroadcastContentDetailsLatencyPreference {
-    fn default() -> LiveBroadcastContentDetailsLatencyPreference {
-        LiveBroadcastContentDetailsLatencyPreference::Undefined
-    }
-}
-
-impl std::fmt::Display for LiveBroadcastContentDetailsLatencyPreference {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            LiveBroadcastContentDetailsLatencyPreference::Undefined => write!(f, "undefined"),
-            LiveBroadcastContentDetailsLatencyPreference::LatencyPreferenceUnspecified => {
-                write!(f, "latencyPreferenceUnspecified")
-            }
-            LiveBroadcastContentDetailsLatencyPreference::Normal => write!(f, "normal"),
-            LiveBroadcastContentDetailsLatencyPreference::Low => write!(f, "low"),
-            LiveBroadcastContentDetailsLatencyPreference::UltraLow => write!(f, "ultraLow"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum LiveStreamHealthStatusStatus {
-    Undefined,
-    #[serde(rename = "good")]
-    Good,
-    #[serde(rename = "ok")]
-    Ok,
-    #[serde(rename = "bad")]
-    Bad,
-    #[serde(rename = "noData")]
-    NoData,
-    #[serde(rename = "revoked")]
-    Revoked,
-}
-
-impl std::default::Default for LiveStreamHealthStatusStatus {
-    fn default() -> LiveStreamHealthStatusStatus {
-        LiveStreamHealthStatusStatus::Undefined
-    }
-}
-
-impl std::fmt::Display for LiveStreamHealthStatusStatus {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            LiveStreamHealthStatusStatus::Undefined => write!(f, "undefined"),
-            LiveStreamHealthStatusStatus::Good => write!(f, "good"),
-            LiveStreamHealthStatusStatus::Ok => write!(f, "ok"),
-            LiveStreamHealthStatusStatus::Bad => write!(f, "bad"),
-            LiveStreamHealthStatusStatus::NoData => write!(f, "noData"),
-            LiveStreamHealthStatusStatus::Revoked => write!(f, "revoked"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum VideoStatusUploadStatus {
-    Undefined,
-    /// Video has been uploaded but not processed yet.
-    #[serde(rename = "uploaded")]
-    Uploaded,
-    /// Video has been successfully processed.
-    #[serde(rename = "processed")]
-    Processed,
-    /// Processing has failed. See FailureReason.
-    #[serde(rename = "failed")]
-    Failed,
-    /// Video has been rejected. See RejectionReason.
-    #[serde(rename = "rejected")]
-    Rejected,
-    /// Video has been deleted.
-    #[serde(rename = "deleted")]
-    Deleted,
-}
-
-impl std::default::Default for VideoStatusUploadStatus {
-    fn default() -> VideoStatusUploadStatus {
-        VideoStatusUploadStatus::Undefined
-    }
-}
-
-impl std::fmt::Display for VideoStatusUploadStatus {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            VideoStatusUploadStatus::Undefined => write!(f, "undefined"),
-            VideoStatusUploadStatus::Uploaded => write!(f, "uploaded"),
-            VideoStatusUploadStatus::Processed => write!(f, "processed"),
-            VideoStatusUploadStatus::Failed => write!(f, "failed"),
-            VideoStatusUploadStatus::Rejected => write!(f, "rejected"),
-            VideoStatusUploadStatus::Deleted => write!(f, "deleted"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum VideoStatusLicense {
-    Undefined,
-    #[serde(rename = "youtube")]
-    Youtube,
-    #[serde(rename = "creativeCommon")]
-    CreativeCommon,
-}
-
-impl std::default::Default for VideoStatusLicense {
-    fn default() -> VideoStatusLicense {
-        VideoStatusLicense::Undefined
-    }
-}
-
-impl std::fmt::Display for VideoStatusLicense {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            VideoStatusLicense::Undefined => write!(f, "undefined"),
-            VideoStatusLicense::Youtube => write!(f, "youtube"),
-            VideoStatusLicense::CreativeCommon => write!(f, "creativeCommon"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum VideoStatusRejectionReason {
-    Undefined,
-    /// Copyright infringement.
-    #[serde(rename = "copyright")]
-    Copyright,
-    /// Inappropriate video content.
-    #[serde(rename = "inappropriate")]
-    Inappropriate,
-    /// Duplicate upload in the same channel.
-    #[serde(rename = "duplicate")]
-    Duplicate,
-    /// Terms of use violation.
-    #[serde(rename = "termsOfUse")]
-    TermsOfUse,
-    /// Uploader account was suspended.
-    #[serde(rename = "uploaderAccountSuspended")]
-    UploaderAccountSuspended,
-    /// Video duration was too long.
-    #[serde(rename = "length")]
-    Length,
-    /// Blocked by content owner.
-    #[serde(rename = "claim")]
-    Claim,
-    /// Uploader closed his/her account.
-    #[serde(rename = "uploaderAccountClosed")]
-    UploaderAccountClosed,
-    /// Trademark infringement.
-    #[serde(rename = "trademark")]
-    Trademark,
-    /// An unspecified legal reason.
-    #[serde(rename = "legal")]
-    Legal,
-}
-
-impl std::default::Default for VideoStatusRejectionReason {
-    fn default() -> VideoStatusRejectionReason {
-        VideoStatusRejectionReason::Undefined
-    }
-}
-
-impl std::fmt::Display for VideoStatusRejectionReason {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            VideoStatusRejectionReason::Undefined => write!(f, "undefined"),
-            VideoStatusRejectionReason::Copyright => write!(f, "copyright"),
-            VideoStatusRejectionReason::Inappropriate => write!(f, "inappropriate"),
-            VideoStatusRejectionReason::Duplicate => write!(f, "duplicate"),
-            VideoStatusRejectionReason::TermsOfUse => write!(f, "termsOfUse"),
-            VideoStatusRejectionReason::UploaderAccountSuspended => {
-                write!(f, "uploaderAccountSuspended")
-            }
-            VideoStatusRejectionReason::Length => write!(f, "length"),
-            VideoStatusRejectionReason::Claim => write!(f, "claim"),
-            VideoStatusRejectionReason::UploaderAccountClosed => write!(f, "uploaderAccountClosed"),
-            VideoStatusRejectionReason::Trademark => write!(f, "trademark"),
-            VideoStatusRejectionReason::Legal => write!(f, "legal"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum VideoStatusPrivacyStatus {
-    Undefined,
-    #[serde(rename = "public")]
-    Public,
-    #[serde(rename = "unlisted")]
-    Unlisted,
-    #[serde(rename = "private")]
-    Private,
-}
-
-impl std::default::Default for VideoStatusPrivacyStatus {
-    fn default() -> VideoStatusPrivacyStatus {
-        VideoStatusPrivacyStatus::Undefined
-    }
-}
-
-impl std::fmt::Display for VideoStatusPrivacyStatus {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            VideoStatusPrivacyStatus::Undefined => write!(f, "undefined"),
-            VideoStatusPrivacyStatus::Public => write!(f, "public"),
-            VideoStatusPrivacyStatus::Unlisted => write!(f, "unlisted"),
-            VideoStatusPrivacyStatus::Private => write!(f, "private"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum VideoStatusFailureReason {
-    Undefined,
-    /// Unable to convert video content.
-    #[serde(rename = "conversion")]
-    Conversion,
-    /// Invalid file format.
-    #[serde(rename = "invalidFile")]
-    InvalidFile,
-    /// Empty file.
-    #[serde(rename = "emptyFile")]
-    EmptyFile,
-    /// File was too small.
-    #[serde(rename = "tooSmall")]
-    TooSmall,
-    /// Unsupported codec.
-    #[serde(rename = "codec")]
-    Codec,
-    /// Upload wasn't finished.
-    #[serde(rename = "uploadAborted")]
-    UploadAborted,
-}
-
-impl std::default::Default for VideoStatusFailureReason {
-    fn default() -> VideoStatusFailureReason {
-        VideoStatusFailureReason::Undefined
-    }
-}
-
-impl std::fmt::Display for VideoStatusFailureReason {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            VideoStatusFailureReason::Undefined => write!(f, "undefined"),
-            VideoStatusFailureReason::Conversion => write!(f, "conversion"),
-            VideoStatusFailureReason::InvalidFile => write!(f, "invalidFile"),
-            VideoStatusFailureReason::EmptyFile => write!(f, "emptyFile"),
-            VideoStatusFailureReason::TooSmall => write!(f, "tooSmall"),
-            VideoStatusFailureReason::Codec => write!(f, "codec"),
-            VideoStatusFailureReason::UploadAborted => write!(f, "uploadAborted"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum VideoContentDetailsCaption {
-    Undefined,
-    #[serde(rename = "true")]
-    True,
-    #[serde(rename = "false")]
-    False,
-}
-
-impl std::default::Default for VideoContentDetailsCaption {
-    fn default() -> VideoContentDetailsCaption {
-        VideoContentDetailsCaption::Undefined
-    }
-}
-
-impl std::fmt::Display for VideoContentDetailsCaption {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            VideoContentDetailsCaption::Undefined => write!(f, "undefined"),
-            VideoContentDetailsCaption::True => write!(f, "true"),
-            VideoContentDetailsCaption::False => write!(f, "false"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum VideoContentDetailsDefinition {
-    Undefined,
-    /// sd
-    #[serde(rename = "sd")]
-    Sd,
-    /// hd
-    #[serde(rename = "hd")]
-    Hd,
-}
-
-impl std::default::Default for VideoContentDetailsDefinition {
-    fn default() -> VideoContentDetailsDefinition {
-        VideoContentDetailsDefinition::Undefined
-    }
-}
-
-impl std::fmt::Display for VideoContentDetailsDefinition {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            VideoContentDetailsDefinition::Undefined => write!(f, "undefined"),
-            VideoContentDetailsDefinition::Sd => write!(f, "sd"),
-            VideoContentDetailsDefinition::Hd => write!(f, "hd"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum VideoContentDetailsProjection {
-    Undefined,
-    #[serde(rename = "rectangular")]
-    Rectangular,
-    #[serde(rename = "360")]
-    _360,
-}
-
-impl std::default::Default for VideoContentDetailsProjection {
-    fn default() -> VideoContentDetailsProjection {
-        VideoContentDetailsProjection::Undefined
-    }
-}
-
-impl std::fmt::Display for VideoContentDetailsProjection {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            VideoContentDetailsProjection::Undefined => write!(f, "undefined"),
-            VideoContentDetailsProjection::Rectangular => write!(f, "rectangular"),
-            VideoContentDetailsProjection::_360 => write!(f, "360"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum LiveStreamStatusStreamStatus {
-    Undefined,
-    #[serde(rename = "created")]
-    Created,
-    #[serde(rename = "ready")]
-    Ready,
-    #[serde(rename = "active")]
-    Active,
-    #[serde(rename = "inactive")]
-    Inactive,
-    #[serde(rename = "error")]
-    Error,
-}
-
-impl std::default::Default for LiveStreamStatusStreamStatus {
-    fn default() -> LiveStreamStatusStreamStatus {
-        LiveStreamStatusStreamStatus::Undefined
-    }
-}
-
-impl std::fmt::Display for LiveStreamStatusStreamStatus {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            LiveStreamStatusStreamStatus::Undefined => write!(f, "undefined"),
-            LiveStreamStatusStreamStatus::Created => write!(f, "created"),
-            LiveStreamStatusStreamStatus::Ready => write!(f, "ready"),
-            LiveStreamStatusStreamStatus::Active => write!(f, "active"),
-            LiveStreamStatusStreamStatus::Inactive => write!(f, "inactive"),
-            LiveStreamStatusStreamStatus::Error => write!(f, "error"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum CaptionSnippetFailureReason {
-    Undefined,
-    #[serde(rename = "unknownFormat")]
-    UnknownFormat,
-    #[serde(rename = "unsupportedFormat")]
-    UnsupportedFormat,
-    #[serde(rename = "processingFailed")]
-    ProcessingFailed,
-}
-
-impl std::default::Default for CaptionSnippetFailureReason {
-    fn default() -> CaptionSnippetFailureReason {
-        CaptionSnippetFailureReason::Undefined
-    }
-}
-
-impl std::fmt::Display for CaptionSnippetFailureReason {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            CaptionSnippetFailureReason::Undefined => write!(f, "undefined"),
-            CaptionSnippetFailureReason::UnknownFormat => write!(f, "unknownFormat"),
-            CaptionSnippetFailureReason::UnsupportedFormat => write!(f, "unsupportedFormat"),
-            CaptionSnippetFailureReason::ProcessingFailed => write!(f, "processingFailed"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum CaptionSnippetTrackKind {
-    Undefined,
-    #[serde(rename = "standard")]
-    Standard,
-    #[serde(rename = "ASR")]
-    ASR,
-    #[serde(rename = "forced")]
-    Forced,
-}
-
-impl std::default::Default for CaptionSnippetTrackKind {
-    fn default() -> CaptionSnippetTrackKind {
-        CaptionSnippetTrackKind::Undefined
-    }
-}
-
-impl std::fmt::Display for CaptionSnippetTrackKind {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            CaptionSnippetTrackKind::Undefined => write!(f, "undefined"),
-            CaptionSnippetTrackKind::Standard => write!(f, "standard"),
-            CaptionSnippetTrackKind::ASR => write!(f, "ASR"),
-            CaptionSnippetTrackKind::Forced => write!(f, "forced"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum CaptionSnippetStatus {
-    Undefined,
-    #[serde(rename = "serving")]
-    Serving,
-    #[serde(rename = "syncing")]
-    Syncing,
-    #[serde(rename = "failed")]
-    Failed,
-}
-
-impl std::default::Default for CaptionSnippetStatus {
-    fn default() -> CaptionSnippetStatus {
-        CaptionSnippetStatus::Undefined
-    }
-}
-
-impl std::fmt::Display for CaptionSnippetStatus {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            CaptionSnippetStatus::Undefined => write!(f, "undefined"),
-            CaptionSnippetStatus::Serving => write!(f, "serving"),
-            CaptionSnippetStatus::Syncing => write!(f, "syncing"),
-            CaptionSnippetStatus::Failed => write!(f, "failed"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum CaptionSnippetAudioTrackType {
-    Undefined,
-    #[serde(rename = "unknown")]
-    Unknown,
-    #[serde(rename = "primary")]
-    Primary,
-    #[serde(rename = "commentary")]
-    Commentary,
-    #[serde(rename = "descriptive")]
-    Descriptive,
-}
-
-impl std::default::Default for CaptionSnippetAudioTrackType {
-    fn default() -> CaptionSnippetAudioTrackType {
-        CaptionSnippetAudioTrackType::Undefined
-    }
-}
-
-impl std::fmt::Display for CaptionSnippetAudioTrackType {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            CaptionSnippetAudioTrackType::Undefined => write!(f, "undefined"),
-            CaptionSnippetAudioTrackType::Unknown => write!(f, "unknown"),
-            CaptionSnippetAudioTrackType::Primary => write!(f, "primary"),
-            CaptionSnippetAudioTrackType::Commentary => write!(f, "commentary"),
-            CaptionSnippetAudioTrackType::Descriptive => write!(f, "descriptive"),
+    /// A list of keyword tags associated with the video. Tags may contain spaces.
+    #[serde(rename = "tags")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub tags: Option<Vec<String>>,
+    #[serde(rename = "thumbnails")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub thumbnails: Option<ThumbnailDetails>,
+    /// 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>,
+}
+
+/// 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 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 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 times the video has been viewed.
+    #[serde(rename = "viewCount")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub view_count: Option<String>,
+}
+
+/// Basic details about a video category, such as its localized title. Next Id: 17
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct VideoStatus {
+    /// This value indicates if the 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<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>,
+    /// The video's privacy status.
+    #[serde(rename = "privacyStatus")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub privacy_status: Option<VideoStatusPrivacyStatus>,
+    /// This value indicates if the extended video statistics on the watch page can be viewed by everyone. Note that the view count, likes, etc will still be visible if this is disabled. @mutable youtube.videos.insert youtube.videos.update
+    #[serde(rename = "publicStatsViewable")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub public_stats_viewable: Option<bool>,
+    /// DateTime: The date and time when the video is scheduled to publish. It can be set only if the privacy status of the video is private..
+    #[serde(rename = "publishAt")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub publish_at: Option<DateTime<Utc>>,
+    /// This value explains why YouTube rejected an uploaded video. This property is only present if the uploadStatus property indicates that the upload was rejected.
+    #[serde(rename = "rejectionReason")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub rejection_reason: Option<VideoStatusRejectionReason>,
+    #[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>,
+}
+
+/// Specifies suggestions on how to improve video content, including encoding hints, tag suggestions, and editor suggestions.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct VideoSuggestions {
+    /// A list of video editing operations that might improve the video quality or playback experience of the uploaded video.
+    #[serde(rename = "editorSuggestions")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub editor_suggestions: Option<Vec<VideoSuggestionsEditorSuggestions>>,
+    /// A list of errors that will prevent YouTube from successfully processing the uploaded video video. These errors indicate that, regardless of the video's current processing status, eventually, that status will almost certainly be failed.
+    #[serde(rename = "processingErrors")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub processing_errors: Option<Vec<VideoSuggestionsProcessingErrors>>,
+    /// A list of suggestions that may improve YouTube's ability to process the video.
+    #[serde(rename = "processingHints")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub processing_hints: Option<Vec<VideoSuggestionsProcessingHints>>,
+    /// A list of reasons why YouTube may have difficulty transcoding the uploaded video or that might result in an erroneous transcoding. These warnings are generated before YouTube actually processes the uploaded video file. In addition, they identify issues that are unlikely to cause the video processing to fail but that might cause problems such as sync issues, video artifacts, or a missing audio track.
+    #[serde(rename = "processingWarnings")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub processing_warnings: Option<Vec<VideoSuggestionsProcessingWarnings>>,
+    /// A list of keyword tags that could be added to the video's metadata to increase the likelihood that users will locate your video when searching or browsing on YouTube.
+    #[serde(rename = "tagSuggestions")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub tag_suggestions: Option<Vec<VideoSuggestionsTagSuggestion>>,
+}
+
+/// A single tag suggestion with it's relevance information.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct VideoSuggestionsTagSuggestion {
+    /// A set of video categories for which the tag is relevant. You can use this information to display appropriate tag suggestions based on the video category that the video uploader associates with the video. By default, tag suggestions are relevant for all categories if there are no restricts defined for the keyword.
+    #[serde(rename = "categoryRestricts")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub category_restricts: Option<Vec<String>>,
+    /// The keyword tag suggested for the video.
+    #[serde(rename = "tag")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub tag: Option<String>,
+}
+
+/// Freebase topic information related to the video.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct VideoTopicDetails {
+    /// 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 Wikipedia URLs that provide a high-level description of the video's content.
+    #[serde(rename = "topicCategories")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub topic_categories: Option<Vec<String>>,
+    /// A list of Freebase topic IDs that are centrally associated with the video. These are topics that are centrally featured in the video, and it can be said that the video is mainly about each of these. You can retrieve information about each topic using the < a href="http://wiki.freebase.com/wiki/Topic_API">Freebase Topic API.
+    #[serde(rename = "topicIds")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub topic_ids: Option<Vec<String>>,
+}
+
+/// 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>,
+}
+
+#[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(())
     }
@@ -5365,94 +4507,508 @@
 }
 
 #[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ThirdPartyLinkStatusLinkStatus {
-    Undefined,
+pub enum ActivityContentDetailsSocialType {
+    Undefined,
+    #[serde(rename = "facebook")]
+    Facebook,
+    #[serde(rename = "googlePlus")]
+    GooglePlus,
+    #[serde(rename = "twitter")]
+    Twitter,
+    #[serde(rename = "typeUnspecified")]
+    TypeUnspecified,
+}
+
+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::Facebook => write!(f, "facebook"),
+            ActivityContentDetailsSocialType::GooglePlus => write!(f, "googlePlus"),
+            ActivityContentDetailsSocialType::Twitter => write!(f, "twitter"),
+            ActivityContentDetailsSocialType::TypeUnspecified => write!(f, "typeUnspecified"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ActivitySnippetType {
+    Undefined,
+    #[serde(rename = "bulletin")]
+    Bulletin,
+    #[serde(rename = "channelItem")]
+    ChannelItem,
+    #[serde(rename = "comment")]
+    Comment,
+    #[serde(rename = "favorite")]
+    Favorite,
+    #[serde(rename = "like")]
+    Like,
+    #[serde(rename = "playlistItem")]
+    PlaylistItem,
+    #[serde(rename = "promotedItem")]
+    PromotedItem,
+    #[serde(rename = "recommendation")]
+    Recommendation,
+    #[serde(rename = "social")]
+    Social,
+    #[serde(rename = "subscription")]
+    Subscription,
+    #[serde(rename = "typeUnspecified")]
+    TypeUnspecified,
+    #[serde(rename = "upload")]
+    Upload,
+}
+
+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::Bulletin => write!(f, "bulletin"),
+            ActivitySnippetType::ChannelItem => write!(f, "channelItem"),
+            ActivitySnippetType::Comment => write!(f, "comment"),
+            ActivitySnippetType::Favorite => write!(f, "favorite"),
+            ActivitySnippetType::Like => write!(f, "like"),
+            ActivitySnippetType::PlaylistItem => write!(f, "playlistItem"),
+            ActivitySnippetType::PromotedItem => write!(f, "promotedItem"),
+            ActivitySnippetType::Recommendation => write!(f, "recommendation"),
+            ActivitySnippetType::Social => write!(f, "social"),
+            ActivitySnippetType::Subscription => write!(f, "subscription"),
+            ActivitySnippetType::TypeUnspecified => write!(f, "typeUnspecified"),
+            ActivitySnippetType::Upload => write!(f, "upload"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum CaptionSnippetAudioTrackType {
+    Undefined,
+    #[serde(rename = "commentary")]
+    Commentary,
+    #[serde(rename = "descriptive")]
+    Descriptive,
+    #[serde(rename = "primary")]
+    Primary,
     #[serde(rename = "unknown")]
     Unknown,
+}
+
+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::Commentary => write!(f, "commentary"),
+            CaptionSnippetAudioTrackType::Descriptive => write!(f, "descriptive"),
+            CaptionSnippetAudioTrackType::Primary => write!(f, "primary"),
+            CaptionSnippetAudioTrackType::Unknown => write!(f, "unknown"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum CaptionSnippetFailureReason {
+    Undefined,
+    #[serde(rename = "processingFailed")]
+    ProcessingFailed,
+    #[serde(rename = "unknownFormat")]
+    UnknownFormat,
+    #[serde(rename = "unsupportedFormat")]
+    UnsupportedFormat,
+}
+
+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::ProcessingFailed => write!(f, "processingFailed"),
+            CaptionSnippetFailureReason::UnknownFormat => write!(f, "unknownFormat"),
+            CaptionSnippetFailureReason::UnsupportedFormat => write!(f, "unsupportedFormat"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum CaptionSnippetStatus {
+    Undefined,
     #[serde(rename = "failed")]
     Failed,
-    #[serde(rename = "pending")]
-    Pending,
-    #[serde(rename = "linked")]
-    Linked,
-}
-
-impl std::default::Default for ThirdPartyLinkStatusLinkStatus {
-    fn default() -> ThirdPartyLinkStatusLinkStatus {
-        ThirdPartyLinkStatusLinkStatus::Undefined
-    }
-}
-
-impl std::fmt::Display for ThirdPartyLinkStatusLinkStatus {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ThirdPartyLinkStatusLinkStatus::Undefined => write!(f, "undefined"),
-            ThirdPartyLinkStatusLinkStatus::Unknown => write!(f, "unknown"),
-            ThirdPartyLinkStatusLinkStatus::Failed => write!(f, "failed"),
-            ThirdPartyLinkStatusLinkStatus::Pending => write!(f, "pending"),
-            ThirdPartyLinkStatusLinkStatus::Linked => write!(f, "linked"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum SubscriptionContentDetailsActivityType {
-    Undefined,
-    #[serde(rename = "subscriptionActivityTypeUnspecified")]
-    SubscriptionActivityTypeUnspecified,
-    #[serde(rename = "all")]
-    All,
-    #[serde(rename = "uploads")]
-    Uploads,
-}
-
-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 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"),
+    #[serde(rename = "serving")]
+    Serving,
+    #[serde(rename = "syncing")]
+    Syncing,
+}
+
+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::Failed => write!(f, "failed"),
+            CaptionSnippetStatus::Serving => write!(f, "serving"),
+            CaptionSnippetStatus::Syncing => write!(f, "syncing"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum CaptionSnippetTrackKind {
+    Undefined,
+    #[serde(rename = "ASR")]
+    ASR,
+    #[serde(rename = "forced")]
+    Forced,
+    #[serde(rename = "standard")]
+    Standard,
+}
+
+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::ASR => write!(f, "ASR"),
+            CaptionSnippetTrackKind::Forced => write!(f, "forced"),
+            CaptionSnippetTrackKind::Standard => write!(f, "standard"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum CdnSettingsFrameRate {
+    Undefined,
+    #[serde(rename = "30fps")]
+    _30fps,
+    #[serde(rename = "60fps")]
+    _60fps,
+    #[serde(rename = "variable")]
+    Variable,
+}
+
+impl std::default::Default for CdnSettingsFrameRate {
+    fn default() -> CdnSettingsFrameRate {
+        CdnSettingsFrameRate::Undefined
+    }
+}
+
+impl std::fmt::Display for CdnSettingsFrameRate {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            CdnSettingsFrameRate::Undefined => write!(f, "undefined"),
+            CdnSettingsFrameRate::_30fps => write!(f, "30fps"),
+            CdnSettingsFrameRate::_60fps => write!(f, "60fps"),
+            CdnSettingsFrameRate::Variable => write!(f, "variable"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum CdnSettingsIngestionType {
+    Undefined,
+    #[serde(rename = "dash")]
+    Dash,
+    #[serde(rename = "hls")]
+    Hls,
+    #[serde(rename = "rtmp")]
+    Rtmp,
+    #[serde(rename = "webrtc")]
+    Webrtc,
+}
+
+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::Dash => write!(f, "dash"),
+            CdnSettingsIngestionType::Hls => write!(f, "hls"),
+            CdnSettingsIngestionType::Rtmp => write!(f, "rtmp"),
+            CdnSettingsIngestionType::Webrtc => write!(f, "webrtc"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum CdnSettingsResolution {
+    Undefined,
+    #[serde(rename = "1080p")]
+    _1080p,
+    #[serde(rename = "1440p")]
+    _1440p,
+    #[serde(rename = "2160p")]
+    _2160p,
+    #[serde(rename = "240p")]
+    _240p,
+    #[serde(rename = "360p")]
+    _360p,
+    #[serde(rename = "480p")]
+    _480p,
+    #[serde(rename = "720p")]
+    _720p,
+    #[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::_1080p => write!(f, "1080p"),
+            CdnSettingsResolution::_1440p => write!(f, "1440p"),
+            CdnSettingsResolution::_2160p => write!(f, "2160p"),
+            CdnSettingsResolution::_240p => write!(f, "240p"),
+            CdnSettingsResolution::_360p => write!(f, "360p"),
+            CdnSettingsResolution::_480p => write!(f, "480p"),
+            CdnSettingsResolution::_720p => write!(f, "720p"),
+            CdnSettingsResolution::Variable => write!(f, "variable"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ChannelConversionPingContext {
+    Undefined,
+    #[serde(rename = "cview")]
+    Cview,
+    #[serde(rename = "subscribe")]
+    Subscribe,
+    #[serde(rename = "unsubscribe")]
+    Unsubscribe,
+}
+
+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::Cview => write!(f, "cview"),
+            ChannelConversionPingContext::Subscribe => write!(f, "subscribe"),
+            ChannelConversionPingContext::Unsubscribe => write!(f, "unsubscribe"),
+        };
+        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 = "allPlaylists")]
+    AllPlaylists,
+    #[serde(rename = "channelsectionTypeUnspecified")]
+    ChannelsectionTypeUnspecified,
+    #[serde(rename = "completedEvents")]
+    CompletedEvents,
+    #[serde(rename = "likedPlaylists")]
+    LikedPlaylists,
+    #[serde(rename = "likes")]
+    Likes,
+    #[serde(rename = "liveEvents")]
+    LiveEvents,
+    #[serde(rename = "multipleChannels")]
+    MultipleChannels,
+    #[serde(rename = "multiplePlaylists")]
+    MultiplePlaylists,
+    #[serde(rename = "popularUploads")]
+    PopularUploads,
+    #[serde(rename = "postedPlaylists")]
+    PostedPlaylists,
+    #[serde(rename = "postedVideos")]
+    PostedVideos,
+    #[serde(rename = "recentActivity")]
+    RecentActivity,
+    #[serde(rename = "recentPosts")]
+    RecentPosts,
+    #[serde(rename = "recentUploads")]
+    RecentUploads,
+    #[serde(rename = "singlePlaylist")]
+    SinglePlaylist,
+    #[serde(rename = "subscriptions")]
+    Subscriptions,
+    #[serde(rename = "upcomingEvents")]
+    UpcomingEvents,
+}
+
+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::AllPlaylists => write!(f, "allPlaylists"),
+            ChannelSectionSnippetType::ChannelsectionTypeUnspecified => {
+                write!(f, "channelsectionTypeUnspecified")
+            }
+            ChannelSectionSnippetType::CompletedEvents => write!(f, "completedEvents"),
+            ChannelSectionSnippetType::LikedPlaylists => write!(f, "likedPlaylists"),
+            ChannelSectionSnippetType::Likes => write!(f, "likes"),
+            ChannelSectionSnippetType::LiveEvents => write!(f, "liveEvents"),
+            ChannelSectionSnippetType::MultipleChannels => write!(f, "multipleChannels"),
+            ChannelSectionSnippetType::MultiplePlaylists => write!(f, "multiplePlaylists"),
+            ChannelSectionSnippetType::PopularUploads => write!(f, "popularUploads"),
+            ChannelSectionSnippetType::PostedPlaylists => write!(f, "postedPlaylists"),
+            ChannelSectionSnippetType::PostedVideos => write!(f, "postedVideos"),
+            ChannelSectionSnippetType::RecentActivity => write!(f, "recentActivity"),
+            ChannelSectionSnippetType::RecentPosts => write!(f, "recentPosts"),
+            ChannelSectionSnippetType::RecentUploads => write!(f, "recentUploads"),
+            ChannelSectionSnippetType::SinglePlaylist => write!(f, "singlePlaylist"),
+            ChannelSectionSnippetType::Subscriptions => write!(f, "subscriptions"),
+            ChannelSectionSnippetType::UpcomingEvents => write!(f, "upcomingEvents"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ChannelStatusLongUploadsStatus {
+    Undefined,
+    #[serde(rename = "allowed")]
+    Allowed,
+    #[serde(rename = "disallowed")]
+    Disallowed,
+    #[serde(rename = "eligible")]
+    Eligible,
+    #[serde(rename = "longUploadsUnspecified")]
+    LongUploadsUnspecified,
+}
+
+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::Allowed => write!(f, "allowed"),
+            ChannelStatusLongUploadsStatus::Disallowed => write!(f, "disallowed"),
+            ChannelStatusLongUploadsStatus::Eligible => write!(f, "eligible"),
+            ChannelStatusLongUploadsStatus::LongUploadsUnspecified => {
+                write!(f, "longUploadsUnspecified")
+            }
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ChannelStatusPrivacyStatus {
+    Undefined,
+    #[serde(rename = "private")]
+    Private,
+    #[serde(rename = "public")]
+    Public,
+    #[serde(rename = "unlisted")]
+    Unlisted,
+}
+
+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::Private => write!(f, "private"),
+            ChannelStatusPrivacyStatus::Public => write!(f, "public"),
+            ChannelStatusPrivacyStatus::Unlisted => write!(f, "unlisted"),
         };
         Ok(())
     }
@@ -5462,13 +5018,13 @@
 pub enum CommentSnippetModerationStatus {
     Undefined,
     /// The comment is available for public display.
+    #[serde(rename = "heldForReview")]
+    HeldForReview,
+    /// The comment is awaiting review by a moderator.
+    #[serde(rename = "likelySpam")]
+    LikelySpam,
     #[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,
@@ -5484,9 +5040,9 @@
     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::Published => write!(f, "published"),
             CommentSnippetModerationStatus::Rejected => write!(f, "rejected"),
         };
         Ok(())
@@ -5494,171 +5050,4005 @@
 }
 
 #[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum SearchResultSnippetLiveBroadcastContent {
-    Undefined,
-    #[serde(rename = "none")]
-    None,
-    /// The live broadcast is upcoming.
-    #[serde(rename = "upcoming")]
-    Upcoming,
-    /// The live broadcast is active.
-    #[serde(rename = "live")]
-    Live,
-    /// The live broadcast has been completed.
-    #[serde(rename = "completed")]
-    Completed,
-}
-
-impl std::default::Default for SearchResultSnippetLiveBroadcastContent {
-    fn default() -> SearchResultSnippetLiveBroadcastContent {
-        SearchResultSnippetLiveBroadcastContent::Undefined
-    }
-}
-
-impl std::fmt::Display for SearchResultSnippetLiveBroadcastContent {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            SearchResultSnippetLiveBroadcastContent::Undefined => write!(f, "undefined"),
-            SearchResultSnippetLiveBroadcastContent::None => write!(f, "none"),
-            SearchResultSnippetLiveBroadcastContent::Upcoming => write!(f, "upcoming"),
-            SearchResultSnippetLiveBroadcastContent::Live => write!(f, "live"),
-            SearchResultSnippetLiveBroadcastContent::Completed => write!(f, "completed"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum VideoProcessingDetailsProcessingStatus {
-    Undefined,
-    #[serde(rename = "processing")]
-    Processing,
-    #[serde(rename = "succeeded")]
-    Succeeded,
-    #[serde(rename = "failed")]
-    Failed,
-    #[serde(rename = "terminated")]
-    Terminated,
-}
-
-impl std::default::Default for VideoProcessingDetailsProcessingStatus {
-    fn default() -> VideoProcessingDetailsProcessingStatus {
-        VideoProcessingDetailsProcessingStatus::Undefined
-    }
-}
-
-impl std::fmt::Display for VideoProcessingDetailsProcessingStatus {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            VideoProcessingDetailsProcessingStatus::Undefined => write!(f, "undefined"),
-            VideoProcessingDetailsProcessingStatus::Processing => write!(f, "processing"),
-            VideoProcessingDetailsProcessingStatus::Succeeded => write!(f, "succeeded"),
-            VideoProcessingDetailsProcessingStatus::Failed => write!(f, "failed"),
-            VideoProcessingDetailsProcessingStatus::Terminated => write!(f, "terminated"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum VideoProcessingDetailsProcessingFailureReason {
-    Undefined,
-    #[serde(rename = "uploadFailed")]
-    UploadFailed,
-    #[serde(rename = "transcodeFailed")]
-    TranscodeFailed,
-    #[serde(rename = "streamingFailed")]
-    StreamingFailed,
-    #[serde(rename = "other")]
-    Other,
-}
-
-impl std::default::Default for VideoProcessingDetailsProcessingFailureReason {
-    fn default() -> VideoProcessingDetailsProcessingFailureReason {
-        VideoProcessingDetailsProcessingFailureReason::Undefined
-    }
-}
-
-impl std::fmt::Display for VideoProcessingDetailsProcessingFailureReason {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            VideoProcessingDetailsProcessingFailureReason::Undefined => write!(f, "undefined"),
-            VideoProcessingDetailsProcessingFailureReason::UploadFailed => {
-                write!(f, "uploadFailed")
-            }
-            VideoProcessingDetailsProcessingFailureReason::TranscodeFailed => {
-                write!(f, "transcodeFailed")
-            }
-            VideoProcessingDetailsProcessingFailureReason::StreamingFailed => {
-                write!(f, "streamingFailed")
-            }
-            VideoProcessingDetailsProcessingFailureReason::Other => write!(f, "other"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum VideoRatingRating {
-    Undefined,
-    #[serde(rename = "none")]
-    None,
+pub enum CommentSnippetViewerRating {
+    Undefined,
+    #[serde(rename = "dislike")]
+    Dislike,
     /// The entity is liked.
     #[serde(rename = "like")]
     Like,
     /// The entity is disliked.
-    #[serde(rename = "dislike")]
-    Dislike,
-}
-
-impl std::default::Default for VideoRatingRating {
-    fn default() -> VideoRatingRating {
-        VideoRatingRating::Undefined
-    }
-}
-
-impl std::fmt::Display for VideoRatingRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            VideoRatingRating::Undefined => write!(f, "undefined"),
-            VideoRatingRating::None => write!(f, "none"),
-            VideoRatingRating::Like => write!(f, "like"),
-            VideoRatingRating::Dislike => write!(f, "dislike"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum VideoFileDetailsVideoStreamRotation {
-    Undefined,
     #[serde(rename = "none")]
     None,
-    #[serde(rename = "clockwise")]
-    Clockwise,
-    #[serde(rename = "upsideDown")]
-    UpsideDown,
-    #[serde(rename = "counterClockwise")]
-    CounterClockwise,
-    #[serde(rename = "other")]
-    Other,
-}
-
-impl std::default::Default for VideoFileDetailsVideoStreamRotation {
-    fn default() -> VideoFileDetailsVideoStreamRotation {
-        VideoFileDetailsVideoStreamRotation::Undefined
-    }
-}
-
-impl std::fmt::Display for VideoFileDetailsVideoStreamRotation {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            VideoFileDetailsVideoStreamRotation::Undefined => write!(f, "undefined"),
-            VideoFileDetailsVideoStreamRotation::None => write!(f, "none"),
-            VideoFileDetailsVideoStreamRotation::Clockwise => write!(f, "clockwise"),
-            VideoFileDetailsVideoStreamRotation::UpsideDown => write!(f, "upsideDown"),
-            VideoFileDetailsVideoStreamRotation::CounterClockwise => write!(f, "counterClockwise"),
-            VideoFileDetailsVideoStreamRotation::Other => write!(f, "other"),
+}
+
+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::Dislike => write!(f, "dislike"),
+            CommentSnippetViewerRating::Like => write!(f, "like"),
+            CommentSnippetViewerRating::None => write!(f, "none"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingAcbRating {
+    Undefined,
+    #[serde(rename = "acbC")]
+    AcbC,
+    /// 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 = "acbG")]
+    AcbG,
+    /// 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 = "acbM")]
+    AcbM,
+    /// G
+    #[serde(rename = "acbMa15plus")]
+    AcbMa15plus,
+    /// PG
+    #[serde(rename = "acbP")]
+    AcbP,
+    /// M
+    #[serde(rename = "acbPg")]
+    AcbPg,
+    /// MA15+
+    #[serde(rename = "acbR18plus")]
+    AcbR18plus,
+    /// R18+
+    #[serde(rename = "acbUnrated")]
+    AcbUnrated,
+    #[serde(rename = "acbUnspecified")]
+    AcbUnspecified,
+}
+
+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::AcbC => write!(f, "acbC"),
+            ContentRatingAcbRating::AcbE => write!(f, "acbE"),
+            ContentRatingAcbRating::AcbG => write!(f, "acbG"),
+            ContentRatingAcbRating::AcbM => write!(f, "acbM"),
+            ContentRatingAcbRating::AcbMa15plus => write!(f, "acbMa15plus"),
+            ContentRatingAcbRating::AcbP => write!(f, "acbP"),
+            ContentRatingAcbRating::AcbPg => write!(f, "acbPg"),
+            ContentRatingAcbRating::AcbR18plus => write!(f, "acbR18plus"),
+            ContentRatingAcbRating::AcbUnrated => write!(f, "acbUnrated"),
+            ContentRatingAcbRating::AcbUnspecified => write!(f, "acbUnspecified"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingAgcomRating {
+    Undefined,
+    #[serde(rename = "agcomT")]
+    AgcomT,
+    /// T
+    #[serde(rename = "agcomUnrated")]
+    AgcomUnrated,
+    /// VM14
+    #[serde(rename = "agcomUnspecified")]
+    AgcomUnspecified,
+    /// VM18
+    #[serde(rename = "agcomVm14")]
+    AgcomVm14,
+    #[serde(rename = "agcomVm18")]
+    AgcomVm18,
+}
+
+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::AgcomT => write!(f, "agcomT"),
+            ContentRatingAgcomRating::AgcomUnrated => write!(f, "agcomUnrated"),
+            ContentRatingAgcomRating::AgcomUnspecified => write!(f, "agcomUnspecified"),
+            ContentRatingAgcomRating::AgcomVm14 => write!(f, "agcomVm14"),
+            ContentRatingAgcomRating::AgcomVm18 => write!(f, "agcomVm18"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingAnatelRating {
+    Undefined,
+    #[serde(rename = "anatelA")]
+    AnatelA,
+    /// F
+    #[serde(rename = "anatelF")]
+    AnatelF,
+    /// I
+    #[serde(rename = "anatelI")]
+    AnatelI,
+    /// I-7
+    #[serde(rename = "anatelI10")]
+    AnatelI10,
+    /// I-10
+    #[serde(rename = "anatelI12")]
+    AnatelI12,
+    /// I-12
+    #[serde(rename = "anatelI7")]
+    AnatelI7,
+    /// R
+    #[serde(rename = "anatelR")]
+    AnatelR,
+    /// A
+    #[serde(rename = "anatelUnrated")]
+    AnatelUnrated,
+    #[serde(rename = "anatelUnspecified")]
+    AnatelUnspecified,
+}
+
+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::AnatelA => write!(f, "anatelA"),
+            ContentRatingAnatelRating::AnatelF => write!(f, "anatelF"),
+            ContentRatingAnatelRating::AnatelI => write!(f, "anatelI"),
+            ContentRatingAnatelRating::AnatelI10 => write!(f, "anatelI10"),
+            ContentRatingAnatelRating::AnatelI12 => write!(f, "anatelI12"),
+            ContentRatingAnatelRating::AnatelI7 => write!(f, "anatelI7"),
+            ContentRatingAnatelRating::AnatelR => write!(f, "anatelR"),
+            ContentRatingAnatelRating::AnatelUnrated => write!(f, "anatelUnrated"),
+            ContentRatingAnatelRating::AnatelUnspecified => write!(f, "anatelUnspecified"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingBbfcRating {
+    Undefined,
+    #[serde(rename = "bbfc12")]
+    Bbfc12,
+    /// U
+    #[serde(rename = "bbfc12a")]
+    Bbfc12a,
+    /// PG
+    #[serde(rename = "bbfc15")]
+    Bbfc15,
+    /// 12A
+    #[serde(rename = "bbfc18")]
+    Bbfc18,
+    /// 12
+    #[serde(rename = "bbfcPg")]
+    BbfcPg,
+    /// 15
+    #[serde(rename = "bbfcR18")]
+    BbfcR18,
+    /// 18
+    #[serde(rename = "bbfcU")]
+    BbfcU,
+    /// R18
+    #[serde(rename = "bbfcUnrated")]
+    BbfcUnrated,
+    #[serde(rename = "bbfcUnspecified")]
+    BbfcUnspecified,
+}
+
+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::Bbfc12 => write!(f, "bbfc12"),
+            ContentRatingBbfcRating::Bbfc12a => write!(f, "bbfc12a"),
+            ContentRatingBbfcRating::Bbfc15 => write!(f, "bbfc15"),
+            ContentRatingBbfcRating::Bbfc18 => write!(f, "bbfc18"),
+            ContentRatingBbfcRating::BbfcPg => write!(f, "bbfcPg"),
+            ContentRatingBbfcRating::BbfcR18 => write!(f, "bbfcR18"),
+            ContentRatingBbfcRating::BbfcU => write!(f, "bbfcU"),
+            ContentRatingBbfcRating::BbfcUnrated => write!(f, "bbfcUnrated"),
+            ContentRatingBbfcRating::BbfcUnspecified => write!(f, "bbfcUnspecified"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingBfvcRating {
+    Undefined,
+    #[serde(rename = "bfvc13")]
+    Bfvc13,
+    /// G
+    #[serde(rename = "bfvc15")]
+    Bfvc15,
+    /// E
+    #[serde(rename = "bfvc18")]
+    Bfvc18,
+    /// 13
+    #[serde(rename = "bfvc20")]
+    Bfvc20,
+    /// 15
+    #[serde(rename = "bfvcB")]
+    BfvcB,
+    /// 18
+    #[serde(rename = "bfvcE")]
+    BfvcE,
+    /// 20
+    #[serde(rename = "bfvcG")]
+    BfvcG,
+    /// B
+    #[serde(rename = "bfvcUnrated")]
+    BfvcUnrated,
+    #[serde(rename = "bfvcUnspecified")]
+    BfvcUnspecified,
+}
+
+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::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::BfvcE => write!(f, "bfvcE"),
+            ContentRatingBfvcRating::BfvcG => write!(f, "bfvcG"),
+            ContentRatingBfvcRating::BfvcUnrated => write!(f, "bfvcUnrated"),
+            ContentRatingBfvcRating::BfvcUnspecified => write!(f, "bfvcUnspecified"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingBmukkRating {
+    Undefined,
+    #[serde(rename = "bmukk10")]
+    Bmukk10,
+    /// Unrestricted
+    #[serde(rename = "bmukk12")]
+    Bmukk12,
+    /// 6+
+    #[serde(rename = "bmukk14")]
+    Bmukk14,
+    /// 8+
+    #[serde(rename = "bmukk16")]
+    Bmukk16,
+    /// 10+
+    #[serde(rename = "bmukk6")]
+    Bmukk6,
+    /// 12+
+    #[serde(rename = "bmukk8")]
+    Bmukk8,
+    /// 14+
+    #[serde(rename = "bmukkAa")]
+    BmukkAa,
+    /// 16+
+    #[serde(rename = "bmukkUnrated")]
+    BmukkUnrated,
+    #[serde(rename = "bmukkUnspecified")]
+    BmukkUnspecified,
+}
+
+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::Bmukk10 => write!(f, "bmukk10"),
+            ContentRatingBmukkRating::Bmukk12 => write!(f, "bmukk12"),
+            ContentRatingBmukkRating::Bmukk14 => write!(f, "bmukk14"),
+            ContentRatingBmukkRating::Bmukk16 => write!(f, "bmukk16"),
+            ContentRatingBmukkRating::Bmukk6 => write!(f, "bmukk6"),
+            ContentRatingBmukkRating::Bmukk8 => write!(f, "bmukk8"),
+            ContentRatingBmukkRating::BmukkAa => write!(f, "bmukkAa"),
+            ContentRatingBmukkRating::BmukkUnrated => write!(f, "bmukkUnrated"),
+            ContentRatingBmukkRating::BmukkUnspecified => write!(f, "bmukkUnspecified"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingCatvRating {
+    Undefined,
+    #[serde(rename = "catv14plus")]
+    Catv14plus,
+    /// C
+    #[serde(rename = "catv18plus")]
+    Catv18plus,
+    /// C8
+    #[serde(rename = "catvC")]
+    CatvC,
+    /// G
+    #[serde(rename = "catvC8")]
+    CatvC8,
+    /// PG
+    #[serde(rename = "catvE")]
+    CatvE,
+    /// 14+
+    #[serde(rename = "catvG")]
+    CatvG,
+    /// 18+
+    #[serde(rename = "catvPg")]
+    CatvPg,
+    #[serde(rename = "catvUnrated")]
+    CatvUnrated,
+    #[serde(rename = "catvUnspecified")]
+    CatvUnspecified,
+}
+
+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::Catv14plus => write!(f, "catv14plus"),
+            ContentRatingCatvRating::Catv18plus => write!(f, "catv18plus"),
+            ContentRatingCatvRating::CatvC => write!(f, "catvC"),
+            ContentRatingCatvRating::CatvC8 => write!(f, "catvC8"),
+            ContentRatingCatvRating::CatvE => write!(f, "catvE"),
+            ContentRatingCatvRating::CatvG => write!(f, "catvG"),
+            ContentRatingCatvRating::CatvPg => write!(f, "catvPg"),
+            ContentRatingCatvRating::CatvUnrated => write!(f, "catvUnrated"),
+            ContentRatingCatvRating::CatvUnspecified => write!(f, "catvUnspecified"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingCatvfrRating {
+    Undefined,
+    #[serde(rename = "catvfr13plus")]
+    Catvfr13plus,
+    /// G
+    #[serde(rename = "catvfr16plus")]
+    Catvfr16plus,
+    /// 8+
+    #[serde(rename = "catvfr18plus")]
+    Catvfr18plus,
+    /// 13+
+    #[serde(rename = "catvfr8plus")]
+    Catvfr8plus,
+    /// 16+
+    #[serde(rename = "catvfrE")]
+    CatvfrE,
+    /// 18+
+    #[serde(rename = "catvfrG")]
+    CatvfrG,
+    #[serde(rename = "catvfrUnrated")]
+    CatvfrUnrated,
+    #[serde(rename = "catvfrUnspecified")]
+    CatvfrUnspecified,
+}
+
+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::Catvfr13plus => write!(f, "catvfr13plus"),
+            ContentRatingCatvfrRating::Catvfr16plus => write!(f, "catvfr16plus"),
+            ContentRatingCatvfrRating::Catvfr18plus => write!(f, "catvfr18plus"),
+            ContentRatingCatvfrRating::Catvfr8plus => write!(f, "catvfr8plus"),
+            ContentRatingCatvfrRating::CatvfrE => write!(f, "catvfrE"),
+            ContentRatingCatvfrRating::CatvfrG => write!(f, "catvfrG"),
+            ContentRatingCatvfrRating::CatvfrUnrated => write!(f, "catvfrUnrated"),
+            ContentRatingCatvfrRating::CatvfrUnspecified => write!(f, "catvfrUnspecified"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingCbfcRating {
+    Undefined,
+    #[serde(rename = "cbfcA")]
+    CbfcA,
+    /// U
+    #[serde(rename = "cbfcS")]
+    CbfcS,
+    /// U/A
+    #[serde(rename = "cbfcU")]
+    CbfcU,
+    /// A
+    #[serde(rename = "cbfcUA")]
+    CbfcUA,
+    /// S
+    #[serde(rename = "cbfcUnrated")]
+    CbfcUnrated,
+    #[serde(rename = "cbfcUnspecified")]
+    CbfcUnspecified,
+}
+
+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::CbfcA => write!(f, "cbfcA"),
+            ContentRatingCbfcRating::CbfcS => write!(f, "cbfcS"),
+            ContentRatingCbfcRating::CbfcU => write!(f, "cbfcU"),
+            ContentRatingCbfcRating::CbfcUA => write!(f, "cbfcUA"),
+            ContentRatingCbfcRating::CbfcUnrated => write!(f, "cbfcUnrated"),
+            ContentRatingCbfcRating::CbfcUnspecified => write!(f, "cbfcUnspecified"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingCccRating {
+    Undefined,
+    #[serde(rename = "ccc14")]
+    Ccc14,
+    /// Todo espectador
+    #[serde(rename = "ccc18")]
+    Ccc18,
+    /// 6+ - Inconveniente para menores de 7 años
+    #[serde(rename = "ccc18s")]
+    Ccc18s,
+    /// 14+
+    #[serde(rename = "ccc18v")]
+    Ccc18v,
+    /// 18+
+    #[serde(rename = "ccc6")]
+    Ccc6,
+    /// 18+ - contenido excesivamente violento
+    #[serde(rename = "cccTe")]
+    CccTe,
+    /// 18+ - contenido pornográfico
+    #[serde(rename = "cccUnrated")]
+    CccUnrated,
+    #[serde(rename = "cccUnspecified")]
+    CccUnspecified,
+}
+
+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::Ccc14 => write!(f, "ccc14"),
+            ContentRatingCccRating::Ccc18 => write!(f, "ccc18"),
+            ContentRatingCccRating::Ccc18s => write!(f, "ccc18s"),
+            ContentRatingCccRating::Ccc18v => write!(f, "ccc18v"),
+            ContentRatingCccRating::Ccc6 => write!(f, "ccc6"),
+            ContentRatingCccRating::CccTe => write!(f, "cccTe"),
+            ContentRatingCccRating::CccUnrated => write!(f, "cccUnrated"),
+            ContentRatingCccRating::CccUnspecified => write!(f, "cccUnspecified"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingCceRating {
+    Undefined,
+    #[serde(rename = "cceM12")]
+    CceM12,
+    /// 4
+    #[serde(rename = "cceM14")]
+    CceM14,
+    /// 6
+    #[serde(rename = "cceM16")]
+    CceM16,
+    /// 12
+    #[serde(rename = "cceM18")]
+    CceM18,
+    /// 16
+    #[serde(rename = "cceM4")]
+    CceM4,
+    /// 18
+    #[serde(rename = "cceM6")]
+    CceM6,
+    #[serde(rename = "cceUnrated")]
+    CceUnrated,
+    /// 14
+    #[serde(rename = "cceUnspecified")]
+    CceUnspecified,
+}
+
+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::CceM12 => write!(f, "cceM12"),
+            ContentRatingCceRating::CceM14 => write!(f, "cceM14"),
+            ContentRatingCceRating::CceM16 => write!(f, "cceM16"),
+            ContentRatingCceRating::CceM18 => write!(f, "cceM18"),
+            ContentRatingCceRating::CceM4 => write!(f, "cceM4"),
+            ContentRatingCceRating::CceM6 => write!(f, "cceM6"),
+            ContentRatingCceRating::CceUnrated => write!(f, "cceUnrated"),
+            ContentRatingCceRating::CceUnspecified => write!(f, "cceUnspecified"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingChfilmRating {
+    Undefined,
+    #[serde(rename = "chfilm0")]
+    Chfilm0,
+    /// 0
+    #[serde(rename = "chfilm12")]
+    Chfilm12,
+    /// 6
+    #[serde(rename = "chfilm16")]
+    Chfilm16,
+    /// 12
+    #[serde(rename = "chfilm18")]
+    Chfilm18,
+    /// 16
+    #[serde(rename = "chfilm6")]
+    Chfilm6,
+    /// 18
+    #[serde(rename = "chfilmUnrated")]
+    ChfilmUnrated,
+    #[serde(rename = "chfilmUnspecified")]
+    ChfilmUnspecified,
+}
+
+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::Chfilm0 => write!(f, "chfilm0"),
+            ContentRatingChfilmRating::Chfilm12 => write!(f, "chfilm12"),
+            ContentRatingChfilmRating::Chfilm16 => write!(f, "chfilm16"),
+            ContentRatingChfilmRating::Chfilm18 => write!(f, "chfilm18"),
+            ContentRatingChfilmRating::Chfilm6 => write!(f, "chfilm6"),
+            ContentRatingChfilmRating::ChfilmUnrated => write!(f, "chfilmUnrated"),
+            ContentRatingChfilmRating::ChfilmUnspecified => write!(f, "chfilmUnspecified"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingChvrsRating {
+    Undefined,
+    #[serde(rename = "chvrs14a")]
+    Chvrs14a,
+    /// G
+    #[serde(rename = "chvrs18a")]
+    Chvrs18a,
+    /// PG
+    #[serde(rename = "chvrsE")]
+    ChvrsE,
+    /// 14A
+    #[serde(rename = "chvrsG")]
+    ChvrsG,
+    /// 18A
+    #[serde(rename = "chvrsPg")]
+    ChvrsPg,
+    /// R
+    #[serde(rename = "chvrsR")]
+    ChvrsR,
+    /// E
+    #[serde(rename = "chvrsUnrated")]
+    ChvrsUnrated,
+    #[serde(rename = "chvrsUnspecified")]
+    ChvrsUnspecified,
+}
+
+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::Chvrs14a => write!(f, "chvrs14a"),
+            ContentRatingChvrsRating::Chvrs18a => write!(f, "chvrs18a"),
+            ContentRatingChvrsRating::ChvrsE => write!(f, "chvrsE"),
+            ContentRatingChvrsRating::ChvrsG => write!(f, "chvrsG"),
+            ContentRatingChvrsRating::ChvrsPg => write!(f, "chvrsPg"),
+            ContentRatingChvrsRating::ChvrsR => write!(f, "chvrsR"),
+            ContentRatingChvrsRating::ChvrsUnrated => write!(f, "chvrsUnrated"),
+            ContentRatingChvrsRating::ChvrsUnspecified => write!(f, "chvrsUnspecified"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingCicfRating {
+    Undefined,
+    #[serde(rename = "cicfE")]
+    CicfE,
+    /// E
+    #[serde(rename = "cicfKntEna")]
+    CicfKntEna,
+    /// KT/EA
+    #[serde(rename = "cicfKtEa")]
+    CicfKtEa,
+    /// KNT/ENA
+    #[serde(rename = "cicfUnrated")]
+    CicfUnrated,
+    #[serde(rename = "cicfUnspecified")]
+    CicfUnspecified,
+}
+
+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::CicfE => write!(f, "cicfE"),
+            ContentRatingCicfRating::CicfKntEna => write!(f, "cicfKntEna"),
+            ContentRatingCicfRating::CicfKtEa => write!(f, "cicfKtEa"),
+            ContentRatingCicfRating::CicfUnrated => write!(f, "cicfUnrated"),
+            ContentRatingCicfRating::CicfUnspecified => write!(f, "cicfUnspecified"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingCnaRating {
+    Undefined,
+    #[serde(rename = "cna12")]
+    Cna12,
+    /// AP
+    #[serde(rename = "cna15")]
+    Cna15,
+    /// 12
+    #[serde(rename = "cna18")]
+    Cna18,
+    /// 15
+    #[serde(rename = "cna18plus")]
+    Cna18plus,
+    /// 18
+    #[serde(rename = "cnaAp")]
+    CnaAp,
+    /// 18+
+    #[serde(rename = "cnaUnrated")]
+    CnaUnrated,
+    #[serde(rename = "cnaUnspecified")]
+    CnaUnspecified,
+}
+
+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::Cna12 => write!(f, "cna12"),
+            ContentRatingCnaRating::Cna15 => write!(f, "cna15"),
+            ContentRatingCnaRating::Cna18 => write!(f, "cna18"),
+            ContentRatingCnaRating::Cna18plus => write!(f, "cna18plus"),
+            ContentRatingCnaRating::CnaAp => write!(f, "cnaAp"),
+            ContentRatingCnaRating::CnaUnrated => write!(f, "cnaUnrated"),
+            ContentRatingCnaRating::CnaUnspecified => write!(f, "cnaUnspecified"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingCncRating {
+    Undefined,
+    #[serde(rename = "cnc10")]
+    Cnc10,
+    /// T
+    #[serde(rename = "cnc12")]
+    Cnc12,
+    /// 10
+    #[serde(rename = "cnc16")]
+    Cnc16,
+    /// 12
+    #[serde(rename = "cnc18")]
+    Cnc18,
+    /// 16
+    #[serde(rename = "cncE")]
+    CncE,
+    /// 18
+    #[serde(rename = "cncInterdiction")]
+    CncInterdiction,
+    /// E
+    #[serde(rename = "cncT")]
+    CncT,
+    /// interdiction
+    #[serde(rename = "cncUnrated")]
+    CncUnrated,
+    #[serde(rename = "cncUnspecified")]
+    CncUnspecified,
+}
+
+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::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::CncT => write!(f, "cncT"),
+            ContentRatingCncRating::CncUnrated => write!(f, "cncUnrated"),
+            ContentRatingCncRating::CncUnspecified => write!(f, "cncUnspecified"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingCsaRating {
+    Undefined,
+    #[serde(rename = "csa10")]
+    Csa10,
+    /// T
+    #[serde(rename = "csa12")]
+    Csa12,
+    /// 10
+    #[serde(rename = "csa16")]
+    Csa16,
+    /// 12
+    #[serde(rename = "csa18")]
+    Csa18,
+    /// 16
+    #[serde(rename = "csaInterdiction")]
+    CsaInterdiction,
+    /// 18
+    #[serde(rename = "csaT")]
+    CsaT,
+    /// Interdiction
+    #[serde(rename = "csaUnrated")]
+    CsaUnrated,
+    #[serde(rename = "csaUnspecified")]
+    CsaUnspecified,
+}
+
+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::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::CsaT => write!(f, "csaT"),
+            ContentRatingCsaRating::CsaUnrated => write!(f, "csaUnrated"),
+            ContentRatingCsaRating::CsaUnspecified => write!(f, "csaUnspecified"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingCscfRating {
+    Undefined,
+    #[serde(rename = "cscf12")]
+    Cscf12,
+    /// AL
+    #[serde(rename = "cscf16")]
+    Cscf16,
+    /// A
+    #[serde(rename = "cscf18")]
+    Cscf18,
+    /// 6
+    #[serde(rename = "cscf6")]
+    Cscf6,
+    /// 9
+    #[serde(rename = "cscf9")]
+    Cscf9,
+    /// 12
+    #[serde(rename = "cscfA")]
+    CscfA,
+    /// 16
+    #[serde(rename = "cscfAl")]
+    CscfAl,
+    /// 18
+    #[serde(rename = "cscfUnrated")]
+    CscfUnrated,
+    #[serde(rename = "cscfUnspecified")]
+    CscfUnspecified,
+}
+
+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::Cscf12 => write!(f, "cscf12"),
+            ContentRatingCscfRating::Cscf16 => write!(f, "cscf16"),
+            ContentRatingCscfRating::Cscf18 => write!(f, "cscf18"),
+            ContentRatingCscfRating::Cscf6 => write!(f, "cscf6"),
+            ContentRatingCscfRating::Cscf9 => write!(f, "cscf9"),
+            ContentRatingCscfRating::CscfA => write!(f, "cscfA"),
+            ContentRatingCscfRating::CscfAl => write!(f, "cscfAl"),
+            ContentRatingCscfRating::CscfUnrated => write!(f, "cscfUnrated"),
+            ContentRatingCscfRating::CscfUnspecified => write!(f, "cscfUnspecified"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingCzfilmRating {
+    Undefined,
+    #[serde(rename = "czfilm12")]
+    Czfilm12,
+    /// U
+    #[serde(rename = "czfilm14")]
+    Czfilm14,
+    /// 12
+    #[serde(rename = "czfilm18")]
+    Czfilm18,
+    /// 14
+    #[serde(rename = "czfilmU")]
+    CzfilmU,
+    /// 18
+    #[serde(rename = "czfilmUnrated")]
+    CzfilmUnrated,
+    #[serde(rename = "czfilmUnspecified")]
+    CzfilmUnspecified,
+}
+
+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::Czfilm12 => write!(f, "czfilm12"),
+            ContentRatingCzfilmRating::Czfilm14 => write!(f, "czfilm14"),
+            ContentRatingCzfilmRating::Czfilm18 => write!(f, "czfilm18"),
+            ContentRatingCzfilmRating::CzfilmU => write!(f, "czfilmU"),
+            ContentRatingCzfilmRating::CzfilmUnrated => write!(f, "czfilmUnrated"),
+            ContentRatingCzfilmRating::CzfilmUnspecified => write!(f, "czfilmUnspecified"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingDjctqRating {
+    Undefined,
+    #[serde(rename = "djctq10")]
+    Djctq10,
+    /// L
+    #[serde(rename = "djctq1012")]
+    Djctq1012,
+    /// 10
+    #[serde(rename = "djctq1014")]
+    Djctq1014,
+    /// 12
+    #[serde(rename = "djctq1016")]
+    Djctq1016,
+    /// 14
+    #[serde(rename = "djctq1018")]
+    Djctq1018,
+    /// 16
+    #[serde(rename = "djctq12")]
+    Djctq12,
+    /// 18
+    #[serde(rename = "djctq1214")]
+    Djctq1214,
+    #[serde(rename = "djctq1216")]
+    Djctq1216,
+    #[serde(rename = "djctq1218")]
+    Djctq1218,
+    #[serde(rename = "djctq14")]
+    Djctq14,
+    #[serde(rename = "djctq1416")]
+    Djctq1416,
+    #[serde(rename = "djctq1418")]
+    Djctq1418,
+    #[serde(rename = "djctq16")]
+    Djctq16,
+    #[serde(rename = "djctq1618")]
+    Djctq1618,
+    #[serde(rename = "djctq18")]
+    Djctq18,
+    #[serde(rename = "djctqEr")]
+    DjctqEr,
+    #[serde(rename = "djctqL")]
+    DjctqL,
+    #[serde(rename = "djctqL10")]
+    DjctqL10,
+    #[serde(rename = "djctqL12")]
+    DjctqL12,
+    #[serde(rename = "djctqL14")]
+    DjctqL14,
+    #[serde(rename = "djctqL16")]
+    DjctqL16,
+    #[serde(rename = "djctqL18")]
+    DjctqL18,
+    #[serde(rename = "djctqUnrated")]
+    DjctqUnrated,
+    #[serde(rename = "djctqUnspecified")]
+    DjctqUnspecified,
+}
+
+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::Djctq10 => write!(f, "djctq10"),
+            ContentRatingDjctqRating::Djctq1012 => write!(f, "djctq1012"),
+            ContentRatingDjctqRating::Djctq1014 => write!(f, "djctq1014"),
+            ContentRatingDjctqRating::Djctq1016 => write!(f, "djctq1016"),
+            ContentRatingDjctqRating::Djctq1018 => write!(f, "djctq1018"),
+            ContentRatingDjctqRating::Djctq12 => write!(f, "djctq12"),
+            ContentRatingDjctqRating::Djctq1214 => write!(f, "djctq1214"),
+            ContentRatingDjctqRating::Djctq1216 => write!(f, "djctq1216"),
+            ContentRatingDjctqRating::Djctq1218 => write!(f, "djctq1218"),
+            ContentRatingDjctqRating::Djctq14 => write!(f, "djctq14"),
+            ContentRatingDjctqRating::Djctq1416 => write!(f, "djctq1416"),
+            ContentRatingDjctqRating::Djctq1418 => write!(f, "djctq1418"),
+            ContentRatingDjctqRating::Djctq16 => write!(f, "djctq16"),
+            ContentRatingDjctqRating::Djctq1618 => write!(f, "djctq1618"),
+            ContentRatingDjctqRating::Djctq18 => write!(f, "djctq18"),
+            ContentRatingDjctqRating::DjctqEr => write!(f, "djctqEr"),
+            ContentRatingDjctqRating::DjctqL => write!(f, "djctqL"),
+            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::DjctqUnrated => write!(f, "djctqUnrated"),
+            ContentRatingDjctqRating::DjctqUnspecified => write!(f, "djctqUnspecified"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingDjctqRatingReasons {
+    Undefined,
+    #[serde(rename = "djctqCriminalActs")]
+    DjctqCriminalActs,
+    /// Brazil rating content descriptors. See http://go/brazilratings section F. Violência (Violence)
+    #[serde(rename = "djctqDrugs")]
+    DjctqDrugs,
+    /// Violência extrema (Extreme violence)
+    #[serde(rename = "djctqExplicitSex")]
+    DjctqExplicitSex,
+    /// Conteúdo sexual (Sexual content)
+    #[serde(rename = "djctqExtremeViolence")]
+    DjctqExtremeViolence,
+    /// Nudez (Nudity)
+    #[serde(rename = "djctqIllegalDrugs")]
+    DjctqIllegalDrugs,
+    /// Sexo (Sex)
+    #[serde(rename = "djctqImpactingContent")]
+    DjctqImpactingContent,
+    /// Sexo Explícito (Explicit sex)
+    #[serde(rename = "djctqInappropriateLanguage")]
+    DjctqInappropriateLanguage,
+    /// Drogas (Drugs)
+    #[serde(rename = "djctqLegalDrugs")]
+    DjctqLegalDrugs,
+    /// Drogas Lícitas (Legal drugs)
+    #[serde(rename = "djctqNudity")]
+    DjctqNudity,
+    /// Drogas Ilícitas (Illegal drugs)
+    #[serde(rename = "djctqRatingReasonUnspecified")]
+    DjctqRatingReasonUnspecified,
+    /// Linguagem Imprópria (Inappropriate language)
+    #[serde(rename = "djctqSex")]
+    DjctqSex,
+    /// Atos Criminosos (Criminal Acts)
+    #[serde(rename = "djctqSexualContent")]
+    DjctqSexualContent,
+    /// Conteúdo Impactante (Impacting content)
+    #[serde(rename = "djctqViolence")]
+    DjctqViolence,
+}
+
+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::DjctqCriminalActs => write!(f, "djctqCriminalActs"),
+            ContentRatingDjctqRatingReasons::DjctqDrugs => write!(f, "djctqDrugs"),
+            ContentRatingDjctqRatingReasons::DjctqExplicitSex => write!(f, "djctqExplicitSex"),
+            ContentRatingDjctqRatingReasons::DjctqExtremeViolence => {
+                write!(f, "djctqExtremeViolence")
+            }
+            ContentRatingDjctqRatingReasons::DjctqIllegalDrugs => write!(f, "djctqIllegalDrugs"),
+            ContentRatingDjctqRatingReasons::DjctqImpactingContent => {
+                write!(f, "djctqImpactingContent")
+            }
+            ContentRatingDjctqRatingReasons::DjctqInappropriateLanguage => {
+                write!(f, "djctqInappropriateLanguage")
+            }
+            ContentRatingDjctqRatingReasons::DjctqLegalDrugs => write!(f, "djctqLegalDrugs"),
+            ContentRatingDjctqRatingReasons::DjctqNudity => write!(f, "djctqNudity"),
+            ContentRatingDjctqRatingReasons::DjctqRatingReasonUnspecified => {
+                write!(f, "djctqRatingReasonUnspecified")
+            }
+            ContentRatingDjctqRatingReasons::DjctqSex => write!(f, "djctqSex"),
+            ContentRatingDjctqRatingReasons::DjctqSexualContent => write!(f, "djctqSexualContent"),
+            ContentRatingDjctqRatingReasons::DjctqViolence => write!(f, "djctqViolence"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingEcbmctRating {
+    Undefined,
+    #[serde(rename = "ecbmct13a")]
+    Ecbmct13a,
+    /// G
+    #[serde(rename = "ecbmct13plus")]
+    Ecbmct13plus,
+    /// 7A
+    #[serde(rename = "ecbmct15a")]
+    Ecbmct15a,
+    /// 7+
+    #[serde(rename = "ecbmct15plus")]
+    Ecbmct15plus,
+    /// 13A
+    #[serde(rename = "ecbmct18plus")]
+    Ecbmct18plus,
+    /// 13+
+    #[serde(rename = "ecbmct7a")]
+    Ecbmct7a,
+    /// 15A
+    #[serde(rename = "ecbmct7plus")]
+    Ecbmct7plus,
+    /// 15+
+    #[serde(rename = "ecbmctG")]
+    EcbmctG,
+    /// 18+
+    #[serde(rename = "ecbmctUnrated")]
+    EcbmctUnrated,
+    #[serde(rename = "ecbmctUnspecified")]
+    EcbmctUnspecified,
+}
+
+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::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::Ecbmct7a => write!(f, "ecbmct7a"),
+            ContentRatingEcbmctRating::Ecbmct7plus => write!(f, "ecbmct7plus"),
+            ContentRatingEcbmctRating::EcbmctG => write!(f, "ecbmctG"),
+            ContentRatingEcbmctRating::EcbmctUnrated => write!(f, "ecbmctUnrated"),
+            ContentRatingEcbmctRating::EcbmctUnspecified => write!(f, "ecbmctUnspecified"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingEefilmRating {
+    Undefined,
+    #[serde(rename = "eefilmK12")]
+    EefilmK12,
+    /// Pere
+    #[serde(rename = "eefilmK14")]
+    EefilmK14,
+    /// L
+    #[serde(rename = "eefilmK16")]
+    EefilmK16,
+    /// MS-6
+    #[serde(rename = "eefilmK6")]
+    EefilmK6,
+    /// K-6
+    #[serde(rename = "eefilmL")]
+    EefilmL,
+    /// MS-12
+    #[serde(rename = "eefilmMs12")]
+    EefilmMs12,
+    /// K-12
+    #[serde(rename = "eefilmMs6")]
+    EefilmMs6,
+    /// K-14
+    #[serde(rename = "eefilmPere")]
+    EefilmPere,
+    /// K-16
+    #[serde(rename = "eefilmUnrated")]
+    EefilmUnrated,
+    #[serde(rename = "eefilmUnspecified")]
+    EefilmUnspecified,
+}
+
+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::EefilmK12 => write!(f, "eefilmK12"),
+            ContentRatingEefilmRating::EefilmK14 => write!(f, "eefilmK14"),
+            ContentRatingEefilmRating::EefilmK16 => write!(f, "eefilmK16"),
+            ContentRatingEefilmRating::EefilmK6 => write!(f, "eefilmK6"),
+            ContentRatingEefilmRating::EefilmL => write!(f, "eefilmL"),
+            ContentRatingEefilmRating::EefilmMs12 => write!(f, "eefilmMs12"),
+            ContentRatingEefilmRating::EefilmMs6 => write!(f, "eefilmMs6"),
+            ContentRatingEefilmRating::EefilmPere => write!(f, "eefilmPere"),
+            ContentRatingEefilmRating::EefilmUnrated => write!(f, "eefilmUnrated"),
+            ContentRatingEefilmRating::EefilmUnspecified => write!(f, "eefilmUnspecified"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingEgfilmRating {
+    Undefined,
+    #[serde(rename = "egfilm18")]
+    Egfilm18,
+    /// GN
+    #[serde(rename = "egfilmBn")]
+    EgfilmBn,
+    /// 18
+    #[serde(rename = "egfilmGn")]
+    EgfilmGn,
+    /// BN
+    #[serde(rename = "egfilmUnrated")]
+    EgfilmUnrated,
+    #[serde(rename = "egfilmUnspecified")]
+    EgfilmUnspecified,
+}
+
+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::Egfilm18 => write!(f, "egfilm18"),
+            ContentRatingEgfilmRating::EgfilmBn => write!(f, "egfilmBn"),
+            ContentRatingEgfilmRating::EgfilmGn => write!(f, "egfilmGn"),
+            ContentRatingEgfilmRating::EgfilmUnrated => write!(f, "egfilmUnrated"),
+            ContentRatingEgfilmRating::EgfilmUnspecified => write!(f, "egfilmUnspecified"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingEirinRating {
+    Undefined,
+    #[serde(rename = "eirinG")]
+    EirinG,
+    /// G
+    #[serde(rename = "eirinPg12")]
+    EirinPg12,
+    /// PG-12
+    #[serde(rename = "eirinR15plus")]
+    EirinR15plus,
+    /// R15+
+    #[serde(rename = "eirinR18plus")]
+    EirinR18plus,
+    /// R18+
+    #[serde(rename = "eirinUnrated")]
+    EirinUnrated,
+    #[serde(rename = "eirinUnspecified")]
+    EirinUnspecified,
+}
+
+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::EirinG => write!(f, "eirinG"),
+            ContentRatingEirinRating::EirinPg12 => write!(f, "eirinPg12"),
+            ContentRatingEirinRating::EirinR15plus => write!(f, "eirinR15plus"),
+            ContentRatingEirinRating::EirinR18plus => write!(f, "eirinR18plus"),
+            ContentRatingEirinRating::EirinUnrated => write!(f, "eirinUnrated"),
+            ContentRatingEirinRating::EirinUnspecified => write!(f, "eirinUnspecified"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingFcbmRating {
+    Undefined,
+    #[serde(rename = "fcbm18")]
+    Fcbm18,
+    /// U
+    #[serde(rename = "fcbm18pa")]
+    Fcbm18pa,
+    /// PG13
+    #[serde(rename = "fcbm18pl")]
+    Fcbm18pl,
+    /// P13
+    #[serde(rename = "fcbm18sg")]
+    Fcbm18sg,
+    /// 18
+    #[serde(rename = "fcbm18sx")]
+    Fcbm18sx,
+    /// 18SX
+    #[serde(rename = "fcbmP13")]
+    FcbmP13,
+    /// 18PA
+    #[serde(rename = "fcbmPg13")]
+    FcbmPg13,
+    /// 18SG
+    #[serde(rename = "fcbmU")]
+    FcbmU,
+    /// 18PL
+    #[serde(rename = "fcbmUnrated")]
+    FcbmUnrated,
+    #[serde(rename = "fcbmUnspecified")]
+    FcbmUnspecified,
+}
+
+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::Fcbm18 => write!(f, "fcbm18"),
+            ContentRatingFcbmRating::Fcbm18pa => write!(f, "fcbm18pa"),
+            ContentRatingFcbmRating::Fcbm18pl => write!(f, "fcbm18pl"),
+            ContentRatingFcbmRating::Fcbm18sg => write!(f, "fcbm18sg"),
+            ContentRatingFcbmRating::Fcbm18sx => write!(f, "fcbm18sx"),
+            ContentRatingFcbmRating::FcbmP13 => write!(f, "fcbmP13"),
+            ContentRatingFcbmRating::FcbmPg13 => write!(f, "fcbmPg13"),
+            ContentRatingFcbmRating::FcbmU => write!(f, "fcbmU"),
+            ContentRatingFcbmRating::FcbmUnrated => write!(f, "fcbmUnrated"),
+            ContentRatingFcbmRating::FcbmUnspecified => write!(f, "fcbmUnspecified"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingFcoRating {
+    Undefined,
+    #[serde(rename = "fcoI")]
+    FcoI,
+    /// I
+    #[serde(rename = "fcoIi")]
+    FcoIi,
+    /// IIA
+    #[serde(rename = "fcoIia")]
+    FcoIia,
+    /// IIB
+    #[serde(rename = "fcoIib")]
+    FcoIib,
+    /// II
+    #[serde(rename = "fcoIii")]
+    FcoIii,
+    /// III
+    #[serde(rename = "fcoUnrated")]
+    FcoUnrated,
+    #[serde(rename = "fcoUnspecified")]
+    FcoUnspecified,
+}
+
+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::FcoI => write!(f, "fcoI"),
+            ContentRatingFcoRating::FcoIi => write!(f, "fcoIi"),
+            ContentRatingFcoRating::FcoIia => write!(f, "fcoIia"),
+            ContentRatingFcoRating::FcoIib => write!(f, "fcoIib"),
+            ContentRatingFcoRating::FcoIii => write!(f, "fcoIii"),
+            ContentRatingFcoRating::FcoUnrated => write!(f, "fcoUnrated"),
+            ContentRatingFcoRating::FcoUnspecified => write!(f, "fcoUnspecified"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingFmocRating {
+    Undefined,
+    #[serde(rename = "fmoc10")]
+    Fmoc10,
+    /// U
+    #[serde(rename = "fmoc12")]
+    Fmoc12,
+    /// 10
+    #[serde(rename = "fmoc16")]
+    Fmoc16,
+    /// 12
+    #[serde(rename = "fmoc18")]
+    Fmoc18,
+    /// 16
+    #[serde(rename = "fmocE")]
+    FmocE,
+    /// 18
+    #[serde(rename = "fmocU")]
+    FmocU,
+    /// E
+    #[serde(rename = "fmocUnrated")]
+    FmocUnrated,
+    #[serde(rename = "fmocUnspecified")]
+    FmocUnspecified,
+}
+
+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::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::FmocU => write!(f, "fmocU"),
+            ContentRatingFmocRating::FmocUnrated => write!(f, "fmocUnrated"),
+            ContentRatingFmocRating::FmocUnspecified => write!(f, "fmocUnspecified"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingFpbRating {
+    Undefined,
+    #[serde(rename = "fpb10")]
+    Fpb10,
+    /// A
+    #[serde(rename = "fpb1012Pg")]
+    Fpb1012Pg,
+    /// PG
+    #[serde(rename = "fpb13")]
+    Fpb13,
+    /// 7-9PG
+    #[serde(rename = "fpb16")]
+    Fpb16,
+    /// 10-12PG
+    #[serde(rename = "fpb18")]
+    Fpb18,
+    /// 13
+    #[serde(rename = "fpb79Pg")]
+    Fpb79Pg,
+    /// 16
+    #[serde(rename = "fpbA")]
+    FpbA,
+    /// 18
+    #[serde(rename = "fpbPg")]
+    FpbPg,
+    /// X18
+    #[serde(rename = "fpbUnrated")]
+    FpbUnrated,
+    /// XX
+    #[serde(rename = "fpbUnspecified")]
+    FpbUnspecified,
+    #[serde(rename = "fpbX18")]
+    FpbX18,
+    /// 10
+    #[serde(rename = "fpbXx")]
+    FpbXx,
+}
+
+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::Fpb10 => write!(f, "fpb10"),
+            ContentRatingFpbRating::Fpb1012Pg => write!(f, "fpb1012Pg"),
+            ContentRatingFpbRating::Fpb13 => write!(f, "fpb13"),
+            ContentRatingFpbRating::Fpb16 => write!(f, "fpb16"),
+            ContentRatingFpbRating::Fpb18 => write!(f, "fpb18"),
+            ContentRatingFpbRating::Fpb79Pg => write!(f, "fpb79Pg"),
+            ContentRatingFpbRating::FpbA => write!(f, "fpbA"),
+            ContentRatingFpbRating::FpbPg => write!(f, "fpbPg"),
+            ContentRatingFpbRating::FpbUnrated => write!(f, "fpbUnrated"),
+            ContentRatingFpbRating::FpbUnspecified => write!(f, "fpbUnspecified"),
+            ContentRatingFpbRating::FpbX18 => write!(f, "fpbX18"),
+            ContentRatingFpbRating::FpbXx => write!(f, "fpbXx"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingFpbRatingReasons {
+    Undefined,
+    #[serde(rename = "fpbBlasphemy")]
+    FpbBlasphemy,
+    /// South Africa rating content descriptors.
+    #[serde(rename = "fpbCriminalTechniques")]
+    FpbCriminalTechniques,
+    #[serde(rename = "fpbDrugs")]
+    FpbDrugs,
+    #[serde(rename = "fpbHorror")]
+    FpbHorror,
+    #[serde(rename = "fpbImitativeActsTechniques")]
+    FpbImitativeActsTechniques,
+    #[serde(rename = "fpbLanguage")]
+    FpbLanguage,
+    #[serde(rename = "fpbNudity")]
+    FpbNudity,
+    #[serde(rename = "fpbPrejudice")]
+    FpbPrejudice,
+    #[serde(rename = "fpbRatingReasonUnspecified")]
+    FpbRatingReasonUnspecified,
+    #[serde(rename = "fpbSex")]
+    FpbSex,
+    #[serde(rename = "fpbSexualViolence")]
+    FpbSexualViolence,
+    #[serde(rename = "fpbViolence")]
+    FpbViolence,
+}
+
+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::FpbBlasphemy => write!(f, "fpbBlasphemy"),
+            ContentRatingFpbRatingReasons::FpbCriminalTechniques => {
+                write!(f, "fpbCriminalTechniques")
+            }
+            ContentRatingFpbRatingReasons::FpbDrugs => write!(f, "fpbDrugs"),
+            ContentRatingFpbRatingReasons::FpbHorror => write!(f, "fpbHorror"),
+            ContentRatingFpbRatingReasons::FpbImitativeActsTechniques => {
+                write!(f, "fpbImitativeActsTechniques")
+            }
+            ContentRatingFpbRatingReasons::FpbLanguage => write!(f, "fpbLanguage"),
+            ContentRatingFpbRatingReasons::FpbNudity => write!(f, "fpbNudity"),
+            ContentRatingFpbRatingReasons::FpbPrejudice => write!(f, "fpbPrejudice"),
+            ContentRatingFpbRatingReasons::FpbRatingReasonUnspecified => {
+                write!(f, "fpbRatingReasonUnspecified")
+            }
+            ContentRatingFpbRatingReasons::FpbSex => write!(f, "fpbSex"),
+            ContentRatingFpbRatingReasons::FpbSexualViolence => write!(f, "fpbSexualViolence"),
+            ContentRatingFpbRatingReasons::FpbViolence => write!(f, "fpbViolence"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingFskRating {
+    Undefined,
+    #[serde(rename = "fsk0")]
+    Fsk0,
+    /// FSK 0
+    #[serde(rename = "fsk12")]
+    Fsk12,
+    /// FSK 6
+    #[serde(rename = "fsk16")]
+    Fsk16,
+    /// FSK 12
+    #[serde(rename = "fsk18")]
+    Fsk18,
+    /// FSK 16
+    #[serde(rename = "fsk6")]
+    Fsk6,
+    /// FSK 18
+    #[serde(rename = "fskUnrated")]
+    FskUnrated,
+    #[serde(rename = "fskUnspecified")]
+    FskUnspecified,
+}
+
+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::Fsk0 => write!(f, "fsk0"),
+            ContentRatingFskRating::Fsk12 => write!(f, "fsk12"),
+            ContentRatingFskRating::Fsk16 => write!(f, "fsk16"),
+            ContentRatingFskRating::Fsk18 => write!(f, "fsk18"),
+            ContentRatingFskRating::Fsk6 => write!(f, "fsk6"),
+            ContentRatingFskRating::FskUnrated => write!(f, "fskUnrated"),
+            ContentRatingFskRating::FskUnspecified => write!(f, "fskUnspecified"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingGrfilmRating {
+    Undefined,
+    #[serde(rename = "grfilmE")]
+    GrfilmE,
+    /// K
+    #[serde(rename = "grfilmK")]
+    GrfilmK,
+    /// E
+    #[serde(rename = "grfilmK12")]
+    GrfilmK12,
+    /// K-12
+    #[serde(rename = "grfilmK13")]
+    GrfilmK13,
+    /// K-13
+    #[serde(rename = "grfilmK15")]
+    GrfilmK15,
+    /// K-15
+    #[serde(rename = "grfilmK17")]
+    GrfilmK17,
+    /// K-17
+    #[serde(rename = "grfilmK18")]
+    GrfilmK18,
+    /// K-18
+    #[serde(rename = "grfilmUnrated")]
+    GrfilmUnrated,
+    #[serde(rename = "grfilmUnspecified")]
+    GrfilmUnspecified,
+}
+
+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::GrfilmE => write!(f, "grfilmE"),
+            ContentRatingGrfilmRating::GrfilmK => write!(f, "grfilmK"),
+            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"),
+            ContentRatingGrfilmRating::GrfilmUnspecified => write!(f, "grfilmUnspecified"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingIcaaRating {
+    Undefined,
+    #[serde(rename = "icaa12")]
+    Icaa12,
+    /// APTA
+    #[serde(rename = "icaa13")]
+    Icaa13,
+    /// 7
+    #[serde(rename = "icaa16")]
+    Icaa16,
+    /// 12
+    #[serde(rename = "icaa18")]
+    Icaa18,
+    /// 13
+    #[serde(rename = "icaa7")]
+    Icaa7,
+    /// 16
+    #[serde(rename = "icaaApta")]
+    IcaaApta,
+    /// 18
+    #[serde(rename = "icaaUnrated")]
+    IcaaUnrated,
+    /// X
+    #[serde(rename = "icaaUnspecified")]
+    IcaaUnspecified,
+    #[serde(rename = "icaaX")]
+    IcaaX,
+}
+
+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::Icaa12 => write!(f, "icaa12"),
+            ContentRatingIcaaRating::Icaa13 => write!(f, "icaa13"),
+            ContentRatingIcaaRating::Icaa16 => write!(f, "icaa16"),
+            ContentRatingIcaaRating::Icaa18 => write!(f, "icaa18"),
+            ContentRatingIcaaRating::Icaa7 => write!(f, "icaa7"),
+            ContentRatingIcaaRating::IcaaApta => write!(f, "icaaApta"),
+            ContentRatingIcaaRating::IcaaUnrated => write!(f, "icaaUnrated"),
+            ContentRatingIcaaRating::IcaaUnspecified => write!(f, "icaaUnspecified"),
+            ContentRatingIcaaRating::IcaaX => write!(f, "icaaX"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingIfcoRating {
+    Undefined,
+    #[serde(rename = "ifco12")]
+    Ifco12,
+    /// G
+    #[serde(rename = "ifco12a")]
+    Ifco12a,
+    /// PG
+    #[serde(rename = "ifco15")]
+    Ifco15,
+    /// 12
+    #[serde(rename = "ifco15a")]
+    Ifco15a,
+    /// 12A
+    #[serde(rename = "ifco16")]
+    Ifco16,
+    /// 15
+    #[serde(rename = "ifco18")]
+    Ifco18,
+    /// 15A
+    #[serde(rename = "ifcoG")]
+    IfcoG,
+    /// 16
+    #[serde(rename = "ifcoPg")]
+    IfcoPg,
+    /// 18
+    #[serde(rename = "ifcoUnrated")]
+    IfcoUnrated,
+    #[serde(rename = "ifcoUnspecified")]
+    IfcoUnspecified,
+}
+
+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::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::IfcoG => write!(f, "ifcoG"),
+            ContentRatingIfcoRating::IfcoPg => write!(f, "ifcoPg"),
+            ContentRatingIfcoRating::IfcoUnrated => write!(f, "ifcoUnrated"),
+            ContentRatingIfcoRating::IfcoUnspecified => write!(f, "ifcoUnspecified"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingIlfilmRating {
+    Undefined,
+    #[serde(rename = "ilfilm12")]
+    Ilfilm12,
+    /// AA
+    #[serde(rename = "ilfilm14")]
+    Ilfilm14,
+    /// 12
+    #[serde(rename = "ilfilm16")]
+    Ilfilm16,
+    /// 14
+    #[serde(rename = "ilfilm18")]
+    Ilfilm18,
+    /// 16
+    #[serde(rename = "ilfilmAa")]
+    IlfilmAa,
+    /// 18
+    #[serde(rename = "ilfilmUnrated")]
+    IlfilmUnrated,
+    #[serde(rename = "ilfilmUnspecified")]
+    IlfilmUnspecified,
+}
+
+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::Ilfilm12 => write!(f, "ilfilm12"),
+            ContentRatingIlfilmRating::Ilfilm14 => write!(f, "ilfilm14"),
+            ContentRatingIlfilmRating::Ilfilm16 => write!(f, "ilfilm16"),
+            ContentRatingIlfilmRating::Ilfilm18 => write!(f, "ilfilm18"),
+            ContentRatingIlfilmRating::IlfilmAa => write!(f, "ilfilmAa"),
+            ContentRatingIlfilmRating::IlfilmUnrated => write!(f, "ilfilmUnrated"),
+            ContentRatingIlfilmRating::IlfilmUnspecified => write!(f, "ilfilmUnspecified"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingIncaaRating {
+    Undefined,
+    #[serde(rename = "incaaAtp")]
+    IncaaAtp,
+    /// ATP (Apta para todo publico)
+    #[serde(rename = "incaaC")]
+    IncaaC,
+    /// 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 = "incaaUnrated")]
+    IncaaUnrated,
+    #[serde(rename = "incaaUnspecified")]
+    IncaaUnspecified,
+}
+
+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::IncaaAtp => write!(f, "incaaAtp"),
+            ContentRatingIncaaRating::IncaaC => write!(f, "incaaC"),
+            ContentRatingIncaaRating::IncaaSam13 => write!(f, "incaaSam13"),
+            ContentRatingIncaaRating::IncaaSam16 => write!(f, "incaaSam16"),
+            ContentRatingIncaaRating::IncaaSam18 => write!(f, "incaaSam18"),
+            ContentRatingIncaaRating::IncaaUnrated => write!(f, "incaaUnrated"),
+            ContentRatingIncaaRating::IncaaUnspecified => write!(f, "incaaUnspecified"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingKfcbRating {
+    Undefined,
+    #[serde(rename = "kfcb16plus")]
+    Kfcb16plus,
+    /// GE
+    #[serde(rename = "kfcbG")]
+    KfcbG,
+    /// PG
+    #[serde(rename = "kfcbPg")]
+    KfcbPg,
+    /// 16
+    #[serde(rename = "kfcbR")]
+    KfcbR,
+    /// 18
+    #[serde(rename = "kfcbUnrated")]
+    KfcbUnrated,
+    #[serde(rename = "kfcbUnspecified")]
+    KfcbUnspecified,
+}
+
+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::Kfcb16plus => write!(f, "kfcb16plus"),
+            ContentRatingKfcbRating::KfcbG => write!(f, "kfcbG"),
+            ContentRatingKfcbRating::KfcbPg => write!(f, "kfcbPg"),
+            ContentRatingKfcbRating::KfcbR => write!(f, "kfcbR"),
+            ContentRatingKfcbRating::KfcbUnrated => write!(f, "kfcbUnrated"),
+            ContentRatingKfcbRating::KfcbUnspecified => write!(f, "kfcbUnspecified"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingKijkwijzerRating {
+    Undefined,
+    #[serde(rename = "kijkwijzer12")]
+    Kijkwijzer12,
+    /// AL
+    #[serde(rename = "kijkwijzer16")]
+    Kijkwijzer16,
+    /// 6
+    #[serde(rename = "kijkwijzer18")]
+    Kijkwijzer18,
+    /// 9
+    #[serde(rename = "kijkwijzer6")]
+    Kijkwijzer6,
+    /// 12
+    #[serde(rename = "kijkwijzer9")]
+    Kijkwijzer9,
+    /// 16
+    #[serde(rename = "kijkwijzerAl")]
+    KijkwijzerAl,
+    #[serde(rename = "kijkwijzerUnrated")]
+    KijkwijzerUnrated,
+    #[serde(rename = "kijkwijzerUnspecified")]
+    KijkwijzerUnspecified,
+}
+
+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::Kijkwijzer12 => write!(f, "kijkwijzer12"),
+            ContentRatingKijkwijzerRating::Kijkwijzer16 => write!(f, "kijkwijzer16"),
+            ContentRatingKijkwijzerRating::Kijkwijzer18 => write!(f, "kijkwijzer18"),
+            ContentRatingKijkwijzerRating::Kijkwijzer6 => write!(f, "kijkwijzer6"),
+            ContentRatingKijkwijzerRating::Kijkwijzer9 => write!(f, "kijkwijzer9"),
+            ContentRatingKijkwijzerRating::KijkwijzerAl => write!(f, "kijkwijzerAl"),
+            ContentRatingKijkwijzerRating::KijkwijzerUnrated => write!(f, "kijkwijzerUnrated"),
+            ContentRatingKijkwijzerRating::KijkwijzerUnspecified => {
+                write!(f, "kijkwijzerUnspecified")
+            }
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingKmrbRating {
+    Undefined,
+    #[serde(rename = "kmrb12plus")]
+    Kmrb12plus,
+    /// 전체관람가
+    #[serde(rename = "kmrb15plus")]
+    Kmrb15plus,
+    /// 12세 이상 관람가
+    #[serde(rename = "kmrbAll")]
+    KmrbAll,
+    /// 15세 이상 관람가
+    #[serde(rename = "kmrbR")]
+    KmrbR,
+    #[serde(rename = "kmrbTeenr")]
+    KmrbTeenr,
+    /// 청소년 관람불가
+    #[serde(rename = "kmrbUnrated")]
+    KmrbUnrated,
+    #[serde(rename = "kmrbUnspecified")]
+    KmrbUnspecified,
+}
+
+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::Kmrb12plus => write!(f, "kmrb12plus"),
+            ContentRatingKmrbRating::Kmrb15plus => write!(f, "kmrb15plus"),
+            ContentRatingKmrbRating::KmrbAll => write!(f, "kmrbAll"),
+            ContentRatingKmrbRating::KmrbR => write!(f, "kmrbR"),
+            ContentRatingKmrbRating::KmrbTeenr => write!(f, "kmrbTeenr"),
+            ContentRatingKmrbRating::KmrbUnrated => write!(f, "kmrbUnrated"),
+            ContentRatingKmrbRating::KmrbUnspecified => write!(f, "kmrbUnspecified"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingLsfRating {
+    Undefined,
+    #[serde(rename = "lsf13")]
+    Lsf13,
+    /// SU
+    #[serde(rename = "lsf17")]
+    Lsf17,
+    /// A
+    #[serde(rename = "lsf21")]
+    Lsf21,
+    /// BO
+    #[serde(rename = "lsfA")]
+    LsfA,
+    /// 13
+    #[serde(rename = "lsfBo")]
+    LsfBo,
+    /// R
+    #[serde(rename = "lsfD")]
+    LsfD,
+    /// 17
+    #[serde(rename = "lsfR")]
+    LsfR,
+    /// D
+    #[serde(rename = "lsfSu")]
+    LsfSu,
+    /// 21
+    #[serde(rename = "lsfUnrated")]
+    LsfUnrated,
+    #[serde(rename = "lsfUnspecified")]
+    LsfUnspecified,
+}
+
+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::Lsf13 => write!(f, "lsf13"),
+            ContentRatingLsfRating::Lsf17 => write!(f, "lsf17"),
+            ContentRatingLsfRating::Lsf21 => write!(f, "lsf21"),
+            ContentRatingLsfRating::LsfA => write!(f, "lsfA"),
+            ContentRatingLsfRating::LsfBo => write!(f, "lsfBo"),
+            ContentRatingLsfRating::LsfD => write!(f, "lsfD"),
+            ContentRatingLsfRating::LsfR => write!(f, "lsfR"),
+            ContentRatingLsfRating::LsfSu => write!(f, "lsfSu"),
+            ContentRatingLsfRating::LsfUnrated => write!(f, "lsfUnrated"),
+            ContentRatingLsfRating::LsfUnspecified => write!(f, "lsfUnspecified"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingMccaaRating {
+    Undefined,
+    #[serde(rename = "mccaa12")]
+    Mccaa12,
+    /// U
+    #[serde(rename = "mccaa12a")]
+    Mccaa12a,
+    /// PG
+    #[serde(rename = "mccaa14")]
+    Mccaa14,
+    /// 12A
+    #[serde(rename = "mccaa15")]
+    Mccaa15,
+    /// 12
+    #[serde(rename = "mccaa16")]
+    Mccaa16,
+    /// 14 - this rating was removed from the new classification structure introduced in 2013.
+    #[serde(rename = "mccaa18")]
+    Mccaa18,
+    /// 15
+    #[serde(rename = "mccaaPg")]
+    MccaaPg,
+    /// 16 - this rating was removed from the new classification structure introduced in 2013.
+    #[serde(rename = "mccaaU")]
+    MccaaU,
+    /// 18
+    #[serde(rename = "mccaaUnrated")]
+    MccaaUnrated,
+    #[serde(rename = "mccaaUnspecified")]
+    MccaaUnspecified,
+}
+
+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::Mccaa12 => write!(f, "mccaa12"),
+            ContentRatingMccaaRating::Mccaa12a => write!(f, "mccaa12a"),
+            ContentRatingMccaaRating::Mccaa14 => write!(f, "mccaa14"),
+            ContentRatingMccaaRating::Mccaa15 => write!(f, "mccaa15"),
+            ContentRatingMccaaRating::Mccaa16 => write!(f, "mccaa16"),
+            ContentRatingMccaaRating::Mccaa18 => write!(f, "mccaa18"),
+            ContentRatingMccaaRating::MccaaPg => write!(f, "mccaaPg"),
+            ContentRatingMccaaRating::MccaaU => write!(f, "mccaaU"),
+            ContentRatingMccaaRating::MccaaUnrated => write!(f, "mccaaUnrated"),
+            ContentRatingMccaaRating::MccaaUnspecified => write!(f, "mccaaUnspecified"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingMccypRating {
+    Undefined,
+    #[serde(rename = "mccyp11")]
+    Mccyp11,
+    /// A
+    #[serde(rename = "mccyp15")]
+    Mccyp15,
+    /// 7
+    #[serde(rename = "mccyp7")]
+    Mccyp7,
+    /// 11
+    #[serde(rename = "mccypA")]
+    MccypA,
+    /// 15
+    #[serde(rename = "mccypUnrated")]
+    MccypUnrated,
+    #[serde(rename = "mccypUnspecified")]
+    MccypUnspecified,
+}
+
+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::Mccyp11 => write!(f, "mccyp11"),
+            ContentRatingMccypRating::Mccyp15 => write!(f, "mccyp15"),
+            ContentRatingMccypRating::Mccyp7 => write!(f, "mccyp7"),
+            ContentRatingMccypRating::MccypA => write!(f, "mccypA"),
+            ContentRatingMccypRating::MccypUnrated => write!(f, "mccypUnrated"),
+            ContentRatingMccypRating::MccypUnspecified => write!(f, "mccypUnspecified"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingMcstRating {
+    Undefined,
+    #[serde(rename = "mcst0")]
+    Mcst0,
+    /// P
+    #[serde(rename = "mcst16plus")]
+    Mcst16plus,
+    /// 0
+    #[serde(rename = "mcstC13")]
+    McstC13,
+    /// C13
+    #[serde(rename = "mcstC16")]
+    McstC16,
+    /// C16
+    #[serde(rename = "mcstC18")]
+    McstC18,
+    /// 16+
+    #[serde(rename = "mcstGPg")]
+    McstGPg,
+    /// C18
+    #[serde(rename = "mcstP")]
+    McstP,
+    /// MCST_G_PG
+    #[serde(rename = "mcstUnrated")]
+    McstUnrated,
+    #[serde(rename = "mcstUnspecified")]
+    McstUnspecified,
+}
+
+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::Mcst0 => write!(f, "mcst0"),
+            ContentRatingMcstRating::Mcst16plus => write!(f, "mcst16plus"),
+            ContentRatingMcstRating::McstC13 => write!(f, "mcstC13"),
+            ContentRatingMcstRating::McstC16 => write!(f, "mcstC16"),
+            ContentRatingMcstRating::McstC18 => write!(f, "mcstC18"),
+            ContentRatingMcstRating::McstGPg => write!(f, "mcstGPg"),
+            ContentRatingMcstRating::McstP => write!(f, "mcstP"),
+            ContentRatingMcstRating::McstUnrated => write!(f, "mcstUnrated"),
+            ContentRatingMcstRating::McstUnspecified => write!(f, "mcstUnspecified"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingMdaRating {
+    Undefined,
+    #[serde(rename = "mdaG")]
+    MdaG,
+    /// G
+    #[serde(rename = "mdaM18")]
+    MdaM18,
+    /// PG
+    #[serde(rename = "mdaNc16")]
+    MdaNc16,
+    /// PG13
+    #[serde(rename = "mdaPg")]
+    MdaPg,
+    /// NC16
+    #[serde(rename = "mdaPg13")]
+    MdaPg13,
+    /// M18
+    #[serde(rename = "mdaR21")]
+    MdaR21,
+    /// R21
+    #[serde(rename = "mdaUnrated")]
+    MdaUnrated,
+    #[serde(rename = "mdaUnspecified")]
+    MdaUnspecified,
+}
+
+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::MdaG => write!(f, "mdaG"),
+            ContentRatingMdaRating::MdaM18 => write!(f, "mdaM18"),
+            ContentRatingMdaRating::MdaNc16 => write!(f, "mdaNc16"),
+            ContentRatingMdaRating::MdaPg => write!(f, "mdaPg"),
+            ContentRatingMdaRating::MdaPg13 => write!(f, "mdaPg13"),
+            ContentRatingMdaRating::MdaR21 => write!(f, "mdaR21"),
+            ContentRatingMdaRating::MdaUnrated => write!(f, "mdaUnrated"),
+            ContentRatingMdaRating::MdaUnspecified => write!(f, "mdaUnspecified"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingMedietilsynetRating {
+    Undefined,
+    #[serde(rename = "medietilsynet11")]
+    Medietilsynet11,
+    /// A
+    #[serde(rename = "medietilsynet12")]
+    Medietilsynet12,
+    /// 6
+    #[serde(rename = "medietilsynet15")]
+    Medietilsynet15,
+    /// 7
+    #[serde(rename = "medietilsynet18")]
+    Medietilsynet18,
+    /// 9
+    #[serde(rename = "medietilsynet6")]
+    Medietilsynet6,
+    /// 11
+    #[serde(rename = "medietilsynet7")]
+    Medietilsynet7,
+    /// 12
+    #[serde(rename = "medietilsynet9")]
+    Medietilsynet9,
+    /// 15
+    #[serde(rename = "medietilsynetA")]
+    MedietilsynetA,
+    /// 18
+    #[serde(rename = "medietilsynetUnrated")]
+    MedietilsynetUnrated,
+    #[serde(rename = "medietilsynetUnspecified")]
+    MedietilsynetUnspecified,
+}
+
+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::Medietilsynet11 => write!(f, "medietilsynet11"),
+            ContentRatingMedietilsynetRating::Medietilsynet12 => write!(f, "medietilsynet12"),
+            ContentRatingMedietilsynetRating::Medietilsynet15 => write!(f, "medietilsynet15"),
+            ContentRatingMedietilsynetRating::Medietilsynet18 => write!(f, "medietilsynet18"),
+            ContentRatingMedietilsynetRating::Medietilsynet6 => write!(f, "medietilsynet6"),
+            ContentRatingMedietilsynetRating::Medietilsynet7 => write!(f, "medietilsynet7"),
+            ContentRatingMedietilsynetRating::Medietilsynet9 => write!(f, "medietilsynet9"),
+            ContentRatingMedietilsynetRating::MedietilsynetA => write!(f, "medietilsynetA"),
+            ContentRatingMedietilsynetRating::MedietilsynetUnrated => {
+                write!(f, "medietilsynetUnrated")
+            }
+            ContentRatingMedietilsynetRating::MedietilsynetUnspecified => {
+                write!(f, "medietilsynetUnspecified")
+            }
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingMekuRating {
+    Undefined,
+    #[serde(rename = "meku12")]
+    Meku12,
+    /// S
+    #[serde(rename = "meku16")]
+    Meku16,
+    /// 7
+    #[serde(rename = "meku18")]
+    Meku18,
+    /// 12
+    #[serde(rename = "meku7")]
+    Meku7,
+    /// 16
+    #[serde(rename = "mekuS")]
+    MekuS,
+    /// 18
+    #[serde(rename = "mekuUnrated")]
+    MekuUnrated,
+    #[serde(rename = "mekuUnspecified")]
+    MekuUnspecified,
+}
+
+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::Meku12 => write!(f, "meku12"),
+            ContentRatingMekuRating::Meku16 => write!(f, "meku16"),
+            ContentRatingMekuRating::Meku18 => write!(f, "meku18"),
+            ContentRatingMekuRating::Meku7 => write!(f, "meku7"),
+            ContentRatingMekuRating::MekuS => write!(f, "mekuS"),
+            ContentRatingMekuRating::MekuUnrated => write!(f, "mekuUnrated"),
+            ContentRatingMekuRating::MekuUnspecified => write!(f, "mekuUnspecified"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingMenaMpaaRating {
+    Undefined,
+    #[serde(rename = "menaMpaaG")]
+    MenaMpaaG,
+    /// G
+    #[serde(rename = "menaMpaaPg")]
+    MenaMpaaPg,
+    /// PG
+    #[serde(rename = "menaMpaaPg13")]
+    MenaMpaaPg13,
+    /// PG-13
+    #[serde(rename = "menaMpaaR")]
+    MenaMpaaR,
+    /// R
+    #[serde(rename = "menaMpaaUnrated")]
+    MenaMpaaUnrated,
+    /// To keep the same enum values as MPAA's items have, skip NC_17.
+    #[serde(rename = "menaMpaaUnspecified")]
+    MenaMpaaUnspecified,
+}
+
+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::MenaMpaaG => write!(f, "menaMpaaG"),
+            ContentRatingMenaMpaaRating::MenaMpaaPg => write!(f, "menaMpaaPg"),
+            ContentRatingMenaMpaaRating::MenaMpaaPg13 => write!(f, "menaMpaaPg13"),
+            ContentRatingMenaMpaaRating::MenaMpaaR => write!(f, "menaMpaaR"),
+            ContentRatingMenaMpaaRating::MenaMpaaUnrated => write!(f, "menaMpaaUnrated"),
+            ContentRatingMenaMpaaRating::MenaMpaaUnspecified => write!(f, "menaMpaaUnspecified"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingMibacRating {
+    Undefined,
+    #[serde(rename = "mibacT")]
+    MibacT,
+    #[serde(rename = "mibacUnrated")]
+    MibacUnrated,
+    #[serde(rename = "mibacUnspecified")]
+    MibacUnspecified,
+    #[serde(rename = "mibacVap")]
+    MibacVap,
+    #[serde(rename = "mibacVm12")]
+    MibacVm12,
+    #[serde(rename = "mibacVm14")]
+    MibacVm14,
+    #[serde(rename = "mibacVm18")]
+    MibacVm18,
+}
+
+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::MibacT => write!(f, "mibacT"),
+            ContentRatingMibacRating::MibacUnrated => write!(f, "mibacUnrated"),
+            ContentRatingMibacRating::MibacUnspecified => write!(f, "mibacUnspecified"),
+            ContentRatingMibacRating::MibacVap => write!(f, "mibacVap"),
+            ContentRatingMibacRating::MibacVm12 => write!(f, "mibacVm12"),
+            ContentRatingMibacRating::MibacVm14 => write!(f, "mibacVm14"),
+            ContentRatingMibacRating::MibacVm18 => write!(f, "mibacVm18"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingMocRating {
+    Undefined,
+    #[serde(rename = "moc12")]
+    Moc12,
+    /// E
+    #[serde(rename = "moc15")]
+    Moc15,
+    /// T
+    #[serde(rename = "moc18")]
+    Moc18,
+    /// 7
+    #[serde(rename = "moc7")]
+    Moc7,
+    /// 12
+    #[serde(rename = "mocBanned")]
+    MocBanned,
+    /// 15
+    #[serde(rename = "mocE")]
+    MocE,
+    /// 18
+    #[serde(rename = "mocT")]
+    MocT,
+    /// X
+    #[serde(rename = "mocUnrated")]
+    MocUnrated,
+    /// Banned
+    #[serde(rename = "mocUnspecified")]
+    MocUnspecified,
+    #[serde(rename = "mocX")]
+    MocX,
+}
+
+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::Moc12 => write!(f, "moc12"),
+            ContentRatingMocRating::Moc15 => write!(f, "moc15"),
+            ContentRatingMocRating::Moc18 => write!(f, "moc18"),
+            ContentRatingMocRating::Moc7 => write!(f, "moc7"),
+            ContentRatingMocRating::MocBanned => write!(f, "mocBanned"),
+            ContentRatingMocRating::MocE => write!(f, "mocE"),
+            ContentRatingMocRating::MocT => write!(f, "mocT"),
+            ContentRatingMocRating::MocUnrated => write!(f, "mocUnrated"),
+            ContentRatingMocRating::MocUnspecified => write!(f, "mocUnspecified"),
+            ContentRatingMocRating::MocX => write!(f, "mocX"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingMoctwRating {
+    Undefined,
+    #[serde(rename = "moctwG")]
+    MoctwG,
+    /// G
+    #[serde(rename = "moctwP")]
+    MoctwP,
+    /// P
+    #[serde(rename = "moctwPg")]
+    MoctwPg,
+    /// PG
+    #[serde(rename = "moctwR")]
+    MoctwR,
+    /// R
+    #[serde(rename = "moctwR12")]
+    MoctwR12,
+    #[serde(rename = "moctwR15")]
+    MoctwR15,
+    /// R-12
+    #[serde(rename = "moctwUnrated")]
+    MoctwUnrated,
+    /// R-15
+    #[serde(rename = "moctwUnspecified")]
+    MoctwUnspecified,
+}
+
+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::MoctwG => write!(f, "moctwG"),
+            ContentRatingMoctwRating::MoctwP => write!(f, "moctwP"),
+            ContentRatingMoctwRating::MoctwPg => write!(f, "moctwPg"),
+            ContentRatingMoctwRating::MoctwR => write!(f, "moctwR"),
+            ContentRatingMoctwRating::MoctwR12 => write!(f, "moctwR12"),
+            ContentRatingMoctwRating::MoctwR15 => write!(f, "moctwR15"),
+            ContentRatingMoctwRating::MoctwUnrated => write!(f, "moctwUnrated"),
+            ContentRatingMoctwRating::MoctwUnspecified => write!(f, "moctwUnspecified"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingMpaaRating {
+    Undefined,
+    #[serde(rename = "mpaaG")]
+    MpaaG,
+    /// G
+    #[serde(rename = "mpaaNc17")]
+    MpaaNc17,
+    /// PG
+    #[serde(rename = "mpaaPg")]
+    MpaaPg,
+    /// PG-13
+    #[serde(rename = "mpaaPg13")]
+    MpaaPg13,
+    /// R
+    #[serde(rename = "mpaaR")]
+    MpaaR,
+    /// NC-17
+    #[serde(rename = "mpaaUnrated")]
+    MpaaUnrated,
+    /// ! X
+    #[serde(rename = "mpaaUnspecified")]
+    MpaaUnspecified,
+    #[serde(rename = "mpaaX")]
+    MpaaX,
+}
+
+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::MpaaG => write!(f, "mpaaG"),
+            ContentRatingMpaaRating::MpaaNc17 => write!(f, "mpaaNc17"),
+            ContentRatingMpaaRating::MpaaPg => write!(f, "mpaaPg"),
+            ContentRatingMpaaRating::MpaaPg13 => write!(f, "mpaaPg13"),
+            ContentRatingMpaaRating::MpaaR => write!(f, "mpaaR"),
+            ContentRatingMpaaRating::MpaaUnrated => write!(f, "mpaaUnrated"),
+            ContentRatingMpaaRating::MpaaUnspecified => write!(f, "mpaaUnspecified"),
+            ContentRatingMpaaRating::MpaaX => write!(f, "mpaaX"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingMpaatRating {
+    Undefined,
+    #[serde(rename = "mpaatGb")]
+    MpaatGb,
+    /// GB
+    #[serde(rename = "mpaatRb")]
+    MpaatRb,
+    /// RB
+    #[serde(rename = "mpaatUnspecified")]
+    MpaatUnspecified,
+}
+
+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::MpaatGb => write!(f, "mpaatGb"),
+            ContentRatingMpaatRating::MpaatRb => write!(f, "mpaatRb"),
+            ContentRatingMpaatRating::MpaatUnspecified => write!(f, "mpaatUnspecified"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingMtrcbRating {
+    Undefined,
+    #[serde(rename = "mtrcbG")]
+    MtrcbG,
+    /// G
+    #[serde(rename = "mtrcbPg")]
+    MtrcbPg,
+    /// PG
+    #[serde(rename = "mtrcbR13")]
+    MtrcbR13,
+    /// R-13
+    #[serde(rename = "mtrcbR16")]
+    MtrcbR16,
+    /// R-16
+    #[serde(rename = "mtrcbR18")]
+    MtrcbR18,
+    /// R-18
+    #[serde(rename = "mtrcbUnrated")]
+    MtrcbUnrated,
+    /// X
+    #[serde(rename = "mtrcbUnspecified")]
+    MtrcbUnspecified,
+    #[serde(rename = "mtrcbX")]
+    MtrcbX,
+}
+
+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::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::MtrcbUnrated => write!(f, "mtrcbUnrated"),
+            ContentRatingMtrcbRating::MtrcbUnspecified => write!(f, "mtrcbUnspecified"),
+            ContentRatingMtrcbRating::MtrcbX => write!(f, "mtrcbX"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingNbcRating {
+    Undefined,
+    #[serde(rename = "nbc12plus")]
+    Nbc12plus,
+    /// G
+    #[serde(rename = "nbc15plus")]
+    Nbc15plus,
+    /// PG
+    #[serde(rename = "nbc18plus")]
+    Nbc18plus,
+    /// 12+
+    #[serde(rename = "nbc18plusr")]
+    Nbc18plusr,
+    /// 15+
+    #[serde(rename = "nbcG")]
+    NbcG,
+    /// 18+
+    #[serde(rename = "nbcPg")]
+    NbcPg,
+    /// 18+R
+    #[serde(rename = "nbcPu")]
+    NbcPu,
+    /// PU
+    #[serde(rename = "nbcUnrated")]
+    NbcUnrated,
+    #[serde(rename = "nbcUnspecified")]
+    NbcUnspecified,
+}
+
+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::Nbc12plus => write!(f, "nbc12plus"),
+            ContentRatingNbcRating::Nbc15plus => write!(f, "nbc15plus"),
+            ContentRatingNbcRating::Nbc18plus => write!(f, "nbc18plus"),
+            ContentRatingNbcRating::Nbc18plusr => write!(f, "nbc18plusr"),
+            ContentRatingNbcRating::NbcG => write!(f, "nbcG"),
+            ContentRatingNbcRating::NbcPg => write!(f, "nbcPg"),
+            ContentRatingNbcRating::NbcPu => write!(f, "nbcPu"),
+            ContentRatingNbcRating::NbcUnrated => write!(f, "nbcUnrated"),
+            ContentRatingNbcRating::NbcUnspecified => write!(f, "nbcUnspecified"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingNbcplRating {
+    Undefined,
+    #[serde(rename = "nbcpl18plus")]
+    Nbcpl18plus,
+    #[serde(rename = "nbcplI")]
+    NbcplI,
+    #[serde(rename = "nbcplIi")]
+    NbcplIi,
+    #[serde(rename = "nbcplIii")]
+    NbcplIii,
+    #[serde(rename = "nbcplIv")]
+    NbcplIv,
+    #[serde(rename = "nbcplUnrated")]
+    NbcplUnrated,
+    #[serde(rename = "nbcplUnspecified")]
+    NbcplUnspecified,
+}
+
+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::Nbcpl18plus => write!(f, "nbcpl18plus"),
+            ContentRatingNbcplRating::NbcplI => write!(f, "nbcplI"),
+            ContentRatingNbcplRating::NbcplIi => write!(f, "nbcplIi"),
+            ContentRatingNbcplRating::NbcplIii => write!(f, "nbcplIii"),
+            ContentRatingNbcplRating::NbcplIv => write!(f, "nbcplIv"),
+            ContentRatingNbcplRating::NbcplUnrated => write!(f, "nbcplUnrated"),
+            ContentRatingNbcplRating::NbcplUnspecified => write!(f, "nbcplUnspecified"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingNfrcRating {
+    Undefined,
+    #[serde(rename = "nfrcA")]
+    NfrcA,
+    /// A
+    #[serde(rename = "nfrcB")]
+    NfrcB,
+    /// B
+    #[serde(rename = "nfrcC")]
+    NfrcC,
+    /// C
+    #[serde(rename = "nfrcD")]
+    NfrcD,
+    /// D
+    #[serde(rename = "nfrcUnrated")]
+    NfrcUnrated,
+    /// X
+    #[serde(rename = "nfrcUnspecified")]
+    NfrcUnspecified,
+    #[serde(rename = "nfrcX")]
+    NfrcX,
+}
+
+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::NfrcA => write!(f, "nfrcA"),
+            ContentRatingNfrcRating::NfrcB => write!(f, "nfrcB"),
+            ContentRatingNfrcRating::NfrcC => write!(f, "nfrcC"),
+            ContentRatingNfrcRating::NfrcD => write!(f, "nfrcD"),
+            ContentRatingNfrcRating::NfrcUnrated => write!(f, "nfrcUnrated"),
+            ContentRatingNfrcRating::NfrcUnspecified => write!(f, "nfrcUnspecified"),
+            ContentRatingNfrcRating::NfrcX => write!(f, "nfrcX"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingNfvcbRating {
+    Undefined,
+    #[serde(rename = "nfvcb12")]
+    Nfvcb12,
+    /// G
+    #[serde(rename = "nfvcb12a")]
+    Nfvcb12a,
+    /// PG
+    #[serde(rename = "nfvcb15")]
+    Nfvcb15,
+    /// 12
+    #[serde(rename = "nfvcb18")]
+    Nfvcb18,
+    /// 12A
+    #[serde(rename = "nfvcbG")]
+    NfvcbG,
+    /// 15
+    #[serde(rename = "nfvcbPg")]
+    NfvcbPg,
+    /// 18
+    #[serde(rename = "nfvcbRe")]
+    NfvcbRe,
+    /// RE
+    #[serde(rename = "nfvcbUnrated")]
+    NfvcbUnrated,
+    #[serde(rename = "nfvcbUnspecified")]
+    NfvcbUnspecified,
+}
+
+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::Nfvcb12 => write!(f, "nfvcb12"),
+            ContentRatingNfvcbRating::Nfvcb12a => write!(f, "nfvcb12a"),
+            ContentRatingNfvcbRating::Nfvcb15 => write!(f, "nfvcb15"),
+            ContentRatingNfvcbRating::Nfvcb18 => write!(f, "nfvcb18"),
+            ContentRatingNfvcbRating::NfvcbG => write!(f, "nfvcbG"),
+            ContentRatingNfvcbRating::NfvcbPg => write!(f, "nfvcbPg"),
+            ContentRatingNfvcbRating::NfvcbRe => write!(f, "nfvcbRe"),
+            ContentRatingNfvcbRating::NfvcbUnrated => write!(f, "nfvcbUnrated"),
+            ContentRatingNfvcbRating::NfvcbUnspecified => write!(f, "nfvcbUnspecified"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingNkclvRating {
+    Undefined,
+    #[serde(rename = "nkclv12plus")]
+    Nkclv12plus,
+    /// U
+    #[serde(rename = "nkclv16plus")]
+    Nkclv16plus,
+    /// 7+
+    #[serde(rename = "nkclv18plus")]
+    Nkclv18plus,
+    /// 12+
+    #[serde(rename = "nkclv7plus")]
+    Nkclv7plus,
+    /// ! 16+
+    #[serde(rename = "nkclvU")]
+    NkclvU,
+    /// 18+
+    #[serde(rename = "nkclvUnrated")]
+    NkclvUnrated,
+    #[serde(rename = "nkclvUnspecified")]
+    NkclvUnspecified,
+}
+
+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::Nkclv12plus => write!(f, "nkclv12plus"),
+            ContentRatingNkclvRating::Nkclv16plus => write!(f, "nkclv16plus"),
+            ContentRatingNkclvRating::Nkclv18plus => write!(f, "nkclv18plus"),
+            ContentRatingNkclvRating::Nkclv7plus => write!(f, "nkclv7plus"),
+            ContentRatingNkclvRating::NkclvU => write!(f, "nkclvU"),
+            ContentRatingNkclvRating::NkclvUnrated => write!(f, "nkclvUnrated"),
+            ContentRatingNkclvRating::NkclvUnspecified => write!(f, "nkclvUnspecified"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingNmcRating {
+    Undefined,
+    #[serde(rename = "nmc15plus")]
+    Nmc15plus,
+    /// G
+    #[serde(rename = "nmc18plus")]
+    Nmc18plus,
+    /// PG
+    #[serde(rename = "nmc18tc")]
+    Nmc18tc,
+    /// PG-13
+    #[serde(rename = "nmcG")]
+    NmcG,
+    /// PG-15
+    #[serde(rename = "nmcPg")]
+    NmcPg,
+    /// 15+
+    #[serde(rename = "nmcPg13")]
+    NmcPg13,
+    /// 18+
+    #[serde(rename = "nmcPg15")]
+    NmcPg15,
+    /// 18TC
+    #[serde(rename = "nmcUnrated")]
+    NmcUnrated,
+    #[serde(rename = "nmcUnspecified")]
+    NmcUnspecified,
+}
+
+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::Nmc15plus => write!(f, "nmc15plus"),
+            ContentRatingNmcRating::Nmc18plus => write!(f, "nmc18plus"),
+            ContentRatingNmcRating::Nmc18tc => write!(f, "nmc18tc"),
+            ContentRatingNmcRating::NmcG => write!(f, "nmcG"),
+            ContentRatingNmcRating::NmcPg => write!(f, "nmcPg"),
+            ContentRatingNmcRating::NmcPg13 => write!(f, "nmcPg13"),
+            ContentRatingNmcRating::NmcPg15 => write!(f, "nmcPg15"),
+            ContentRatingNmcRating::NmcUnrated => write!(f, "nmcUnrated"),
+            ContentRatingNmcRating::NmcUnspecified => write!(f, "nmcUnspecified"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingOflcRating {
+    Undefined,
+    #[serde(rename = "oflcG")]
+    OflcG,
+    /// G
+    #[serde(rename = "oflcM")]
+    OflcM,
+    /// PG
+    #[serde(rename = "oflcPg")]
+    OflcPg,
+    /// M
+    #[serde(rename = "oflcR13")]
+    OflcR13,
+    /// R13
+    #[serde(rename = "oflcR15")]
+    OflcR15,
+    /// R15
+    #[serde(rename = "oflcR16")]
+    OflcR16,
+    /// R16
+    #[serde(rename = "oflcR18")]
+    OflcR18,
+    /// R18
+    #[serde(rename = "oflcRp13")]
+    OflcRp13,
+    #[serde(rename = "oflcRp16")]
+    OflcRp16,
+    /// RP13
+    #[serde(rename = "oflcRp18")]
+    OflcRp18,
+    /// RP16
+    #[serde(rename = "oflcUnrated")]
+    OflcUnrated,
+    /// RP18
+    #[serde(rename = "oflcUnspecified")]
+    OflcUnspecified,
+}
+
+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::OflcG => write!(f, "oflcG"),
+            ContentRatingOflcRating::OflcM => write!(f, "oflcM"),
+            ContentRatingOflcRating::OflcPg => write!(f, "oflcPg"),
+            ContentRatingOflcRating::OflcR13 => write!(f, "oflcR13"),
+            ContentRatingOflcRating::OflcR15 => write!(f, "oflcR15"),
+            ContentRatingOflcRating::OflcR16 => write!(f, "oflcR16"),
+            ContentRatingOflcRating::OflcR18 => write!(f, "oflcR18"),
+            ContentRatingOflcRating::OflcRp13 => write!(f, "oflcRp13"),
+            ContentRatingOflcRating::OflcRp16 => write!(f, "oflcRp16"),
+            ContentRatingOflcRating::OflcRp18 => write!(f, "oflcRp18"),
+            ContentRatingOflcRating::OflcUnrated => write!(f, "oflcUnrated"),
+            ContentRatingOflcRating::OflcUnspecified => write!(f, "oflcUnspecified"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingPefilmRating {
+    Undefined,
+    #[serde(rename = "pefilm14")]
+    Pefilm14,
+    /// PT
+    #[serde(rename = "pefilm18")]
+    Pefilm18,
+    /// PG
+    #[serde(rename = "pefilmPg")]
+    PefilmPg,
+    /// 14
+    #[serde(rename = "pefilmPt")]
+    PefilmPt,
+    /// 18
+    #[serde(rename = "pefilmUnrated")]
+    PefilmUnrated,
+    #[serde(rename = "pefilmUnspecified")]
+    PefilmUnspecified,
+}
+
+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::Pefilm14 => write!(f, "pefilm14"),
+            ContentRatingPefilmRating::Pefilm18 => write!(f, "pefilm18"),
+            ContentRatingPefilmRating::PefilmPg => write!(f, "pefilmPg"),
+            ContentRatingPefilmRating::PefilmPt => write!(f, "pefilmPt"),
+            ContentRatingPefilmRating::PefilmUnrated => write!(f, "pefilmUnrated"),
+            ContentRatingPefilmRating::PefilmUnspecified => write!(f, "pefilmUnspecified"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingRcnofRating {
+    Undefined,
+    #[serde(rename = "rcnofI")]
+    RcnofI,
+    #[serde(rename = "rcnofIi")]
+    RcnofIi,
+    #[serde(rename = "rcnofIii")]
+    RcnofIii,
+    #[serde(rename = "rcnofIv")]
+    RcnofIv,
+    #[serde(rename = "rcnofUnrated")]
+    RcnofUnrated,
+    #[serde(rename = "rcnofUnspecified")]
+    RcnofUnspecified,
+    #[serde(rename = "rcnofV")]
+    RcnofV,
+    #[serde(rename = "rcnofVi")]
+    RcnofVi,
+}
+
+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::RcnofI => write!(f, "rcnofI"),
+            ContentRatingRcnofRating::RcnofIi => write!(f, "rcnofIi"),
+            ContentRatingRcnofRating::RcnofIii => write!(f, "rcnofIii"),
+            ContentRatingRcnofRating::RcnofIv => write!(f, "rcnofIv"),
+            ContentRatingRcnofRating::RcnofUnrated => write!(f, "rcnofUnrated"),
+            ContentRatingRcnofRating::RcnofUnspecified => write!(f, "rcnofUnspecified"),
+            ContentRatingRcnofRating::RcnofV => write!(f, "rcnofV"),
+            ContentRatingRcnofRating::RcnofVi => write!(f, "rcnofVi"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingResorteviolenciaRating {
+    Undefined,
+    #[serde(rename = "resorteviolenciaA")]
+    ResorteviolenciaA,
+    /// A
+    #[serde(rename = "resorteviolenciaB")]
+    ResorteviolenciaB,
+    /// B
+    #[serde(rename = "resorteviolenciaC")]
+    ResorteviolenciaC,
+    /// C
+    #[serde(rename = "resorteviolenciaD")]
+    ResorteviolenciaD,
+    /// D
+    #[serde(rename = "resorteviolenciaE")]
+    ResorteviolenciaE,
+    /// E
+    #[serde(rename = "resorteviolenciaUnrated")]
+    ResorteviolenciaUnrated,
+    #[serde(rename = "resorteviolenciaUnspecified")]
+    ResorteviolenciaUnspecified,
+}
+
+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::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")
+            }
+            ContentRatingResorteviolenciaRating::ResorteviolenciaUnspecified => {
+                write!(f, "resorteviolenciaUnspecified")
+            }
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingRtcRating {
+    Undefined,
+    #[serde(rename = "rtcA")]
+    RtcA,
+    /// AA
+    #[serde(rename = "rtcAa")]
+    RtcAa,
+    /// A
+    #[serde(rename = "rtcB")]
+    RtcB,
+    /// B
+    #[serde(rename = "rtcB15")]
+    RtcB15,
+    /// B15
+    #[serde(rename = "rtcC")]
+    RtcC,
+    /// C
+    #[serde(rename = "rtcD")]
+    RtcD,
+    /// D
+    #[serde(rename = "rtcUnrated")]
+    RtcUnrated,
+    #[serde(rename = "rtcUnspecified")]
+    RtcUnspecified,
+}
+
+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::RtcA => write!(f, "rtcA"),
+            ContentRatingRtcRating::RtcAa => write!(f, "rtcAa"),
+            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"),
+            ContentRatingRtcRating::RtcUnspecified => write!(f, "rtcUnspecified"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingRteRating {
+    Undefined,
+    #[serde(rename = "rteCh")]
+    RteCh,
+    /// GA
+    #[serde(rename = "rteGa")]
+    RteGa,
+    /// CH
+    #[serde(rename = "rteMa")]
+    RteMa,
+    /// PS
+    #[serde(rename = "rtePs")]
+    RtePs,
+    /// MA
+    #[serde(rename = "rteUnrated")]
+    RteUnrated,
+    #[serde(rename = "rteUnspecified")]
+    RteUnspecified,
+}
+
+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::RteCh => write!(f, "rteCh"),
+            ContentRatingRteRating::RteGa => write!(f, "rteGa"),
+            ContentRatingRteRating::RteMa => write!(f, "rteMa"),
+            ContentRatingRteRating::RtePs => write!(f, "rtePs"),
+            ContentRatingRteRating::RteUnrated => write!(f, "rteUnrated"),
+            ContentRatingRteRating::RteUnspecified => write!(f, "rteUnspecified"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingRussiaRating {
+    Undefined,
+    #[serde(rename = "russia0")]
+    Russia0,
+    /// 0+
+    #[serde(rename = "russia12")]
+    Russia12,
+    /// 6+
+    #[serde(rename = "russia16")]
+    Russia16,
+    /// 12+
+    #[serde(rename = "russia18")]
+    Russia18,
+    /// 16+
+    #[serde(rename = "russia6")]
+    Russia6,
+    /// 18+
+    #[serde(rename = "russiaUnrated")]
+    RussiaUnrated,
+    #[serde(rename = "russiaUnspecified")]
+    RussiaUnspecified,
+}
+
+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::Russia0 => write!(f, "russia0"),
+            ContentRatingRussiaRating::Russia12 => write!(f, "russia12"),
+            ContentRatingRussiaRating::Russia16 => write!(f, "russia16"),
+            ContentRatingRussiaRating::Russia18 => write!(f, "russia18"),
+            ContentRatingRussiaRating::Russia6 => write!(f, "russia6"),
+            ContentRatingRussiaRating::RussiaUnrated => write!(f, "russiaUnrated"),
+            ContentRatingRussiaRating::RussiaUnspecified => write!(f, "russiaUnspecified"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingSkfilmRating {
+    Undefined,
+    #[serde(rename = "skfilmG")]
+    SkfilmG,
+    /// G
+    #[serde(rename = "skfilmP2")]
+    SkfilmP2,
+    /// P2
+    #[serde(rename = "skfilmP5")]
+    SkfilmP5,
+    /// P5
+    #[serde(rename = "skfilmP8")]
+    SkfilmP8,
+    /// P8
+    #[serde(rename = "skfilmUnrated")]
+    SkfilmUnrated,
+    #[serde(rename = "skfilmUnspecified")]
+    SkfilmUnspecified,
+}
+
+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::SkfilmG => write!(f, "skfilmG"),
+            ContentRatingSkfilmRating::SkfilmP2 => write!(f, "skfilmP2"),
+            ContentRatingSkfilmRating::SkfilmP5 => write!(f, "skfilmP5"),
+            ContentRatingSkfilmRating::SkfilmP8 => write!(f, "skfilmP8"),
+            ContentRatingSkfilmRating::SkfilmUnrated => write!(f, "skfilmUnrated"),
+            ContentRatingSkfilmRating::SkfilmUnspecified => write!(f, "skfilmUnspecified"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingSmaisRating {
+    Undefined,
+    #[serde(rename = "smais12")]
+    Smais12,
+    /// L
+    #[serde(rename = "smais14")]
+    Smais14,
+    /// 7
+    #[serde(rename = "smais16")]
+    Smais16,
+    /// 12
+    #[serde(rename = "smais18")]
+    Smais18,
+    /// 14
+    #[serde(rename = "smais7")]
+    Smais7,
+    /// 16
+    #[serde(rename = "smaisL")]
+    SmaisL,
+    /// 18
+    #[serde(rename = "smaisUnrated")]
+    SmaisUnrated,
+    #[serde(rename = "smaisUnspecified")]
+    SmaisUnspecified,
+}
+
+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::Smais12 => write!(f, "smais12"),
+            ContentRatingSmaisRating::Smais14 => write!(f, "smais14"),
+            ContentRatingSmaisRating::Smais16 => write!(f, "smais16"),
+            ContentRatingSmaisRating::Smais18 => write!(f, "smais18"),
+            ContentRatingSmaisRating::Smais7 => write!(f, "smais7"),
+            ContentRatingSmaisRating::SmaisL => write!(f, "smaisL"),
+            ContentRatingSmaisRating::SmaisUnrated => write!(f, "smaisUnrated"),
+            ContentRatingSmaisRating::SmaisUnspecified => write!(f, "smaisUnspecified"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingSmsaRating {
+    Undefined,
+    #[serde(rename = "smsa11")]
+    Smsa11,
+    /// All ages
+    #[serde(rename = "smsa15")]
+    Smsa15,
+    /// 7
+    #[serde(rename = "smsa7")]
+    Smsa7,
+    /// 11
+    #[serde(rename = "smsaA")]
+    SmsaA,
+    /// 15
+    #[serde(rename = "smsaUnrated")]
+    SmsaUnrated,
+    #[serde(rename = "smsaUnspecified")]
+    SmsaUnspecified,
+}
+
+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::Smsa11 => write!(f, "smsa11"),
+            ContentRatingSmsaRating::Smsa15 => write!(f, "smsa15"),
+            ContentRatingSmsaRating::Smsa7 => write!(f, "smsa7"),
+            ContentRatingSmsaRating::SmsaA => write!(f, "smsaA"),
+            ContentRatingSmsaRating::SmsaUnrated => write!(f, "smsaUnrated"),
+            ContentRatingSmsaRating::SmsaUnspecified => write!(f, "smsaUnspecified"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingTvpgRating {
+    Undefined,
+    #[serde(rename = "pg14")]
+    Pg14,
+    /// TV-Y
+    #[serde(rename = "tvpgG")]
+    TvpgG,
+    /// TV-Y7
+    #[serde(rename = "tvpgMa")]
+    TvpgMa,
+    /// TV-Y7-FV
+    #[serde(rename = "tvpgPg")]
+    TvpgPg,
+    /// TV-G
+    #[serde(rename = "tvpgUnrated")]
+    TvpgUnrated,
+    /// TV-PG
+    #[serde(rename = "tvpgUnspecified")]
+    TvpgUnspecified,
+    /// TV-14
+    #[serde(rename = "tvpgY")]
+    TvpgY,
+    /// TV-MA
+    #[serde(rename = "tvpgY7")]
+    TvpgY7,
+    #[serde(rename = "tvpgY7Fv")]
+    TvpgY7Fv,
+}
+
+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::Pg14 => write!(f, "pg14"),
+            ContentRatingTvpgRating::TvpgG => write!(f, "tvpgG"),
+            ContentRatingTvpgRating::TvpgMa => write!(f, "tvpgMa"),
+            ContentRatingTvpgRating::TvpgPg => write!(f, "tvpgPg"),
+            ContentRatingTvpgRating::TvpgUnrated => write!(f, "tvpgUnrated"),
+            ContentRatingTvpgRating::TvpgUnspecified => write!(f, "tvpgUnspecified"),
+            ContentRatingTvpgRating::TvpgY => write!(f, "tvpgY"),
+            ContentRatingTvpgRating::TvpgY7 => write!(f, "tvpgY7"),
+            ContentRatingTvpgRating::TvpgY7Fv => write!(f, "tvpgY7Fv"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ContentRatingYtRating {
+    Undefined,
+    #[serde(rename = "ytAgeRestricted")]
+    YtAgeRestricted,
+    #[serde(rename = "ytUnspecified")]
+    YtUnspecified,
+}
+
+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::YtAgeRestricted => write!(f, "ytAgeRestricted"),
+            ContentRatingYtRating::YtUnspecified => write!(f, "ytUnspecified"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum InvideoPositionCornerPosition {
+    Undefined,
+    #[serde(rename = "bottomLeft")]
+    BottomLeft,
+    #[serde(rename = "bottomRight")]
+    BottomRight,
+    #[serde(rename = "topLeft")]
+    TopLeft,
+    #[serde(rename = "topRight")]
+    TopRight,
+}
+
+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::BottomLeft => write!(f, "bottomLeft"),
+            InvideoPositionCornerPosition::BottomRight => write!(f, "bottomRight"),
+            InvideoPositionCornerPosition::TopLeft => write!(f, "topLeft"),
+            InvideoPositionCornerPosition::TopRight => write!(f, "topRight"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum InvideoPositionType {
+    Undefined,
+    #[serde(rename = "corner")]
+    Corner,
+}
+
+impl std::default::Default for InvideoPositionType {
+    fn default() -> InvideoPositionType {
+        InvideoPositionType::Undefined
+    }
+}
+
+impl std::fmt::Display for InvideoPositionType {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            InvideoPositionType::Undefined => write!(f, "undefined"),
+            InvideoPositionType::Corner => write!(f, "corner"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum InvideoTimingType {
+    Undefined,
+    #[serde(rename = "offsetFromEnd")]
+    OffsetFromEnd,
+    #[serde(rename = "offsetFromStart")]
+    OffsetFromStart,
+}
+
+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::OffsetFromEnd => write!(f, "offsetFromEnd"),
+            InvideoTimingType::OffsetFromStart => write!(f, "offsetFromStart"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum LiveBroadcastContentDetailsClosedCaptionsType {
+    Undefined,
+    #[serde(rename = "closedCaptionsDisabled")]
+    ClosedCaptionsDisabled,
+    #[serde(rename = "closedCaptionsEmbedded")]
+    ClosedCaptionsEmbedded,
+    #[serde(rename = "closedCaptionsHttpPost")]
+    ClosedCaptionsHttpPost,
+    #[serde(rename = "closedCaptionsTypeUnspecified")]
+    ClosedCaptionsTypeUnspecified,
+}
+
+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::ClosedCaptionsDisabled => {
+                write!(f, "closedCaptionsDisabled")
+            }
+            LiveBroadcastContentDetailsClosedCaptionsType::ClosedCaptionsEmbedded => {
+                write!(f, "closedCaptionsEmbedded")
+            }
+            LiveBroadcastContentDetailsClosedCaptionsType::ClosedCaptionsHttpPost => {
+                write!(f, "closedCaptionsHttpPost")
+            }
+            LiveBroadcastContentDetailsClosedCaptionsType::ClosedCaptionsTypeUnspecified => {
+                write!(f, "closedCaptionsTypeUnspecified")
+            }
+        };
+        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 = "low")]
+    Low,
+    /// Best for: near real-time interaction, with minimal playback buffering.
+    #[serde(rename = "normal")]
+    Normal,
+    /// 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::Low => write!(f, "low"),
+            LiveBroadcastContentDetailsLatencyPreference::Normal => write!(f, "normal"),
+            LiveBroadcastContentDetailsLatencyPreference::UltraLow => write!(f, "ultraLow"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum LiveBroadcastContentDetailsProjection {
+    Undefined,
+    #[serde(rename = "360")]
+    _360,
+    #[serde(rename = "mesh")]
+    Mesh,
+    #[serde(rename = "projectionUnspecified")]
+    ProjectionUnspecified,
+    #[serde(rename = "rectangular")]
+    Rectangular,
+}
+
+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::_360 => write!(f, "360"),
+            LiveBroadcastContentDetailsProjection::Mesh => write!(f, "mesh"),
+            LiveBroadcastContentDetailsProjection::ProjectionUnspecified => {
+                write!(f, "projectionUnspecified")
+            }
+            LiveBroadcastContentDetailsProjection::Rectangular => write!(f, "rectangular"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum LiveBroadcastContentDetailsStereoLayout {
+    Undefined,
+    #[serde(rename = "leftRight")]
+    LeftRight,
+    #[serde(rename = "mono")]
+    Mono,
+    #[serde(rename = "stereoLayoutUnspecified")]
+    StereoLayoutUnspecified,
+    #[serde(rename = "topBottom")]
+    TopBottom,
+}
+
+impl std::default::Default for LiveBroadcastContentDetailsStereoLayout {
+    fn default() -> LiveBroadcastContentDetailsStereoLayout {
+        LiveBroadcastContentDetailsStereoLayout::Undefined
+    }
+}
+
+impl std::fmt::Display for LiveBroadcastContentDetailsStereoLayout {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            LiveBroadcastContentDetailsStereoLayout::Undefined => write!(f, "undefined"),
+            LiveBroadcastContentDetailsStereoLayout::LeftRight => write!(f, "leftRight"),
+            LiveBroadcastContentDetailsStereoLayout::Mono => write!(f, "mono"),
+            LiveBroadcastContentDetailsStereoLayout::StereoLayoutUnspecified => {
+                write!(f, "stereoLayoutUnspecified")
+            }
+            LiveBroadcastContentDetailsStereoLayout::TopBottom => write!(f, "topBottom"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum LiveBroadcastStatusLifeCycleStatus {
+    Undefined,
+    /// No value or the value is unknown.
+    #[serde(rename = "complete")]
+    Complete,
+    /// Incomplete settings, but otherwise valid
+    #[serde(rename = "created")]
+    Created,
+    /// Complete settings
+    #[serde(rename = "lifeCycleStatusUnspecified")]
+    LifeCycleStatusUnspecified,
+    /// Visible only to partner, may need special UI treatment
+    #[serde(rename = "live")]
+    Live,
+    /// Viper is recording; this means the "clock" is running
+    #[serde(rename = "liveStarting")]
+    LiveStarting,
+    /// The broadcast is finished.
+    #[serde(rename = "ready")]
+    Ready,
+    /// 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 = "testing")]
+    Testing,
+}
+
+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::Complete => write!(f, "complete"),
+            LiveBroadcastStatusLifeCycleStatus::Created => write!(f, "created"),
+            LiveBroadcastStatusLifeCycleStatus::LifeCycleStatusUnspecified => {
+                write!(f, "lifeCycleStatusUnspecified")
+            }
+            LiveBroadcastStatusLifeCycleStatus::Live => write!(f, "live"),
+            LiveBroadcastStatusLifeCycleStatus::LiveStarting => write!(f, "liveStarting"),
+            LiveBroadcastStatusLifeCycleStatus::Ready => write!(f, "ready"),
+            LiveBroadcastStatusLifeCycleStatus::Revoked => write!(f, "revoked"),
+            LiveBroadcastStatusLifeCycleStatus::TestStarting => write!(f, "testStarting"),
+            LiveBroadcastStatusLifeCycleStatus::Testing => write!(f, "testing"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum LiveBroadcastStatusLiveBroadcastPriority {
+    Undefined,
+    #[serde(rename = "high")]
+    High,
+    /// Low priority broadcast: for low view count HoAs or other low priority broadcasts.
+    #[serde(rename = "liveBroadcastPriorityUnspecified")]
+    LiveBroadcastPriorityUnspecified,
+    /// Normal priority broadcast: for regular HoAs and broadcasts.
+    #[serde(rename = "low")]
+    Low,
+    /// High priority broadcast: for high profile HoAs, like PixelCorp ones.
+    #[serde(rename = "normal")]
+    Normal,
+}
+
+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::High => write!(f, "high"),
+            LiveBroadcastStatusLiveBroadcastPriority::LiveBroadcastPriorityUnspecified => {
+                write!(f, "liveBroadcastPriorityUnspecified")
+            }
+            LiveBroadcastStatusLiveBroadcastPriority::Low => write!(f, "low"),
+            LiveBroadcastStatusLiveBroadcastPriority::Normal => write!(f, "normal"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum LiveBroadcastStatusPrivacyStatus {
+    Undefined,
+    #[serde(rename = "private")]
+    Private,
+    #[serde(rename = "public")]
+    Public,
+    #[serde(rename = "unlisted")]
+    Unlisted,
+}
+
+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::Private => write!(f, "private"),
+            LiveBroadcastStatusPrivacyStatus::Public => write!(f, "public"),
+            LiveBroadcastStatusPrivacyStatus::Unlisted => write!(f, "unlisted"),
+        };
+        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 = "recorded")]
+    Recorded,
+    /// The recording is completed, and cannot be started again.
+    #[serde(rename = "recording")]
+    Recording,
+}
+
+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::Recorded => write!(f, "recorded"),
+            LiveBroadcastStatusRecordingStatus::Recording => write!(f, "recording"),
         };
         Ok(())
     }
@@ -5699,57 +9089,89 @@
 }
 
 #[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ActivityContentDetailsPromotedItemCtaType {
-    Undefined,
-    #[serde(rename = "ctaTypeUnspecified")]
-    CtaTypeUnspecified,
-    #[serde(rename = "visitAdvertiserSite")]
-    VisitAdvertiserSite,
-}
-
-impl std::default::Default for ActivityContentDetailsPromotedItemCtaType {
-    fn default() -> ActivityContentDetailsPromotedItemCtaType {
-        ActivityContentDetailsPromotedItemCtaType::Undefined
-    }
-}
-
-impl std::fmt::Display for ActivityContentDetailsPromotedItemCtaType {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ActivityContentDetailsPromotedItemCtaType::Undefined => write!(f, "undefined"),
-            ActivityContentDetailsPromotedItemCtaType::CtaTypeUnspecified => {
-                write!(f, "ctaTypeUnspecified")
-            }
-            ActivityContentDetailsPromotedItemCtaType::VisitAdvertiserSite => {
-                write!(f, "visitAdvertiserSite")
-            }
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ThirdPartyLinkSnippetType {
-    Undefined,
-    #[serde(rename = "linkUnspecified")]
-    LinkUnspecified,
-    /// A link that is connecting (or about to connect) a channel with a store on a merchandising platform in order to enable retail commerce capabilities for that channel on YouTube.
-    #[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"),
+pub enum LiveChatMessageSnippetType {
+    Undefined,
+    #[serde(rename = "chatEndedEvent")]
+    ChatEndedEvent,
+    #[serde(rename = "fanFundingEvent")]
+    FanFundingEvent,
+    #[serde(rename = "invalidType")]
+    InvalidType,
+    #[serde(rename = "messageDeletedEvent")]
+    MessageDeletedEvent,
+    #[serde(rename = "messageRetractedEvent")]
+    MessageRetractedEvent,
+    #[serde(rename = "newSponsorEvent")]
+    NewSponsorEvent,
+    #[serde(rename = "sponsorOnlyModeEndedEvent")]
+    SponsorOnlyModeEndedEvent,
+    #[serde(rename = "sponsorOnlyModeStartedEvent")]
+    SponsorOnlyModeStartedEvent,
+    #[serde(rename = "superChatEvent")]
+    SuperChatEvent,
+    #[serde(rename = "superStickerEvent")]
+    SuperStickerEvent,
+    #[serde(rename = "textMessageEvent")]
+    TextMessageEvent,
+    #[serde(rename = "tombstone")]
+    Tombstone,
+    #[serde(rename = "userBannedEvent")]
+    UserBannedEvent,
+}
+
+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::ChatEndedEvent => write!(f, "chatEndedEvent"),
+            LiveChatMessageSnippetType::FanFundingEvent => write!(f, "fanFundingEvent"),
+            LiveChatMessageSnippetType::InvalidType => write!(f, "invalidType"),
+            LiveChatMessageSnippetType::MessageDeletedEvent => write!(f, "messageDeletedEvent"),
+            LiveChatMessageSnippetType::MessageRetractedEvent => write!(f, "messageRetractedEvent"),
+            LiveChatMessageSnippetType::NewSponsorEvent => write!(f, "newSponsorEvent"),
+            LiveChatMessageSnippetType::SponsorOnlyModeEndedEvent => {
+                write!(f, "sponsorOnlyModeEndedEvent")
+            }
+            LiveChatMessageSnippetType::SponsorOnlyModeStartedEvent => {
+                write!(f, "sponsorOnlyModeStartedEvent")
+            }
+            LiveChatMessageSnippetType::SuperChatEvent => write!(f, "superChatEvent"),
+            LiveChatMessageSnippetType::SuperStickerEvent => write!(f, "superStickerEvent"),
+            LiveChatMessageSnippetType::TextMessageEvent => write!(f, "textMessageEvent"),
+            LiveChatMessageSnippetType::Tombstone => write!(f, "tombstone"),
+            LiveChatMessageSnippetType::UserBannedEvent => write!(f, "userBannedEvent"),
+        };
+        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(())
     }
@@ -5758,12 +9180,12 @@
 #[derive(Debug, Clone, Copy, Serialize, Deserialize)]
 pub enum LiveStreamConfigurationIssueSeverity {
     Undefined,
+    #[serde(rename = "error")]
+    Error,
     #[serde(rename = "info")]
     Info,
     #[serde(rename = "warning")]
     Warning,
-    #[serde(rename = "error")]
-    Error,
 }
 
 impl std::default::Default for LiveStreamConfigurationIssueSeverity {
@@ -5776,9 +9198,9 @@
     fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
         let s = match self {
             LiveStreamConfigurationIssueSeverity::Undefined => write!(f, "undefined"),
+            LiveStreamConfigurationIssueSeverity::Error => write!(f, "error"),
             LiveStreamConfigurationIssueSeverity::Info => write!(f, "info"),
             LiveStreamConfigurationIssueSeverity::Warning => write!(f, "warning"),
-            LiveStreamConfigurationIssueSeverity::Error => write!(f, "error"),
         };
         Ok(())
     }
@@ -5787,74 +9209,74 @@
 #[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 = "audioBitrateMismatch")]
+    AudioBitrateMismatch,
+    #[serde(rename = "audioCodec")]
+    AudioCodec,
+    #[serde(rename = "audioCodecMismatch")]
+    AudioCodecMismatch,
     #[serde(rename = "audioSampleRate")]
     AudioSampleRate,
+    #[serde(rename = "audioSampleRateMismatch")]
+    AudioSampleRateMismatch,
+    #[serde(rename = "audioStereoMismatch")]
+    AudioStereoMismatch,
+    #[serde(rename = "audioTooManyChannels")]
+    AudioTooManyChannels,
+    #[serde(rename = "badContainer")]
+    BadContainer,
     #[serde(rename = "bitrateHigh")]
     BitrateHigh,
     #[serde(rename = "bitrateLow")]
     BitrateLow,
-    #[serde(rename = "audioCodec")]
-    AudioCodec,
-    #[serde(rename = "videoCodec")]
-    VideoCodec,
+    #[serde(rename = "frameRateHigh")]
+    FrameRateHigh,
+    #[serde(rename = "framerateMismatch")]
+    FramerateMismatch,
+    #[serde(rename = "gopMismatch")]
+    GopMismatch,
+    #[serde(rename = "gopSizeLong")]
+    GopSizeLong,
+    #[serde(rename = "gopSizeOver")]
+    GopSizeOver,
+    #[serde(rename = "gopSizeShort")]
+    GopSizeShort,
+    #[serde(rename = "interlacedVideo")]
+    InterlacedVideo,
+    #[serde(rename = "multipleAudioStreams")]
+    MultipleAudioStreams,
+    #[serde(rename = "multipleVideoStreams")]
+    MultipleVideoStreams,
     #[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 = "openGop")]
+    OpenGop,
     #[serde(rename = "resolutionMismatch")]
     ResolutionMismatch,
+    #[serde(rename = "videoBitrateMismatch")]
+    VideoBitrateMismatch,
+    #[serde(rename = "videoCodec")]
+    VideoCodec,
     #[serde(rename = "videoCodecMismatch")]
     VideoCodecMismatch,
+    #[serde(rename = "videoIngestionFasterThanRealtime")]
+    VideoIngestionFasterThanRealtime,
+    #[serde(rename = "videoIngestionStarved")]
+    VideoIngestionStarved,
     #[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 {
@@ -5867,66 +9289,319 @@
     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::AudioBitrateMismatch => {
+                write!(f, "audioBitrateMismatch")
+            }
             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::AudioCodecMismatch => write!(f, "audioCodecMismatch"),
+            LiveStreamConfigurationIssueType::AudioSampleRate => write!(f, "audioSampleRate"),
+            LiveStreamConfigurationIssueType::AudioSampleRateMismatch => {
+                write!(f, "audioSampleRateMismatch")
+            }
+            LiveStreamConfigurationIssueType::AudioStereoMismatch => {
+                write!(f, "audioStereoMismatch")
             }
             LiveStreamConfigurationIssueType::AudioTooManyChannels => {
                 write!(f, "audioTooManyChannels")
             }
-            LiveStreamConfigurationIssueType::InterlacedVideo => write!(f, "interlacedVideo"),
+            LiveStreamConfigurationIssueType::BadContainer => write!(f, "badContainer"),
+            LiveStreamConfigurationIssueType::BitrateHigh => write!(f, "bitrateHigh"),
+            LiveStreamConfigurationIssueType::BitrateLow => write!(f, "bitrateLow"),
             LiveStreamConfigurationIssueType::FrameRateHigh => write!(f, "frameRateHigh"),
+            LiveStreamConfigurationIssueType::FramerateMismatch => write!(f, "framerateMismatch"),
+            LiveStreamConfigurationIssueType::GopMismatch => write!(f, "gopMismatch"),
+            LiveStreamConfigurationIssueType::GopSizeLong => write!(f, "gopSizeLong"),
+            LiveStreamConfigurationIssueType::GopSizeOver => write!(f, "gopSizeOver"),
+            LiveStreamConfigurationIssueType::GopSizeShort => write!(f, "gopSizeShort"),
+            LiveStreamConfigurationIssueType::InterlacedVideo => write!(f, "interlacedVideo"),
+            LiveStreamConfigurationIssueType::MultipleAudioStreams => {
+                write!(f, "multipleAudioStreams")
+            }
+            LiveStreamConfigurationIssueType::MultipleVideoStreams => {
+                write!(f, "multipleVideoStreams")
+            }
+            LiveStreamConfigurationIssueType::NoAudioStream => write!(f, "noAudioStream"),
+            LiveStreamConfigurationIssueType::NoVideoStream => write!(f, "noVideoStream"),
+            LiveStreamConfigurationIssueType::OpenGop => write!(f, "openGop"),
             LiveStreamConfigurationIssueType::ResolutionMismatch => write!(f, "resolutionMismatch"),
+            LiveStreamConfigurationIssueType::VideoBitrateMismatch => {
+                write!(f, "videoBitrateMismatch")
+            }
+            LiveStreamConfigurationIssueType::VideoCodec => write!(f, "videoCodec"),
             LiveStreamConfigurationIssueType::VideoCodecMismatch => write!(f, "videoCodecMismatch"),
+            LiveStreamConfigurationIssueType::VideoIngestionFasterThanRealtime => {
+                write!(f, "videoIngestionFasterThanRealtime")
+            }
+            LiveStreamConfigurationIssueType::VideoIngestionStarved => {
+                write!(f, "videoIngestionStarved")
+            }
             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 LiveStreamHealthStatusStatus {
+    Undefined,
+    #[serde(rename = "bad")]
+    Bad,
+    #[serde(rename = "good")]
+    Good,
+    #[serde(rename = "noData")]
+    NoData,
+    #[serde(rename = "ok")]
+    Ok,
+    #[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::Bad => write!(f, "bad"),
+            LiveStreamHealthStatusStatus::Good => write!(f, "good"),
+            LiveStreamHealthStatusStatus::NoData => write!(f, "noData"),
+            LiveStreamHealthStatusStatus::Ok => write!(f, "ok"),
+            LiveStreamHealthStatusStatus::Revoked => write!(f, "revoked"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum LiveStreamStatusStreamStatus {
+    Undefined,
+    #[serde(rename = "active")]
+    Active,
+    #[serde(rename = "created")]
+    Created,
+    #[serde(rename = "error")]
+    Error,
+    #[serde(rename = "inactive")]
+    Inactive,
+    #[serde(rename = "ready")]
+    Ready,
+}
+
+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::Active => write!(f, "active"),
+            LiveStreamStatusStreamStatus::Created => write!(f, "created"),
+            LiveStreamStatusStreamStatus::Error => write!(f, "error"),
+            LiveStreamStatusStreamStatus::Inactive => write!(f, "inactive"),
+            LiveStreamStatusStreamStatus::Ready => write!(f, "ready"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum PlaylistItemStatusPrivacyStatus {
+    Undefined,
+    #[serde(rename = "private")]
+    Private,
+    #[serde(rename = "public")]
+    Public,
+    #[serde(rename = "unlisted")]
+    Unlisted,
+}
+
+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::Private => write!(f, "private"),
+            PlaylistItemStatusPrivacyStatus::Public => write!(f, "public"),
+            PlaylistItemStatusPrivacyStatus::Unlisted => write!(f, "unlisted"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum PlaylistStatusPrivacyStatus {
+    Undefined,
+    #[serde(rename = "private")]
+    Private,
+    #[serde(rename = "public")]
+    Public,
+    #[serde(rename = "unlisted")]
+    Unlisted,
+}
+
+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::Private => write!(f, "private"),
+            PlaylistStatusPrivacyStatus::Public => write!(f, "public"),
+            PlaylistStatusPrivacyStatus::Unlisted => write!(f, "unlisted"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum SearchResultSnippetLiveBroadcastContent {
+    Undefined,
+    #[serde(rename = "completed")]
+    Completed,
+    /// The live broadcast is upcoming.
+    #[serde(rename = "live")]
+    Live,
+    /// The live broadcast is active.
+    #[serde(rename = "none")]
+    None,
+    /// The live broadcast has been completed.
+    #[serde(rename = "upcoming")]
+    Upcoming,
+}
+
+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::Completed => write!(f, "completed"),
+            SearchResultSnippetLiveBroadcastContent::Live => write!(f, "live"),
+            SearchResultSnippetLiveBroadcastContent::None => write!(f, "none"),
+            SearchResultSnippetLiveBroadcastContent::Upcoming => write!(f, "upcoming"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum SubscriptionContentDetailsActivityType {
+    Undefined,
+    #[serde(rename = "all")]
+    All,
+    #[serde(rename = "subscriptionActivityTypeUnspecified")]
+    SubscriptionActivityTypeUnspecified,
+    #[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::All => write!(f, "all"),
+            SubscriptionContentDetailsActivityType::SubscriptionActivityTypeUnspecified => {
+                write!(f, "subscriptionActivityTypeUnspecified")
+            }
+            SubscriptionContentDetailsActivityType::Uploads => write!(f, "uploads"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ThirdPartyLinkSnippetType {
+    Undefined,
+    #[serde(rename = "channelToStoreLink")]
+    ChannelToStoreLink,
+    /// 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 = "linkUnspecified")]
+    LinkUnspecified,
+}
+
+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::ChannelToStoreLink => write!(f, "channelToStoreLink"),
+            ThirdPartyLinkSnippetType::LinkUnspecified => write!(f, "linkUnspecified"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ThirdPartyLinkStatusLinkStatus {
+    Undefined,
+    #[serde(rename = "failed")]
+    Failed,
+    #[serde(rename = "linked")]
+    Linked,
+    #[serde(rename = "pending")]
+    Pending,
+    #[serde(rename = "unknown")]
+    Unknown,
+}
+
+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::Failed => write!(f, "failed"),
+            ThirdPartyLinkStatusLinkStatus::Linked => write!(f, "linked"),
+            ThirdPartyLinkStatusLinkStatus::Pending => write!(f, "pending"),
+            ThirdPartyLinkStatusLinkStatus::Unknown => write!(f, "unknown"),
         };
         Ok(())
     }
@@ -5965,3670 +9640,500 @@
 }
 
 #[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum PlaylistStatusPrivacyStatus {
-    Undefined,
+pub enum VideoContentDetailsCaption {
+    Undefined,
+    #[serde(rename = "false")]
+    False,
+    #[serde(rename = "true")]
+    True,
+}
+
+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::False => write!(f, "false"),
+            VideoContentDetailsCaption::True => write!(f, "true"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum VideoContentDetailsDefinition {
+    Undefined,
+    /// sd
+    #[serde(rename = "hd")]
+    Hd,
+    /// hd
+    #[serde(rename = "sd")]
+    Sd,
+}
+
+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::Hd => write!(f, "hd"),
+            VideoContentDetailsDefinition::Sd => write!(f, "sd"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum VideoContentDetailsProjection {
+    Undefined,
+    #[serde(rename = "360")]
+    _360,
+    #[serde(rename = "rectangular")]
+    Rectangular,
+}
+
+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::_360 => write!(f, "360"),
+            VideoContentDetailsProjection::Rectangular => write!(f, "rectangular"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum VideoFileDetailsFileType {
+    Undefined,
+    /// Known video file (e.g., an MP4 file).
+    #[serde(rename = "archive")]
+    Archive,
+    /// Audio only file (e.g., an MP3 file).
+    #[serde(rename = "audio")]
+    Audio,
+    /// Image file (e.g., a JPEG image).
+    #[serde(rename = "document")]
+    Document,
+    /// Archive file (e.g., a ZIP archive).
+    #[serde(rename = "image")]
+    Image,
+    /// Document or text file (e.g., MS Word document).
+    #[serde(rename = "other")]
+    Other,
+    /// Movie project file (e.g., Microsoft Windows Movie Maker project).
+    #[serde(rename = "project")]
+    Project,
+    /// Other non-video file type.
+    #[serde(rename = "video")]
+    Video,
+}
+
+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::Archive => write!(f, "archive"),
+            VideoFileDetailsFileType::Audio => write!(f, "audio"),
+            VideoFileDetailsFileType::Document => write!(f, "document"),
+            VideoFileDetailsFileType::Image => write!(f, "image"),
+            VideoFileDetailsFileType::Other => write!(f, "other"),
+            VideoFileDetailsFileType::Project => write!(f, "project"),
+            VideoFileDetailsFileType::Video => write!(f, "video"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum VideoFileDetailsVideoStreamRotation {
+    Undefined,
+    #[serde(rename = "clockwise")]
+    Clockwise,
+    #[serde(rename = "counterClockwise")]
+    CounterClockwise,
+    #[serde(rename = "none")]
+    None,
+    #[serde(rename = "other")]
+    Other,
+    #[serde(rename = "upsideDown")]
+    UpsideDown,
+}
+
+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::Clockwise => write!(f, "clockwise"),
+            VideoFileDetailsVideoStreamRotation::CounterClockwise => write!(f, "counterClockwise"),
+            VideoFileDetailsVideoStreamRotation::None => write!(f, "none"),
+            VideoFileDetailsVideoStreamRotation::Other => write!(f, "other"),
+            VideoFileDetailsVideoStreamRotation::UpsideDown => write!(f, "upsideDown"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum VideoProcessingDetailsProcessingFailureReason {
+    Undefined,
+    #[serde(rename = "other")]
+    Other,
+    #[serde(rename = "streamingFailed")]
+    StreamingFailed,
+    #[serde(rename = "transcodeFailed")]
+    TranscodeFailed,
+    #[serde(rename = "uploadFailed")]
+    UploadFailed,
+}
+
+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::Other => write!(f, "other"),
+            VideoProcessingDetailsProcessingFailureReason::StreamingFailed => {
+                write!(f, "streamingFailed")
+            }
+            VideoProcessingDetailsProcessingFailureReason::TranscodeFailed => {
+                write!(f, "transcodeFailed")
+            }
+            VideoProcessingDetailsProcessingFailureReason::UploadFailed => {
+                write!(f, "uploadFailed")
+            }
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum VideoProcessingDetailsProcessingStatus {
+    Undefined,
+    #[serde(rename = "failed")]
+    Failed,
+    #[serde(rename = "processing")]
+    Processing,
+    #[serde(rename = "succeeded")]
+    Succeeded,
+    #[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::Failed => write!(f, "failed"),
+            VideoProcessingDetailsProcessingStatus::Processing => write!(f, "processing"),
+            VideoProcessingDetailsProcessingStatus::Succeeded => write!(f, "succeeded"),
+            VideoProcessingDetailsProcessingStatus::Terminated => write!(f, "terminated"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum VideoRatingRating {
+    Undefined,
+    #[serde(rename = "dislike")]
+    Dislike,
+    /// The entity is liked.
+    #[serde(rename = "like")]
+    Like,
+    /// The entity is disliked.
+    #[serde(rename = "none")]
+    None,
+}
+
+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::Dislike => write!(f, "dislike"),
+            VideoRatingRating::Like => write!(f, "like"),
+            VideoRatingRating::None => write!(f, "none"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum VideoSnippetLiveBroadcastContent {
+    Undefined,
+    #[serde(rename = "completed")]
+    Completed,
+    /// The live broadcast is upcoming.
+    #[serde(rename = "live")]
+    Live,
+    /// The live broadcast is active.
+    #[serde(rename = "none")]
+    None,
+    /// The live broadcast has been completed.
+    #[serde(rename = "upcoming")]
+    Upcoming,
+}
+
+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::Completed => write!(f, "completed"),
+            VideoSnippetLiveBroadcastContent::Live => write!(f, "live"),
+            VideoSnippetLiveBroadcastContent::None => write!(f, "none"),
+            VideoSnippetLiveBroadcastContent::Upcoming => write!(f, "upcoming"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum VideoStatusFailureReason {
+    Undefined,
+    /// Unable to convert video content.
+    #[serde(rename = "codec")]
+    Codec,
+    /// Invalid file format.
+    #[serde(rename = "conversion")]
+    Conversion,
+    /// Empty file.
+    #[serde(rename = "emptyFile")]
+    EmptyFile,
+    /// File was too small.
+    #[serde(rename = "invalidFile")]
+    InvalidFile,
+    /// Unsupported codec.
+    #[serde(rename = "tooSmall")]
+    TooSmall,
+    /// 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::Codec => write!(f, "codec"),
+            VideoStatusFailureReason::Conversion => write!(f, "conversion"),
+            VideoStatusFailureReason::EmptyFile => write!(f, "emptyFile"),
+            VideoStatusFailureReason::InvalidFile => write!(f, "invalidFile"),
+            VideoStatusFailureReason::TooSmall => write!(f, "tooSmall"),
+            VideoStatusFailureReason::UploadAborted => write!(f, "uploadAborted"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum VideoStatusLicense {
+    Undefined,
+    #[serde(rename = "creativeCommon")]
+    CreativeCommon,
+    #[serde(rename = "youtube")]
+    Youtube,
+}
+
+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::CreativeCommon => write!(f, "creativeCommon"),
+            VideoStatusLicense::Youtube => write!(f, "youtube"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum VideoStatusPrivacyStatus {
+    Undefined,
+    #[serde(rename = "private")]
+    Private,
     #[serde(rename = "public")]
     Public,
     #[serde(rename = "unlisted")]
     Unlisted,
-    #[serde(rename = "private")]
-    Private,
-}
-
-impl std::default::Default for PlaylistStatusPrivacyStatus {
-    fn default() -> PlaylistStatusPrivacyStatus {
-        PlaylistStatusPrivacyStatus::Undefined
-    }
-}
-
-impl std::fmt::Display for PlaylistStatusPrivacyStatus {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            PlaylistStatusPrivacyStatus::Undefined => write!(f, "undefined"),
-            PlaylistStatusPrivacyStatus::Public => write!(f, "public"),
-            PlaylistStatusPrivacyStatus::Unlisted => write!(f, "unlisted"),
-            PlaylistStatusPrivacyStatus::Private => write!(f, "private"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ChannelConversionPingContext {
-    Undefined,
-    #[serde(rename = "subscribe")]
-    Subscribe,
-    #[serde(rename = "unsubscribe")]
-    Unsubscribe,
-    #[serde(rename = "cview")]
-    Cview,
-}
-
-impl std::default::Default for ChannelConversionPingContext {
-    fn default() -> ChannelConversionPingContext {
-        ChannelConversionPingContext::Undefined
-    }
-}
-
-impl std::fmt::Display for ChannelConversionPingContext {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ChannelConversionPingContext::Undefined => write!(f, "undefined"),
-            ChannelConversionPingContext::Subscribe => write!(f, "subscribe"),
-            ChannelConversionPingContext::Unsubscribe => write!(f, "unsubscribe"),
-            ChannelConversionPingContext::Cview => write!(f, "cview"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingCbfcRating {
-    Undefined,
-    #[serde(rename = "cbfcUnspecified")]
-    CbfcUnspecified,
-    /// U
-    #[serde(rename = "cbfcU")]
-    CbfcU,
-    /// U/A
-    #[serde(rename = "cbfcUA")]
-    CbfcUA,
-    /// A
-    #[serde(rename = "cbfcA")]
-    CbfcA,
-    /// S
-    #[serde(rename = "cbfcS")]
-    CbfcS,
-    #[serde(rename = "cbfcUnrated")]
-    CbfcUnrated,
-}
-
-impl std::default::Default for ContentRatingCbfcRating {
-    fn default() -> ContentRatingCbfcRating {
-        ContentRatingCbfcRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingCbfcRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingCbfcRating::Undefined => write!(f, "undefined"),
-            ContentRatingCbfcRating::CbfcUnspecified => write!(f, "cbfcUnspecified"),
-            ContentRatingCbfcRating::CbfcU => write!(f, "cbfcU"),
-            ContentRatingCbfcRating::CbfcUA => write!(f, "cbfcUA"),
-            ContentRatingCbfcRating::CbfcA => write!(f, "cbfcA"),
-            ContentRatingCbfcRating::CbfcS => write!(f, "cbfcS"),
-            ContentRatingCbfcRating::CbfcUnrated => write!(f, "cbfcUnrated"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingEefilmRating {
-    Undefined,
-    #[serde(rename = "eefilmUnspecified")]
-    EefilmUnspecified,
-    /// Pere
-    #[serde(rename = "eefilmPere")]
-    EefilmPere,
-    /// L
-    #[serde(rename = "eefilmL")]
-    EefilmL,
-    /// MS-6
-    #[serde(rename = "eefilmMs6")]
-    EefilmMs6,
-    /// K-6
-    #[serde(rename = "eefilmK6")]
-    EefilmK6,
-    /// MS-12
-    #[serde(rename = "eefilmMs12")]
-    EefilmMs12,
-    /// K-12
-    #[serde(rename = "eefilmK12")]
-    EefilmK12,
-    /// K-14
-    #[serde(rename = "eefilmK14")]
-    EefilmK14,
-    /// K-16
-    #[serde(rename = "eefilmK16")]
-    EefilmK16,
-    #[serde(rename = "eefilmUnrated")]
-    EefilmUnrated,
-}
-
-impl std::default::Default for ContentRatingEefilmRating {
-    fn default() -> ContentRatingEefilmRating {
-        ContentRatingEefilmRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingEefilmRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingEefilmRating::Undefined => write!(f, "undefined"),
-            ContentRatingEefilmRating::EefilmUnspecified => write!(f, "eefilmUnspecified"),
-            ContentRatingEefilmRating::EefilmPere => write!(f, "eefilmPere"),
-            ContentRatingEefilmRating::EefilmL => write!(f, "eefilmL"),
-            ContentRatingEefilmRating::EefilmMs6 => write!(f, "eefilmMs6"),
-            ContentRatingEefilmRating::EefilmK6 => write!(f, "eefilmK6"),
-            ContentRatingEefilmRating::EefilmMs12 => write!(f, "eefilmMs12"),
-            ContentRatingEefilmRating::EefilmK12 => write!(f, "eefilmK12"),
-            ContentRatingEefilmRating::EefilmK14 => write!(f, "eefilmK14"),
-            ContentRatingEefilmRating::EefilmK16 => write!(f, "eefilmK16"),
-            ContentRatingEefilmRating::EefilmUnrated => write!(f, "eefilmUnrated"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingFpbRatingReasons {
-    Undefined,
-    #[serde(rename = "fpbRatingReasonUnspecified")]
-    FpbRatingReasonUnspecified,
-    /// South Africa rating content descriptors.
-    #[serde(rename = "fpbBlasphemy")]
-    FpbBlasphemy,
-    #[serde(rename = "fpbLanguage")]
-    FpbLanguage,
-    #[serde(rename = "fpbNudity")]
-    FpbNudity,
-    #[serde(rename = "fpbPrejudice")]
-    FpbPrejudice,
-    #[serde(rename = "fpbSex")]
-    FpbSex,
-    #[serde(rename = "fpbViolence")]
-    FpbViolence,
-    #[serde(rename = "fpbDrugs")]
-    FpbDrugs,
-    #[serde(rename = "fpbSexualViolence")]
-    FpbSexualViolence,
-    #[serde(rename = "fpbHorror")]
-    FpbHorror,
-    #[serde(rename = "fpbCriminalTechniques")]
-    FpbCriminalTechniques,
-    #[serde(rename = "fpbImitativeActsTechniques")]
-    FpbImitativeActsTechniques,
-}
-
-impl std::default::Default for ContentRatingFpbRatingReasons {
-    fn default() -> ContentRatingFpbRatingReasons {
-        ContentRatingFpbRatingReasons::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingFpbRatingReasons {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingFpbRatingReasons::Undefined => write!(f, "undefined"),
-            ContentRatingFpbRatingReasons::FpbRatingReasonUnspecified => {
-                write!(f, "fpbRatingReasonUnspecified")
-            }
-            ContentRatingFpbRatingReasons::FpbBlasphemy => write!(f, "fpbBlasphemy"),
-            ContentRatingFpbRatingReasons::FpbLanguage => write!(f, "fpbLanguage"),
-            ContentRatingFpbRatingReasons::FpbNudity => write!(f, "fpbNudity"),
-            ContentRatingFpbRatingReasons::FpbPrejudice => write!(f, "fpbPrejudice"),
-            ContentRatingFpbRatingReasons::FpbSex => write!(f, "fpbSex"),
-            ContentRatingFpbRatingReasons::FpbViolence => write!(f, "fpbViolence"),
-            ContentRatingFpbRatingReasons::FpbDrugs => write!(f, "fpbDrugs"),
-            ContentRatingFpbRatingReasons::FpbSexualViolence => write!(f, "fpbSexualViolence"),
-            ContentRatingFpbRatingReasons::FpbHorror => write!(f, "fpbHorror"),
-            ContentRatingFpbRatingReasons::FpbCriminalTechniques => {
-                write!(f, "fpbCriminalTechniques")
-            }
-            ContentRatingFpbRatingReasons::FpbImitativeActsTechniques => {
-                write!(f, "fpbImitativeActsTechniques")
-            }
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingNfvcbRating {
-    Undefined,
-    #[serde(rename = "nfvcbUnspecified")]
-    NfvcbUnspecified,
-    /// G
-    #[serde(rename = "nfvcbG")]
-    NfvcbG,
-    /// PG
-    #[serde(rename = "nfvcbPg")]
-    NfvcbPg,
-    /// 12
-    #[serde(rename = "nfvcb12")]
-    Nfvcb12,
-    /// 12A
-    #[serde(rename = "nfvcb12a")]
-    Nfvcb12a,
-    /// 15
-    #[serde(rename = "nfvcb15")]
-    Nfvcb15,
-    /// 18
-    #[serde(rename = "nfvcb18")]
-    Nfvcb18,
-    /// RE
-    #[serde(rename = "nfvcbRe")]
-    NfvcbRe,
-    #[serde(rename = "nfvcbUnrated")]
-    NfvcbUnrated,
-}
-
-impl std::default::Default for ContentRatingNfvcbRating {
-    fn default() -> ContentRatingNfvcbRating {
-        ContentRatingNfvcbRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingNfvcbRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingNfvcbRating::Undefined => write!(f, "undefined"),
-            ContentRatingNfvcbRating::NfvcbUnspecified => write!(f, "nfvcbUnspecified"),
-            ContentRatingNfvcbRating::NfvcbG => write!(f, "nfvcbG"),
-            ContentRatingNfvcbRating::NfvcbPg => write!(f, "nfvcbPg"),
-            ContentRatingNfvcbRating::Nfvcb12 => write!(f, "nfvcb12"),
-            ContentRatingNfvcbRating::Nfvcb12a => write!(f, "nfvcb12a"),
-            ContentRatingNfvcbRating::Nfvcb15 => write!(f, "nfvcb15"),
-            ContentRatingNfvcbRating::Nfvcb18 => write!(f, "nfvcb18"),
-            ContentRatingNfvcbRating::NfvcbRe => write!(f, "nfvcbRe"),
-            ContentRatingNfvcbRating::NfvcbUnrated => write!(f, "nfvcbUnrated"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingFcoRating {
-    Undefined,
-    #[serde(rename = "fcoUnspecified")]
-    FcoUnspecified,
-    /// I
-    #[serde(rename = "fcoI")]
-    FcoI,
-    /// IIA
-    #[serde(rename = "fcoIia")]
-    FcoIia,
-    /// IIB
-    #[serde(rename = "fcoIib")]
-    FcoIib,
-    /// II
-    #[serde(rename = "fcoIi")]
-    FcoIi,
-    /// III
-    #[serde(rename = "fcoIii")]
-    FcoIii,
-    #[serde(rename = "fcoUnrated")]
-    FcoUnrated,
-}
-
-impl std::default::Default for ContentRatingFcoRating {
-    fn default() -> ContentRatingFcoRating {
-        ContentRatingFcoRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingFcoRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingFcoRating::Undefined => write!(f, "undefined"),
-            ContentRatingFcoRating::FcoUnspecified => write!(f, "fcoUnspecified"),
-            ContentRatingFcoRating::FcoI => write!(f, "fcoI"),
-            ContentRatingFcoRating::FcoIia => write!(f, "fcoIia"),
-            ContentRatingFcoRating::FcoIib => write!(f, "fcoIib"),
-            ContentRatingFcoRating::FcoIi => write!(f, "fcoIi"),
-            ContentRatingFcoRating::FcoIii => write!(f, "fcoIii"),
-            ContentRatingFcoRating::FcoUnrated => write!(f, "fcoUnrated"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingKijkwijzerRating {
-    Undefined,
-    #[serde(rename = "kijkwijzerUnspecified")]
-    KijkwijzerUnspecified,
-    /// AL
-    #[serde(rename = "kijkwijzerAl")]
-    KijkwijzerAl,
-    /// 6
-    #[serde(rename = "kijkwijzer6")]
-    Kijkwijzer6,
-    /// 9
-    #[serde(rename = "kijkwijzer9")]
-    Kijkwijzer9,
-    /// 12
-    #[serde(rename = "kijkwijzer12")]
-    Kijkwijzer12,
-    /// 16
-    #[serde(rename = "kijkwijzer16")]
-    Kijkwijzer16,
-    #[serde(rename = "kijkwijzer18")]
-    Kijkwijzer18,
-    #[serde(rename = "kijkwijzerUnrated")]
-    KijkwijzerUnrated,
-}
-
-impl std::default::Default for ContentRatingKijkwijzerRating {
-    fn default() -> ContentRatingKijkwijzerRating {
-        ContentRatingKijkwijzerRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingKijkwijzerRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingKijkwijzerRating::Undefined => write!(f, "undefined"),
-            ContentRatingKijkwijzerRating::KijkwijzerUnspecified => {
-                write!(f, "kijkwijzerUnspecified")
-            }
-            ContentRatingKijkwijzerRating::KijkwijzerAl => write!(f, "kijkwijzerAl"),
-            ContentRatingKijkwijzerRating::Kijkwijzer6 => write!(f, "kijkwijzer6"),
-            ContentRatingKijkwijzerRating::Kijkwijzer9 => write!(f, "kijkwijzer9"),
-            ContentRatingKijkwijzerRating::Kijkwijzer12 => write!(f, "kijkwijzer12"),
-            ContentRatingKijkwijzerRating::Kijkwijzer16 => write!(f, "kijkwijzer16"),
-            ContentRatingKijkwijzerRating::Kijkwijzer18 => write!(f, "kijkwijzer18"),
-            ContentRatingKijkwijzerRating::KijkwijzerUnrated => write!(f, "kijkwijzerUnrated"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingBbfcRating {
-    Undefined,
-    #[serde(rename = "bbfcUnspecified")]
-    BbfcUnspecified,
-    /// U
-    #[serde(rename = "bbfcU")]
-    BbfcU,
-    /// PG
-    #[serde(rename = "bbfcPg")]
-    BbfcPg,
-    /// 12A
-    #[serde(rename = "bbfc12a")]
-    Bbfc12a,
-    /// 12
-    #[serde(rename = "bbfc12")]
-    Bbfc12,
-    /// 15
-    #[serde(rename = "bbfc15")]
-    Bbfc15,
-    /// 18
-    #[serde(rename = "bbfc18")]
-    Bbfc18,
-    /// R18
-    #[serde(rename = "bbfcR18")]
-    BbfcR18,
-    #[serde(rename = "bbfcUnrated")]
-    BbfcUnrated,
-}
-
-impl std::default::Default for ContentRatingBbfcRating {
-    fn default() -> ContentRatingBbfcRating {
-        ContentRatingBbfcRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingBbfcRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingBbfcRating::Undefined => write!(f, "undefined"),
-            ContentRatingBbfcRating::BbfcUnspecified => write!(f, "bbfcUnspecified"),
-            ContentRatingBbfcRating::BbfcU => write!(f, "bbfcU"),
-            ContentRatingBbfcRating::BbfcPg => write!(f, "bbfcPg"),
-            ContentRatingBbfcRating::Bbfc12a => write!(f, "bbfc12a"),
-            ContentRatingBbfcRating::Bbfc12 => write!(f, "bbfc12"),
-            ContentRatingBbfcRating::Bbfc15 => write!(f, "bbfc15"),
-            ContentRatingBbfcRating::Bbfc18 => write!(f, "bbfc18"),
-            ContentRatingBbfcRating::BbfcR18 => write!(f, "bbfcR18"),
-            ContentRatingBbfcRating::BbfcUnrated => write!(f, "bbfcUnrated"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingResorteviolenciaRating {
-    Undefined,
-    #[serde(rename = "resorteviolenciaUnspecified")]
-    ResorteviolenciaUnspecified,
-    /// A
-    #[serde(rename = "resorteviolenciaA")]
-    ResorteviolenciaA,
-    /// B
-    #[serde(rename = "resorteviolenciaB")]
-    ResorteviolenciaB,
-    /// C
-    #[serde(rename = "resorteviolenciaC")]
-    ResorteviolenciaC,
-    /// D
-    #[serde(rename = "resorteviolenciaD")]
-    ResorteviolenciaD,
-    /// E
-    #[serde(rename = "resorteviolenciaE")]
-    ResorteviolenciaE,
-    #[serde(rename = "resorteviolenciaUnrated")]
-    ResorteviolenciaUnrated,
-}
-
-impl std::default::Default for ContentRatingResorteviolenciaRating {
-    fn default() -> ContentRatingResorteviolenciaRating {
-        ContentRatingResorteviolenciaRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingResorteviolenciaRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingResorteviolenciaRating::Undefined => write!(f, "undefined"),
-            ContentRatingResorteviolenciaRating::ResorteviolenciaUnspecified => {
-                write!(f, "resorteviolenciaUnspecified")
-            }
-            ContentRatingResorteviolenciaRating::ResorteviolenciaA => {
-                write!(f, "resorteviolenciaA")
-            }
-            ContentRatingResorteviolenciaRating::ResorteviolenciaB => {
-                write!(f, "resorteviolenciaB")
-            }
-            ContentRatingResorteviolenciaRating::ResorteviolenciaC => {
-                write!(f, "resorteviolenciaC")
-            }
-            ContentRatingResorteviolenciaRating::ResorteviolenciaD => {
-                write!(f, "resorteviolenciaD")
-            }
-            ContentRatingResorteviolenciaRating::ResorteviolenciaE => {
-                write!(f, "resorteviolenciaE")
-            }
-            ContentRatingResorteviolenciaRating::ResorteviolenciaUnrated => {
-                write!(f, "resorteviolenciaUnrated")
-            }
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingKfcbRating {
-    Undefined,
-    #[serde(rename = "kfcbUnspecified")]
-    KfcbUnspecified,
-    /// GE
-    #[serde(rename = "kfcbG")]
-    KfcbG,
-    /// PG
-    #[serde(rename = "kfcbPg")]
-    KfcbPg,
-    /// 16
-    #[serde(rename = "kfcb16plus")]
-    Kfcb16plus,
-    /// 18
-    #[serde(rename = "kfcbR")]
-    KfcbR,
-    #[serde(rename = "kfcbUnrated")]
-    KfcbUnrated,
-}
-
-impl std::default::Default for ContentRatingKfcbRating {
-    fn default() -> ContentRatingKfcbRating {
-        ContentRatingKfcbRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingKfcbRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingKfcbRating::Undefined => write!(f, "undefined"),
-            ContentRatingKfcbRating::KfcbUnspecified => write!(f, "kfcbUnspecified"),
-            ContentRatingKfcbRating::KfcbG => write!(f, "kfcbG"),
-            ContentRatingKfcbRating::KfcbPg => write!(f, "kfcbPg"),
-            ContentRatingKfcbRating::Kfcb16plus => write!(f, "kfcb16plus"),
-            ContentRatingKfcbRating::KfcbR => write!(f, "kfcbR"),
-            ContentRatingKfcbRating::KfcbUnrated => write!(f, "kfcbUnrated"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingIlfilmRating {
-    Undefined,
-    #[serde(rename = "ilfilmUnspecified")]
-    IlfilmUnspecified,
-    /// AA
-    #[serde(rename = "ilfilmAa")]
-    IlfilmAa,
-    /// 12
-    #[serde(rename = "ilfilm12")]
-    Ilfilm12,
-    /// 14
-    #[serde(rename = "ilfilm14")]
-    Ilfilm14,
-    /// 16
-    #[serde(rename = "ilfilm16")]
-    Ilfilm16,
-    /// 18
-    #[serde(rename = "ilfilm18")]
-    Ilfilm18,
-    #[serde(rename = "ilfilmUnrated")]
-    IlfilmUnrated,
-}
-
-impl std::default::Default for ContentRatingIlfilmRating {
-    fn default() -> ContentRatingIlfilmRating {
-        ContentRatingIlfilmRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingIlfilmRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingIlfilmRating::Undefined => write!(f, "undefined"),
-            ContentRatingIlfilmRating::IlfilmUnspecified => write!(f, "ilfilmUnspecified"),
-            ContentRatingIlfilmRating::IlfilmAa => write!(f, "ilfilmAa"),
-            ContentRatingIlfilmRating::Ilfilm12 => write!(f, "ilfilm12"),
-            ContentRatingIlfilmRating::Ilfilm14 => write!(f, "ilfilm14"),
-            ContentRatingIlfilmRating::Ilfilm16 => write!(f, "ilfilm16"),
-            ContentRatingIlfilmRating::Ilfilm18 => write!(f, "ilfilm18"),
-            ContentRatingIlfilmRating::IlfilmUnrated => write!(f, "ilfilmUnrated"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingMoctwRating {
-    Undefined,
-    #[serde(rename = "moctwUnspecified")]
-    MoctwUnspecified,
-    /// G
-    #[serde(rename = "moctwG")]
-    MoctwG,
-    /// P
-    #[serde(rename = "moctwP")]
-    MoctwP,
-    /// PG
-    #[serde(rename = "moctwPg")]
-    MoctwPg,
-    /// R
-    #[serde(rename = "moctwR")]
-    MoctwR,
-    #[serde(rename = "moctwUnrated")]
-    MoctwUnrated,
-    /// R-12
-    #[serde(rename = "moctwR12")]
-    MoctwR12,
-    /// R-15
-    #[serde(rename = "moctwR15")]
-    MoctwR15,
-}
-
-impl std::default::Default for ContentRatingMoctwRating {
-    fn default() -> ContentRatingMoctwRating {
-        ContentRatingMoctwRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingMoctwRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingMoctwRating::Undefined => write!(f, "undefined"),
-            ContentRatingMoctwRating::MoctwUnspecified => write!(f, "moctwUnspecified"),
-            ContentRatingMoctwRating::MoctwG => write!(f, "moctwG"),
-            ContentRatingMoctwRating::MoctwP => write!(f, "moctwP"),
-            ContentRatingMoctwRating::MoctwPg => write!(f, "moctwPg"),
-            ContentRatingMoctwRating::MoctwR => write!(f, "moctwR"),
-            ContentRatingMoctwRating::MoctwUnrated => write!(f, "moctwUnrated"),
-            ContentRatingMoctwRating::MoctwR12 => write!(f, "moctwR12"),
-            ContentRatingMoctwRating::MoctwR15 => write!(f, "moctwR15"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingBmukkRating {
-    Undefined,
-    #[serde(rename = "bmukkUnspecified")]
-    BmukkUnspecified,
-    /// Unrestricted
-    #[serde(rename = "bmukkAa")]
-    BmukkAa,
-    /// 6+
-    #[serde(rename = "bmukk6")]
-    Bmukk6,
-    /// 8+
-    #[serde(rename = "bmukk8")]
-    Bmukk8,
-    /// 10+
-    #[serde(rename = "bmukk10")]
-    Bmukk10,
-    /// 12+
-    #[serde(rename = "bmukk12")]
-    Bmukk12,
-    /// 14+
-    #[serde(rename = "bmukk14")]
-    Bmukk14,
-    /// 16+
-    #[serde(rename = "bmukk16")]
-    Bmukk16,
-    #[serde(rename = "bmukkUnrated")]
-    BmukkUnrated,
-}
-
-impl std::default::Default for ContentRatingBmukkRating {
-    fn default() -> ContentRatingBmukkRating {
-        ContentRatingBmukkRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingBmukkRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingBmukkRating::Undefined => write!(f, "undefined"),
-            ContentRatingBmukkRating::BmukkUnspecified => write!(f, "bmukkUnspecified"),
-            ContentRatingBmukkRating::BmukkAa => write!(f, "bmukkAa"),
-            ContentRatingBmukkRating::Bmukk6 => write!(f, "bmukk6"),
-            ContentRatingBmukkRating::Bmukk8 => write!(f, "bmukk8"),
-            ContentRatingBmukkRating::Bmukk10 => write!(f, "bmukk10"),
-            ContentRatingBmukkRating::Bmukk12 => write!(f, "bmukk12"),
-            ContentRatingBmukkRating::Bmukk14 => write!(f, "bmukk14"),
-            ContentRatingBmukkRating::Bmukk16 => write!(f, "bmukk16"),
-            ContentRatingBmukkRating::BmukkUnrated => write!(f, "bmukkUnrated"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingRussiaRating {
-    Undefined,
-    #[serde(rename = "russiaUnspecified")]
-    RussiaUnspecified,
-    /// 0+
-    #[serde(rename = "russia0")]
-    Russia0,
-    /// 6+
-    #[serde(rename = "russia6")]
-    Russia6,
-    /// 12+
-    #[serde(rename = "russia12")]
-    Russia12,
-    /// 16+
-    #[serde(rename = "russia16")]
-    Russia16,
-    /// 18+
-    #[serde(rename = "russia18")]
-    Russia18,
-    #[serde(rename = "russiaUnrated")]
-    RussiaUnrated,
-}
-
-impl std::default::Default for ContentRatingRussiaRating {
-    fn default() -> ContentRatingRussiaRating {
-        ContentRatingRussiaRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingRussiaRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingRussiaRating::Undefined => write!(f, "undefined"),
-            ContentRatingRussiaRating::RussiaUnspecified => write!(f, "russiaUnspecified"),
-            ContentRatingRussiaRating::Russia0 => write!(f, "russia0"),
-            ContentRatingRussiaRating::Russia6 => write!(f, "russia6"),
-            ContentRatingRussiaRating::Russia12 => write!(f, "russia12"),
-            ContentRatingRussiaRating::Russia16 => write!(f, "russia16"),
-            ContentRatingRussiaRating::Russia18 => write!(f, "russia18"),
-            ContentRatingRussiaRating::RussiaUnrated => write!(f, "russiaUnrated"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingCatvRating {
-    Undefined,
-    #[serde(rename = "catvUnspecified")]
-    CatvUnspecified,
-    /// C
-    #[serde(rename = "catvC")]
-    CatvC,
-    /// C8
-    #[serde(rename = "catvC8")]
-    CatvC8,
-    /// G
-    #[serde(rename = "catvG")]
-    CatvG,
-    /// PG
-    #[serde(rename = "catvPg")]
-    CatvPg,
-    /// 14+
-    #[serde(rename = "catv14plus")]
-    Catv14plus,
-    /// 18+
-    #[serde(rename = "catv18plus")]
-    Catv18plus,
-    #[serde(rename = "catvUnrated")]
-    CatvUnrated,
-    #[serde(rename = "catvE")]
-    CatvE,
-}
-
-impl std::default::Default for ContentRatingCatvRating {
-    fn default() -> ContentRatingCatvRating {
-        ContentRatingCatvRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingCatvRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingCatvRating::Undefined => write!(f, "undefined"),
-            ContentRatingCatvRating::CatvUnspecified => write!(f, "catvUnspecified"),
-            ContentRatingCatvRating::CatvC => write!(f, "catvC"),
-            ContentRatingCatvRating::CatvC8 => write!(f, "catvC8"),
-            ContentRatingCatvRating::CatvG => write!(f, "catvG"),
-            ContentRatingCatvRating::CatvPg => write!(f, "catvPg"),
-            ContentRatingCatvRating::Catv14plus => write!(f, "catv14plus"),
-            ContentRatingCatvRating::Catv18plus => write!(f, "catv18plus"),
-            ContentRatingCatvRating::CatvUnrated => write!(f, "catvUnrated"),
-            ContentRatingCatvRating::CatvE => write!(f, "catvE"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingMocRating {
-    Undefined,
-    #[serde(rename = "mocUnspecified")]
-    MocUnspecified,
-    /// E
-    #[serde(rename = "mocE")]
-    MocE,
-    /// T
-    #[serde(rename = "mocT")]
-    MocT,
-    /// 7
-    #[serde(rename = "moc7")]
-    Moc7,
-    /// 12
-    #[serde(rename = "moc12")]
-    Moc12,
-    /// 15
-    #[serde(rename = "moc15")]
-    Moc15,
-    /// 18
-    #[serde(rename = "moc18")]
-    Moc18,
-    /// X
-    #[serde(rename = "mocX")]
-    MocX,
-    /// Banned
-    #[serde(rename = "mocBanned")]
-    MocBanned,
-    #[serde(rename = "mocUnrated")]
-    MocUnrated,
-}
-
-impl std::default::Default for ContentRatingMocRating {
-    fn default() -> ContentRatingMocRating {
-        ContentRatingMocRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingMocRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingMocRating::Undefined => write!(f, "undefined"),
-            ContentRatingMocRating::MocUnspecified => write!(f, "mocUnspecified"),
-            ContentRatingMocRating::MocE => write!(f, "mocE"),
-            ContentRatingMocRating::MocT => write!(f, "mocT"),
-            ContentRatingMocRating::Moc7 => write!(f, "moc7"),
-            ContentRatingMocRating::Moc12 => write!(f, "moc12"),
-            ContentRatingMocRating::Moc15 => write!(f, "moc15"),
-            ContentRatingMocRating::Moc18 => write!(f, "moc18"),
-            ContentRatingMocRating::MocX => write!(f, "mocX"),
-            ContentRatingMocRating::MocBanned => write!(f, "mocBanned"),
-            ContentRatingMocRating::MocUnrated => write!(f, "mocUnrated"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingRteRating {
-    Undefined,
-    #[serde(rename = "rteUnspecified")]
-    RteUnspecified,
-    /// GA
-    #[serde(rename = "rteGa")]
-    RteGa,
-    /// CH
-    #[serde(rename = "rteCh")]
-    RteCh,
-    /// PS
-    #[serde(rename = "rtePs")]
-    RtePs,
-    /// MA
-    #[serde(rename = "rteMa")]
-    RteMa,
-    #[serde(rename = "rteUnrated")]
-    RteUnrated,
-}
-
-impl std::default::Default for ContentRatingRteRating {
-    fn default() -> ContentRatingRteRating {
-        ContentRatingRteRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingRteRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingRteRating::Undefined => write!(f, "undefined"),
-            ContentRatingRteRating::RteUnspecified => write!(f, "rteUnspecified"),
-            ContentRatingRteRating::RteGa => write!(f, "rteGa"),
-            ContentRatingRteRating::RteCh => write!(f, "rteCh"),
-            ContentRatingRteRating::RtePs => write!(f, "rtePs"),
-            ContentRatingRteRating::RteMa => write!(f, "rteMa"),
-            ContentRatingRteRating::RteUnrated => write!(f, "rteUnrated"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingAnatelRating {
-    Undefined,
-    #[serde(rename = "anatelUnspecified")]
-    AnatelUnspecified,
-    /// F
-    #[serde(rename = "anatelF")]
-    AnatelF,
-    /// I
-    #[serde(rename = "anatelI")]
-    AnatelI,
-    /// I-7
-    #[serde(rename = "anatelI7")]
-    AnatelI7,
-    /// I-10
-    #[serde(rename = "anatelI10")]
-    AnatelI10,
-    /// I-12
-    #[serde(rename = "anatelI12")]
-    AnatelI12,
-    /// R
-    #[serde(rename = "anatelR")]
-    AnatelR,
-    /// A
-    #[serde(rename = "anatelA")]
-    AnatelA,
-    #[serde(rename = "anatelUnrated")]
-    AnatelUnrated,
-}
-
-impl std::default::Default for ContentRatingAnatelRating {
-    fn default() -> ContentRatingAnatelRating {
-        ContentRatingAnatelRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingAnatelRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingAnatelRating::Undefined => write!(f, "undefined"),
-            ContentRatingAnatelRating::AnatelUnspecified => write!(f, "anatelUnspecified"),
-            ContentRatingAnatelRating::AnatelF => write!(f, "anatelF"),
-            ContentRatingAnatelRating::AnatelI => write!(f, "anatelI"),
-            ContentRatingAnatelRating::AnatelI7 => write!(f, "anatelI7"),
-            ContentRatingAnatelRating::AnatelI10 => write!(f, "anatelI10"),
-            ContentRatingAnatelRating::AnatelI12 => write!(f, "anatelI12"),
-            ContentRatingAnatelRating::AnatelR => write!(f, "anatelR"),
-            ContentRatingAnatelRating::AnatelA => write!(f, "anatelA"),
-            ContentRatingAnatelRating::AnatelUnrated => write!(f, "anatelUnrated"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingMccaaRating {
-    Undefined,
-    #[serde(rename = "mccaaUnspecified")]
-    MccaaUnspecified,
-    /// U
-    #[serde(rename = "mccaaU")]
-    MccaaU,
-    /// PG
-    #[serde(rename = "mccaaPg")]
-    MccaaPg,
-    /// 12A
-    #[serde(rename = "mccaa12a")]
-    Mccaa12a,
-    /// 12
-    #[serde(rename = "mccaa12")]
-    Mccaa12,
-    /// 14 - this rating was removed from the new classification structure introduced in 2013.
-    #[serde(rename = "mccaa14")]
-    Mccaa14,
-    /// 15
-    #[serde(rename = "mccaa15")]
-    Mccaa15,
-    /// 16 - this rating was removed from the new classification structure introduced in 2013.
-    #[serde(rename = "mccaa16")]
-    Mccaa16,
-    /// 18
-    #[serde(rename = "mccaa18")]
-    Mccaa18,
-    #[serde(rename = "mccaaUnrated")]
-    MccaaUnrated,
-}
-
-impl std::default::Default for ContentRatingMccaaRating {
-    fn default() -> ContentRatingMccaaRating {
-        ContentRatingMccaaRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingMccaaRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingMccaaRating::Undefined => write!(f, "undefined"),
-            ContentRatingMccaaRating::MccaaUnspecified => write!(f, "mccaaUnspecified"),
-            ContentRatingMccaaRating::MccaaU => write!(f, "mccaaU"),
-            ContentRatingMccaaRating::MccaaPg => write!(f, "mccaaPg"),
-            ContentRatingMccaaRating::Mccaa12a => write!(f, "mccaa12a"),
-            ContentRatingMccaaRating::Mccaa12 => write!(f, "mccaa12"),
-            ContentRatingMccaaRating::Mccaa14 => write!(f, "mccaa14"),
-            ContentRatingMccaaRating::Mccaa15 => write!(f, "mccaa15"),
-            ContentRatingMccaaRating::Mccaa16 => write!(f, "mccaa16"),
-            ContentRatingMccaaRating::Mccaa18 => write!(f, "mccaa18"),
-            ContentRatingMccaaRating::MccaaUnrated => write!(f, "mccaaUnrated"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingMpaaRating {
-    Undefined,
-    #[serde(rename = "mpaaUnspecified")]
-    MpaaUnspecified,
-    /// G
-    #[serde(rename = "mpaaG")]
-    MpaaG,
-    /// PG
-    #[serde(rename = "mpaaPg")]
-    MpaaPg,
-    /// PG-13
-    #[serde(rename = "mpaaPg13")]
-    MpaaPg13,
-    /// R
-    #[serde(rename = "mpaaR")]
-    MpaaR,
-    /// NC-17
-    #[serde(rename = "mpaaNc17")]
-    MpaaNc17,
-    /// ! X
-    #[serde(rename = "mpaaX")]
-    MpaaX,
-    #[serde(rename = "mpaaUnrated")]
-    MpaaUnrated,
-}
-
-impl std::default::Default for ContentRatingMpaaRating {
-    fn default() -> ContentRatingMpaaRating {
-        ContentRatingMpaaRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingMpaaRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingMpaaRating::Undefined => write!(f, "undefined"),
-            ContentRatingMpaaRating::MpaaUnspecified => write!(f, "mpaaUnspecified"),
-            ContentRatingMpaaRating::MpaaG => write!(f, "mpaaG"),
-            ContentRatingMpaaRating::MpaaPg => write!(f, "mpaaPg"),
-            ContentRatingMpaaRating::MpaaPg13 => write!(f, "mpaaPg13"),
-            ContentRatingMpaaRating::MpaaR => write!(f, "mpaaR"),
-            ContentRatingMpaaRating::MpaaNc17 => write!(f, "mpaaNc17"),
-            ContentRatingMpaaRating::MpaaX => write!(f, "mpaaX"),
-            ContentRatingMpaaRating::MpaaUnrated => write!(f, "mpaaUnrated"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingTvpgRating {
-    Undefined,
-    #[serde(rename = "tvpgUnspecified")]
-    TvpgUnspecified,
-    /// TV-Y
-    #[serde(rename = "tvpgY")]
-    TvpgY,
-    /// TV-Y7
-    #[serde(rename = "tvpgY7")]
-    TvpgY7,
-    /// TV-Y7-FV
-    #[serde(rename = "tvpgY7Fv")]
-    TvpgY7Fv,
-    /// TV-G
-    #[serde(rename = "tvpgG")]
-    TvpgG,
-    /// TV-PG
-    #[serde(rename = "tvpgPg")]
-    TvpgPg,
-    /// TV-14
-    #[serde(rename = "pg14")]
-    Pg14,
-    /// TV-MA
-    #[serde(rename = "tvpgMa")]
-    TvpgMa,
-    #[serde(rename = "tvpgUnrated")]
-    TvpgUnrated,
-}
-
-impl std::default::Default for ContentRatingTvpgRating {
-    fn default() -> ContentRatingTvpgRating {
-        ContentRatingTvpgRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingTvpgRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingTvpgRating::Undefined => write!(f, "undefined"),
-            ContentRatingTvpgRating::TvpgUnspecified => write!(f, "tvpgUnspecified"),
-            ContentRatingTvpgRating::TvpgY => write!(f, "tvpgY"),
-            ContentRatingTvpgRating::TvpgY7 => write!(f, "tvpgY7"),
-            ContentRatingTvpgRating::TvpgY7Fv => write!(f, "tvpgY7Fv"),
-            ContentRatingTvpgRating::TvpgG => write!(f, "tvpgG"),
-            ContentRatingTvpgRating::TvpgPg => write!(f, "tvpgPg"),
-            ContentRatingTvpgRating::Pg14 => write!(f, "pg14"),
-            ContentRatingTvpgRating::TvpgMa => write!(f, "tvpgMa"),
-            ContentRatingTvpgRating::TvpgUnrated => write!(f, "tvpgUnrated"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingSkfilmRating {
-    Undefined,
-    #[serde(rename = "skfilmUnspecified")]
-    SkfilmUnspecified,
-    /// G
-    #[serde(rename = "skfilmG")]
-    SkfilmG,
-    /// P2
-    #[serde(rename = "skfilmP2")]
-    SkfilmP2,
-    /// P5
-    #[serde(rename = "skfilmP5")]
-    SkfilmP5,
-    /// P8
-    #[serde(rename = "skfilmP8")]
-    SkfilmP8,
-    #[serde(rename = "skfilmUnrated")]
-    SkfilmUnrated,
-}
-
-impl std::default::Default for ContentRatingSkfilmRating {
-    fn default() -> ContentRatingSkfilmRating {
-        ContentRatingSkfilmRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingSkfilmRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingSkfilmRating::Undefined => write!(f, "undefined"),
-            ContentRatingSkfilmRating::SkfilmUnspecified => write!(f, "skfilmUnspecified"),
-            ContentRatingSkfilmRating::SkfilmG => write!(f, "skfilmG"),
-            ContentRatingSkfilmRating::SkfilmP2 => write!(f, "skfilmP2"),
-            ContentRatingSkfilmRating::SkfilmP5 => write!(f, "skfilmP5"),
-            ContentRatingSkfilmRating::SkfilmP8 => write!(f, "skfilmP8"),
-            ContentRatingSkfilmRating::SkfilmUnrated => write!(f, "skfilmUnrated"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingMenaMpaaRating {
-    Undefined,
-    #[serde(rename = "menaMpaaUnspecified")]
-    MenaMpaaUnspecified,
-    /// G
-    #[serde(rename = "menaMpaaG")]
-    MenaMpaaG,
-    /// PG
-    #[serde(rename = "menaMpaaPg")]
-    MenaMpaaPg,
-    /// PG-13
-    #[serde(rename = "menaMpaaPg13")]
-    MenaMpaaPg13,
-    /// R
-    #[serde(rename = "menaMpaaR")]
-    MenaMpaaR,
-    /// To keep the same enum values as MPAA's items have, skip NC_17.
-    #[serde(rename = "menaMpaaUnrated")]
-    MenaMpaaUnrated,
-}
-
-impl std::default::Default for ContentRatingMenaMpaaRating {
-    fn default() -> ContentRatingMenaMpaaRating {
-        ContentRatingMenaMpaaRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingMenaMpaaRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingMenaMpaaRating::Undefined => write!(f, "undefined"),
-            ContentRatingMenaMpaaRating::MenaMpaaUnspecified => write!(f, "menaMpaaUnspecified"),
-            ContentRatingMenaMpaaRating::MenaMpaaG => write!(f, "menaMpaaG"),
-            ContentRatingMenaMpaaRating::MenaMpaaPg => write!(f, "menaMpaaPg"),
-            ContentRatingMenaMpaaRating::MenaMpaaPg13 => write!(f, "menaMpaaPg13"),
-            ContentRatingMenaMpaaRating::MenaMpaaR => write!(f, "menaMpaaR"),
-            ContentRatingMenaMpaaRating::MenaMpaaUnrated => write!(f, "menaMpaaUnrated"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingChvrsRating {
-    Undefined,
-    #[serde(rename = "chvrsUnspecified")]
-    ChvrsUnspecified,
-    /// G
-    #[serde(rename = "chvrsG")]
-    ChvrsG,
-    /// PG
-    #[serde(rename = "chvrsPg")]
-    ChvrsPg,
-    /// 14A
-    #[serde(rename = "chvrs14a")]
-    Chvrs14a,
-    /// 18A
-    #[serde(rename = "chvrs18a")]
-    Chvrs18a,
-    /// R
-    #[serde(rename = "chvrsR")]
-    ChvrsR,
-    /// E
-    #[serde(rename = "chvrsE")]
-    ChvrsE,
-    #[serde(rename = "chvrsUnrated")]
-    ChvrsUnrated,
-}
-
-impl std::default::Default for ContentRatingChvrsRating {
-    fn default() -> ContentRatingChvrsRating {
-        ContentRatingChvrsRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingChvrsRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingChvrsRating::Undefined => write!(f, "undefined"),
-            ContentRatingChvrsRating::ChvrsUnspecified => write!(f, "chvrsUnspecified"),
-            ContentRatingChvrsRating::ChvrsG => write!(f, "chvrsG"),
-            ContentRatingChvrsRating::ChvrsPg => write!(f, "chvrsPg"),
-            ContentRatingChvrsRating::Chvrs14a => write!(f, "chvrs14a"),
-            ContentRatingChvrsRating::Chvrs18a => write!(f, "chvrs18a"),
-            ContentRatingChvrsRating::ChvrsR => write!(f, "chvrsR"),
-            ContentRatingChvrsRating::ChvrsE => write!(f, "chvrsE"),
-            ContentRatingChvrsRating::ChvrsUnrated => write!(f, "chvrsUnrated"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingCzfilmRating {
-    Undefined,
-    #[serde(rename = "czfilmUnspecified")]
-    CzfilmUnspecified,
-    /// U
-    #[serde(rename = "czfilmU")]
-    CzfilmU,
-    /// 12
-    #[serde(rename = "czfilm12")]
-    Czfilm12,
-    /// 14
-    #[serde(rename = "czfilm14")]
-    Czfilm14,
-    /// 18
-    #[serde(rename = "czfilm18")]
-    Czfilm18,
-    #[serde(rename = "czfilmUnrated")]
-    CzfilmUnrated,
-}
-
-impl std::default::Default for ContentRatingCzfilmRating {
-    fn default() -> ContentRatingCzfilmRating {
-        ContentRatingCzfilmRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingCzfilmRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingCzfilmRating::Undefined => write!(f, "undefined"),
-            ContentRatingCzfilmRating::CzfilmUnspecified => write!(f, "czfilmUnspecified"),
-            ContentRatingCzfilmRating::CzfilmU => write!(f, "czfilmU"),
-            ContentRatingCzfilmRating::Czfilm12 => write!(f, "czfilm12"),
-            ContentRatingCzfilmRating::Czfilm14 => write!(f, "czfilm14"),
-            ContentRatingCzfilmRating::Czfilm18 => write!(f, "czfilm18"),
-            ContentRatingCzfilmRating::CzfilmUnrated => write!(f, "czfilmUnrated"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingCncRating {
-    Undefined,
-    #[serde(rename = "cncUnspecified")]
-    CncUnspecified,
-    /// T
-    #[serde(rename = "cncT")]
-    CncT,
-    /// 10
-    #[serde(rename = "cnc10")]
-    Cnc10,
-    /// 12
-    #[serde(rename = "cnc12")]
-    Cnc12,
-    /// 16
-    #[serde(rename = "cnc16")]
-    Cnc16,
-    /// 18
-    #[serde(rename = "cnc18")]
-    Cnc18,
-    /// E
-    #[serde(rename = "cncE")]
-    CncE,
-    /// interdiction
-    #[serde(rename = "cncInterdiction")]
-    CncInterdiction,
-    #[serde(rename = "cncUnrated")]
-    CncUnrated,
-}
-
-impl std::default::Default for ContentRatingCncRating {
-    fn default() -> ContentRatingCncRating {
-        ContentRatingCncRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingCncRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingCncRating::Undefined => write!(f, "undefined"),
-            ContentRatingCncRating::CncUnspecified => write!(f, "cncUnspecified"),
-            ContentRatingCncRating::CncT => write!(f, "cncT"),
-            ContentRatingCncRating::Cnc10 => write!(f, "cnc10"),
-            ContentRatingCncRating::Cnc12 => write!(f, "cnc12"),
-            ContentRatingCncRating::Cnc16 => write!(f, "cnc16"),
-            ContentRatingCncRating::Cnc18 => write!(f, "cnc18"),
-            ContentRatingCncRating::CncE => write!(f, "cncE"),
-            ContentRatingCncRating::CncInterdiction => write!(f, "cncInterdiction"),
-            ContentRatingCncRating::CncUnrated => write!(f, "cncUnrated"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingMdaRating {
-    Undefined,
-    #[serde(rename = "mdaUnspecified")]
-    MdaUnspecified,
-    /// G
-    #[serde(rename = "mdaG")]
-    MdaG,
-    /// PG
-    #[serde(rename = "mdaPg")]
-    MdaPg,
-    /// PG13
-    #[serde(rename = "mdaPg13")]
-    MdaPg13,
-    /// NC16
-    #[serde(rename = "mdaNc16")]
-    MdaNc16,
-    /// M18
-    #[serde(rename = "mdaM18")]
-    MdaM18,
-    /// R21
-    #[serde(rename = "mdaR21")]
-    MdaR21,
-    #[serde(rename = "mdaUnrated")]
-    MdaUnrated,
-}
-
-impl std::default::Default for ContentRatingMdaRating {
-    fn default() -> ContentRatingMdaRating {
-        ContentRatingMdaRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingMdaRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingMdaRating::Undefined => write!(f, "undefined"),
-            ContentRatingMdaRating::MdaUnspecified => write!(f, "mdaUnspecified"),
-            ContentRatingMdaRating::MdaG => write!(f, "mdaG"),
-            ContentRatingMdaRating::MdaPg => write!(f, "mdaPg"),
-            ContentRatingMdaRating::MdaPg13 => write!(f, "mdaPg13"),
-            ContentRatingMdaRating::MdaNc16 => write!(f, "mdaNc16"),
-            ContentRatingMdaRating::MdaM18 => write!(f, "mdaM18"),
-            ContentRatingMdaRating::MdaR21 => write!(f, "mdaR21"),
-            ContentRatingMdaRating::MdaUnrated => write!(f, "mdaUnrated"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingCnaRating {
-    Undefined,
-    #[serde(rename = "cnaUnspecified")]
-    CnaUnspecified,
-    /// AP
-    #[serde(rename = "cnaAp")]
-    CnaAp,
-    /// 12
-    #[serde(rename = "cna12")]
-    Cna12,
-    /// 15
-    #[serde(rename = "cna15")]
-    Cna15,
-    /// 18
-    #[serde(rename = "cna18")]
-    Cna18,
-    /// 18+
-    #[serde(rename = "cna18plus")]
-    Cna18plus,
-    #[serde(rename = "cnaUnrated")]
-    CnaUnrated,
-}
-
-impl std::default::Default for ContentRatingCnaRating {
-    fn default() -> ContentRatingCnaRating {
-        ContentRatingCnaRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingCnaRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingCnaRating::Undefined => write!(f, "undefined"),
-            ContentRatingCnaRating::CnaUnspecified => write!(f, "cnaUnspecified"),
-            ContentRatingCnaRating::CnaAp => write!(f, "cnaAp"),
-            ContentRatingCnaRating::Cna12 => write!(f, "cna12"),
-            ContentRatingCnaRating::Cna15 => write!(f, "cna15"),
-            ContentRatingCnaRating::Cna18 => write!(f, "cna18"),
-            ContentRatingCnaRating::Cna18plus => write!(f, "cna18plus"),
-            ContentRatingCnaRating::CnaUnrated => write!(f, "cnaUnrated"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingDjctqRatingReasons {
-    Undefined,
-    #[serde(rename = "djctqRatingReasonUnspecified")]
-    DjctqRatingReasonUnspecified,
-    /// Brazil rating content descriptors. See http://go/brazilratings section F. Violência (Violence)
-    #[serde(rename = "djctqViolence")]
-    DjctqViolence,
-    /// Violência extrema (Extreme violence)
-    #[serde(rename = "djctqExtremeViolence")]
-    DjctqExtremeViolence,
-    /// Conteúdo sexual (Sexual content)
-    #[serde(rename = "djctqSexualContent")]
-    DjctqSexualContent,
-    /// Nudez (Nudity)
-    #[serde(rename = "djctqNudity")]
-    DjctqNudity,
-    /// Sexo (Sex)
-    #[serde(rename = "djctqSex")]
-    DjctqSex,
-    /// Sexo Explícito (Explicit sex)
-    #[serde(rename = "djctqExplicitSex")]
-    DjctqExplicitSex,
-    /// Drogas (Drugs)
-    #[serde(rename = "djctqDrugs")]
-    DjctqDrugs,
-    /// Drogas Lícitas (Legal drugs)
-    #[serde(rename = "djctqLegalDrugs")]
-    DjctqLegalDrugs,
-    /// Drogas Ilícitas (Illegal drugs)
-    #[serde(rename = "djctqIllegalDrugs")]
-    DjctqIllegalDrugs,
-    /// Linguagem Imprópria (Inappropriate language)
-    #[serde(rename = "djctqInappropriateLanguage")]
-    DjctqInappropriateLanguage,
-    /// Atos Criminosos (Criminal Acts)
-    #[serde(rename = "djctqCriminalActs")]
-    DjctqCriminalActs,
-    /// Conteúdo Impactante (Impacting content)
-    #[serde(rename = "djctqImpactingContent")]
-    DjctqImpactingContent,
-}
-
-impl std::default::Default for ContentRatingDjctqRatingReasons {
-    fn default() -> ContentRatingDjctqRatingReasons {
-        ContentRatingDjctqRatingReasons::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingDjctqRatingReasons {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingDjctqRatingReasons::Undefined => write!(f, "undefined"),
-            ContentRatingDjctqRatingReasons::DjctqRatingReasonUnspecified => {
-                write!(f, "djctqRatingReasonUnspecified")
-            }
-            ContentRatingDjctqRatingReasons::DjctqViolence => write!(f, "djctqViolence"),
-            ContentRatingDjctqRatingReasons::DjctqExtremeViolence => {
-                write!(f, "djctqExtremeViolence")
-            }
-            ContentRatingDjctqRatingReasons::DjctqSexualContent => write!(f, "djctqSexualContent"),
-            ContentRatingDjctqRatingReasons::DjctqNudity => write!(f, "djctqNudity"),
-            ContentRatingDjctqRatingReasons::DjctqSex => write!(f, "djctqSex"),
-            ContentRatingDjctqRatingReasons::DjctqExplicitSex => write!(f, "djctqExplicitSex"),
-            ContentRatingDjctqRatingReasons::DjctqDrugs => write!(f, "djctqDrugs"),
-            ContentRatingDjctqRatingReasons::DjctqLegalDrugs => write!(f, "djctqLegalDrugs"),
-            ContentRatingDjctqRatingReasons::DjctqIllegalDrugs => write!(f, "djctqIllegalDrugs"),
-            ContentRatingDjctqRatingReasons::DjctqInappropriateLanguage => {
-                write!(f, "djctqInappropriateLanguage")
-            }
-            ContentRatingDjctqRatingReasons::DjctqCriminalActs => write!(f, "djctqCriminalActs"),
-            ContentRatingDjctqRatingReasons::DjctqImpactingContent => {
-                write!(f, "djctqImpactingContent")
-            }
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingFmocRating {
-    Undefined,
-    #[serde(rename = "fmocUnspecified")]
-    FmocUnspecified,
-    /// U
-    #[serde(rename = "fmocU")]
-    FmocU,
-    /// 10
-    #[serde(rename = "fmoc10")]
-    Fmoc10,
-    /// 12
-    #[serde(rename = "fmoc12")]
-    Fmoc12,
-    /// 16
-    #[serde(rename = "fmoc16")]
-    Fmoc16,
-    /// 18
-    #[serde(rename = "fmoc18")]
-    Fmoc18,
-    /// E
-    #[serde(rename = "fmocE")]
-    FmocE,
-    #[serde(rename = "fmocUnrated")]
-    FmocUnrated,
-}
-
-impl std::default::Default for ContentRatingFmocRating {
-    fn default() -> ContentRatingFmocRating {
-        ContentRatingFmocRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingFmocRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingFmocRating::Undefined => write!(f, "undefined"),
-            ContentRatingFmocRating::FmocUnspecified => write!(f, "fmocUnspecified"),
-            ContentRatingFmocRating::FmocU => write!(f, "fmocU"),
-            ContentRatingFmocRating::Fmoc10 => write!(f, "fmoc10"),
-            ContentRatingFmocRating::Fmoc12 => write!(f, "fmoc12"),
-            ContentRatingFmocRating::Fmoc16 => write!(f, "fmoc16"),
-            ContentRatingFmocRating::Fmoc18 => write!(f, "fmoc18"),
-            ContentRatingFmocRating::FmocE => write!(f, "fmocE"),
-            ContentRatingFmocRating::FmocUnrated => write!(f, "fmocUnrated"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingYtRating {
-    Undefined,
-    #[serde(rename = "ytUnspecified")]
-    YtUnspecified,
-    #[serde(rename = "ytAgeRestricted")]
-    YtAgeRestricted,
-}
-
-impl std::default::Default for ContentRatingYtRating {
-    fn default() -> ContentRatingYtRating {
-        ContentRatingYtRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingYtRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingYtRating::Undefined => write!(f, "undefined"),
-            ContentRatingYtRating::YtUnspecified => write!(f, "ytUnspecified"),
-            ContentRatingYtRating::YtAgeRestricted => write!(f, "ytAgeRestricted"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingMtrcbRating {
-    Undefined,
-    #[serde(rename = "mtrcbUnspecified")]
-    MtrcbUnspecified,
-    /// G
-    #[serde(rename = "mtrcbG")]
-    MtrcbG,
-    /// PG
-    #[serde(rename = "mtrcbPg")]
-    MtrcbPg,
-    /// R-13
-    #[serde(rename = "mtrcbR13")]
-    MtrcbR13,
-    /// R-16
-    #[serde(rename = "mtrcbR16")]
-    MtrcbR16,
-    /// R-18
-    #[serde(rename = "mtrcbR18")]
-    MtrcbR18,
-    /// X
-    #[serde(rename = "mtrcbX")]
-    MtrcbX,
-    #[serde(rename = "mtrcbUnrated")]
-    MtrcbUnrated,
-}
-
-impl std::default::Default for ContentRatingMtrcbRating {
-    fn default() -> ContentRatingMtrcbRating {
-        ContentRatingMtrcbRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingMtrcbRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingMtrcbRating::Undefined => write!(f, "undefined"),
-            ContentRatingMtrcbRating::MtrcbUnspecified => write!(f, "mtrcbUnspecified"),
-            ContentRatingMtrcbRating::MtrcbG => write!(f, "mtrcbG"),
-            ContentRatingMtrcbRating::MtrcbPg => write!(f, "mtrcbPg"),
-            ContentRatingMtrcbRating::MtrcbR13 => write!(f, "mtrcbR13"),
-            ContentRatingMtrcbRating::MtrcbR16 => write!(f, "mtrcbR16"),
-            ContentRatingMtrcbRating::MtrcbR18 => write!(f, "mtrcbR18"),
-            ContentRatingMtrcbRating::MtrcbX => write!(f, "mtrcbX"),
-            ContentRatingMtrcbRating::MtrcbUnrated => write!(f, "mtrcbUnrated"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingAcbRating {
-    Undefined,
-    #[serde(rename = "acbUnspecified")]
-    AcbUnspecified,
-    /// E
-    #[serde(rename = "acbE")]
-    AcbE,
-    /// Programs that have been given a P classification by the Australian Communications and Media Authority. These programs are intended for preschool children.
-    #[serde(rename = "acbP")]
-    AcbP,
-    /// Programs that have been given a C classification by the Australian Communications and Media Authority. These programs are intended for children (other than preschool children) who are younger than 14 years of age.
-    #[serde(rename = "acbC")]
-    AcbC,
-    /// G
-    #[serde(rename = "acbG")]
-    AcbG,
-    /// PG
-    #[serde(rename = "acbPg")]
-    AcbPg,
-    /// M
-    #[serde(rename = "acbM")]
-    AcbM,
-    /// MA15+
-    #[serde(rename = "acbMa15plus")]
-    AcbMa15plus,
-    /// R18+
-    #[serde(rename = "acbR18plus")]
-    AcbR18plus,
-    #[serde(rename = "acbUnrated")]
-    AcbUnrated,
-}
-
-impl std::default::Default for ContentRatingAcbRating {
-    fn default() -> ContentRatingAcbRating {
-        ContentRatingAcbRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingAcbRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingAcbRating::Undefined => write!(f, "undefined"),
-            ContentRatingAcbRating::AcbUnspecified => write!(f, "acbUnspecified"),
-            ContentRatingAcbRating::AcbE => write!(f, "acbE"),
-            ContentRatingAcbRating::AcbP => write!(f, "acbP"),
-            ContentRatingAcbRating::AcbC => write!(f, "acbC"),
-            ContentRatingAcbRating::AcbG => write!(f, "acbG"),
-            ContentRatingAcbRating::AcbPg => write!(f, "acbPg"),
-            ContentRatingAcbRating::AcbM => write!(f, "acbM"),
-            ContentRatingAcbRating::AcbMa15plus => write!(f, "acbMa15plus"),
-            ContentRatingAcbRating::AcbR18plus => write!(f, "acbR18plus"),
-            ContentRatingAcbRating::AcbUnrated => write!(f, "acbUnrated"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingMekuRating {
-    Undefined,
-    #[serde(rename = "mekuUnspecified")]
-    MekuUnspecified,
-    /// S
-    #[serde(rename = "mekuS")]
-    MekuS,
-    /// 7
-    #[serde(rename = "meku7")]
-    Meku7,
-    /// 12
-    #[serde(rename = "meku12")]
-    Meku12,
-    /// 16
-    #[serde(rename = "meku16")]
-    Meku16,
-    /// 18
-    #[serde(rename = "meku18")]
-    Meku18,
-    #[serde(rename = "mekuUnrated")]
-    MekuUnrated,
-}
-
-impl std::default::Default for ContentRatingMekuRating {
-    fn default() -> ContentRatingMekuRating {
-        ContentRatingMekuRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingMekuRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingMekuRating::Undefined => write!(f, "undefined"),
-            ContentRatingMekuRating::MekuUnspecified => write!(f, "mekuUnspecified"),
-            ContentRatingMekuRating::MekuS => write!(f, "mekuS"),
-            ContentRatingMekuRating::Meku7 => write!(f, "meku7"),
-            ContentRatingMekuRating::Meku12 => write!(f, "meku12"),
-            ContentRatingMekuRating::Meku16 => write!(f, "meku16"),
-            ContentRatingMekuRating::Meku18 => write!(f, "meku18"),
-            ContentRatingMekuRating::MekuUnrated => write!(f, "mekuUnrated"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingLsfRating {
-    Undefined,
-    #[serde(rename = "lsfUnspecified")]
-    LsfUnspecified,
-    /// SU
-    #[serde(rename = "lsfSu")]
-    LsfSu,
-    /// A
-    #[serde(rename = "lsfA")]
-    LsfA,
-    /// BO
-    #[serde(rename = "lsfBo")]
-    LsfBo,
-    /// 13
-    #[serde(rename = "lsf13")]
-    Lsf13,
-    /// R
-    #[serde(rename = "lsfR")]
-    LsfR,
-    /// 17
-    #[serde(rename = "lsf17")]
-    Lsf17,
-    /// D
-    #[serde(rename = "lsfD")]
-    LsfD,
-    /// 21
-    #[serde(rename = "lsf21")]
-    Lsf21,
-    #[serde(rename = "lsfUnrated")]
-    LsfUnrated,
-}
-
-impl std::default::Default for ContentRatingLsfRating {
-    fn default() -> ContentRatingLsfRating {
-        ContentRatingLsfRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingLsfRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingLsfRating::Undefined => write!(f, "undefined"),
-            ContentRatingLsfRating::LsfUnspecified => write!(f, "lsfUnspecified"),
-            ContentRatingLsfRating::LsfSu => write!(f, "lsfSu"),
-            ContentRatingLsfRating::LsfA => write!(f, "lsfA"),
-            ContentRatingLsfRating::LsfBo => write!(f, "lsfBo"),
-            ContentRatingLsfRating::Lsf13 => write!(f, "lsf13"),
-            ContentRatingLsfRating::LsfR => write!(f, "lsfR"),
-            ContentRatingLsfRating::Lsf17 => write!(f, "lsf17"),
-            ContentRatingLsfRating::LsfD => write!(f, "lsfD"),
-            ContentRatingLsfRating::Lsf21 => write!(f, "lsf21"),
-            ContentRatingLsfRating::LsfUnrated => write!(f, "lsfUnrated"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingIfcoRating {
-    Undefined,
-    #[serde(rename = "ifcoUnspecified")]
-    IfcoUnspecified,
-    /// G
-    #[serde(rename = "ifcoG")]
-    IfcoG,
-    /// PG
-    #[serde(rename = "ifcoPg")]
-    IfcoPg,
-    /// 12
-    #[serde(rename = "ifco12")]
-    Ifco12,
-    /// 12A
-    #[serde(rename = "ifco12a")]
-    Ifco12a,
-    /// 15
-    #[serde(rename = "ifco15")]
-    Ifco15,
-    /// 15A
-    #[serde(rename = "ifco15a")]
-    Ifco15a,
-    /// 16
-    #[serde(rename = "ifco16")]
-    Ifco16,
-    /// 18
-    #[serde(rename = "ifco18")]
-    Ifco18,
-    #[serde(rename = "ifcoUnrated")]
-    IfcoUnrated,
-}
-
-impl std::default::Default for ContentRatingIfcoRating {
-    fn default() -> ContentRatingIfcoRating {
-        ContentRatingIfcoRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingIfcoRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingIfcoRating::Undefined => write!(f, "undefined"),
-            ContentRatingIfcoRating::IfcoUnspecified => write!(f, "ifcoUnspecified"),
-            ContentRatingIfcoRating::IfcoG => write!(f, "ifcoG"),
-            ContentRatingIfcoRating::IfcoPg => write!(f, "ifcoPg"),
-            ContentRatingIfcoRating::Ifco12 => write!(f, "ifco12"),
-            ContentRatingIfcoRating::Ifco12a => write!(f, "ifco12a"),
-            ContentRatingIfcoRating::Ifco15 => write!(f, "ifco15"),
-            ContentRatingIfcoRating::Ifco15a => write!(f, "ifco15a"),
-            ContentRatingIfcoRating::Ifco16 => write!(f, "ifco16"),
-            ContentRatingIfcoRating::Ifco18 => write!(f, "ifco18"),
-            ContentRatingIfcoRating::IfcoUnrated => write!(f, "ifcoUnrated"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingEcbmctRating {
-    Undefined,
-    #[serde(rename = "ecbmctUnspecified")]
-    EcbmctUnspecified,
-    /// G
-    #[serde(rename = "ecbmctG")]
-    EcbmctG,
-    /// 7A
-    #[serde(rename = "ecbmct7a")]
-    Ecbmct7a,
-    /// 7+
-    #[serde(rename = "ecbmct7plus")]
-    Ecbmct7plus,
-    /// 13A
-    #[serde(rename = "ecbmct13a")]
-    Ecbmct13a,
-    /// 13+
-    #[serde(rename = "ecbmct13plus")]
-    Ecbmct13plus,
-    /// 15A
-    #[serde(rename = "ecbmct15a")]
-    Ecbmct15a,
-    /// 15+
-    #[serde(rename = "ecbmct15plus")]
-    Ecbmct15plus,
-    /// 18+
-    #[serde(rename = "ecbmct18plus")]
-    Ecbmct18plus,
-    #[serde(rename = "ecbmctUnrated")]
-    EcbmctUnrated,
-}
-
-impl std::default::Default for ContentRatingEcbmctRating {
-    fn default() -> ContentRatingEcbmctRating {
-        ContentRatingEcbmctRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingEcbmctRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingEcbmctRating::Undefined => write!(f, "undefined"),
-            ContentRatingEcbmctRating::EcbmctUnspecified => write!(f, "ecbmctUnspecified"),
-            ContentRatingEcbmctRating::EcbmctG => write!(f, "ecbmctG"),
-            ContentRatingEcbmctRating::Ecbmct7a => write!(f, "ecbmct7a"),
-            ContentRatingEcbmctRating::Ecbmct7plus => write!(f, "ecbmct7plus"),
-            ContentRatingEcbmctRating::Ecbmct13a => write!(f, "ecbmct13a"),
-            ContentRatingEcbmctRating::Ecbmct13plus => write!(f, "ecbmct13plus"),
-            ContentRatingEcbmctRating::Ecbmct15a => write!(f, "ecbmct15a"),
-            ContentRatingEcbmctRating::Ecbmct15plus => write!(f, "ecbmct15plus"),
-            ContentRatingEcbmctRating::Ecbmct18plus => write!(f, "ecbmct18plus"),
-            ContentRatingEcbmctRating::EcbmctUnrated => write!(f, "ecbmctUnrated"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingNbcRating {
-    Undefined,
-    #[serde(rename = "nbcUnspecified")]
-    NbcUnspecified,
-    /// G
-    #[serde(rename = "nbcG")]
-    NbcG,
-    /// PG
-    #[serde(rename = "nbcPg")]
-    NbcPg,
-    /// 12+
-    #[serde(rename = "nbc12plus")]
-    Nbc12plus,
-    /// 15+
-    #[serde(rename = "nbc15plus")]
-    Nbc15plus,
-    /// 18+
-    #[serde(rename = "nbc18plus")]
-    Nbc18plus,
-    /// 18+R
-    #[serde(rename = "nbc18plusr")]
-    Nbc18plusr,
-    /// PU
-    #[serde(rename = "nbcPu")]
-    NbcPu,
-    #[serde(rename = "nbcUnrated")]
-    NbcUnrated,
-}
-
-impl std::default::Default for ContentRatingNbcRating {
-    fn default() -> ContentRatingNbcRating {
-        ContentRatingNbcRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingNbcRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingNbcRating::Undefined => write!(f, "undefined"),
-            ContentRatingNbcRating::NbcUnspecified => write!(f, "nbcUnspecified"),
-            ContentRatingNbcRating::NbcG => write!(f, "nbcG"),
-            ContentRatingNbcRating::NbcPg => write!(f, "nbcPg"),
-            ContentRatingNbcRating::Nbc12plus => write!(f, "nbc12plus"),
-            ContentRatingNbcRating::Nbc15plus => write!(f, "nbc15plus"),
-            ContentRatingNbcRating::Nbc18plus => write!(f, "nbc18plus"),
-            ContentRatingNbcRating::Nbc18plusr => write!(f, "nbc18plusr"),
-            ContentRatingNbcRating::NbcPu => write!(f, "nbcPu"),
-            ContentRatingNbcRating::NbcUnrated => write!(f, "nbcUnrated"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingAgcomRating {
-    Undefined,
-    #[serde(rename = "agcomUnspecified")]
-    AgcomUnspecified,
-    /// T
-    #[serde(rename = "agcomT")]
-    AgcomT,
-    /// VM14
-    #[serde(rename = "agcomVm14")]
-    AgcomVm14,
-    /// VM18
-    #[serde(rename = "agcomVm18")]
-    AgcomVm18,
-    #[serde(rename = "agcomUnrated")]
-    AgcomUnrated,
-}
-
-impl std::default::Default for ContentRatingAgcomRating {
-    fn default() -> ContentRatingAgcomRating {
-        ContentRatingAgcomRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingAgcomRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingAgcomRating::Undefined => write!(f, "undefined"),
-            ContentRatingAgcomRating::AgcomUnspecified => write!(f, "agcomUnspecified"),
-            ContentRatingAgcomRating::AgcomT => write!(f, "agcomT"),
-            ContentRatingAgcomRating::AgcomVm14 => write!(f, "agcomVm14"),
-            ContentRatingAgcomRating::AgcomVm18 => write!(f, "agcomVm18"),
-            ContentRatingAgcomRating::AgcomUnrated => write!(f, "agcomUnrated"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingMibacRating {
-    Undefined,
-    #[serde(rename = "mibacUnspecified")]
-    MibacUnspecified,
-    #[serde(rename = "mibacT")]
-    MibacT,
-    #[serde(rename = "mibacVap")]
-    MibacVap,
-    #[serde(rename = "mibacVm12")]
-    MibacVm12,
-    #[serde(rename = "mibacVm14")]
-    MibacVm14,
-    #[serde(rename = "mibacVm18")]
-    MibacVm18,
-    #[serde(rename = "mibacUnrated")]
-    MibacUnrated,
-}
-
-impl std::default::Default for ContentRatingMibacRating {
-    fn default() -> ContentRatingMibacRating {
-        ContentRatingMibacRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingMibacRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingMibacRating::Undefined => write!(f, "undefined"),
-            ContentRatingMibacRating::MibacUnspecified => write!(f, "mibacUnspecified"),
-            ContentRatingMibacRating::MibacT => write!(f, "mibacT"),
-            ContentRatingMibacRating::MibacVap => write!(f, "mibacVap"),
-            ContentRatingMibacRating::MibacVm12 => write!(f, "mibacVm12"),
-            ContentRatingMibacRating::MibacVm14 => write!(f, "mibacVm14"),
-            ContentRatingMibacRating::MibacVm18 => write!(f, "mibacVm18"),
-            ContentRatingMibacRating::MibacUnrated => write!(f, "mibacUnrated"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingIcaaRating {
-    Undefined,
-    #[serde(rename = "icaaUnspecified")]
-    IcaaUnspecified,
-    /// APTA
-    #[serde(rename = "icaaApta")]
-    IcaaApta,
-    /// 7
-    #[serde(rename = "icaa7")]
-    Icaa7,
-    /// 12
-    #[serde(rename = "icaa12")]
-    Icaa12,
-    /// 13
-    #[serde(rename = "icaa13")]
-    Icaa13,
-    /// 16
-    #[serde(rename = "icaa16")]
-    Icaa16,
-    /// 18
-    #[serde(rename = "icaa18")]
-    Icaa18,
-    /// X
-    #[serde(rename = "icaaX")]
-    IcaaX,
-    #[serde(rename = "icaaUnrated")]
-    IcaaUnrated,
-}
-
-impl std::default::Default for ContentRatingIcaaRating {
-    fn default() -> ContentRatingIcaaRating {
-        ContentRatingIcaaRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingIcaaRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingIcaaRating::Undefined => write!(f, "undefined"),
-            ContentRatingIcaaRating::IcaaUnspecified => write!(f, "icaaUnspecified"),
-            ContentRatingIcaaRating::IcaaApta => write!(f, "icaaApta"),
-            ContentRatingIcaaRating::Icaa7 => write!(f, "icaa7"),
-            ContentRatingIcaaRating::Icaa12 => write!(f, "icaa12"),
-            ContentRatingIcaaRating::Icaa13 => write!(f, "icaa13"),
-            ContentRatingIcaaRating::Icaa16 => write!(f, "icaa16"),
-            ContentRatingIcaaRating::Icaa18 => write!(f, "icaa18"),
-            ContentRatingIcaaRating::IcaaX => write!(f, "icaaX"),
-            ContentRatingIcaaRating::IcaaUnrated => write!(f, "icaaUnrated"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingMpaatRating {
-    Undefined,
-    #[serde(rename = "mpaatUnspecified")]
-    MpaatUnspecified,
-    /// GB
-    #[serde(rename = "mpaatGb")]
-    MpaatGb,
-    /// RB
-    #[serde(rename = "mpaatRb")]
-    MpaatRb,
-}
-
-impl std::default::Default for ContentRatingMpaatRating {
-    fn default() -> ContentRatingMpaatRating {
-        ContentRatingMpaatRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingMpaatRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingMpaatRating::Undefined => write!(f, "undefined"),
-            ContentRatingMpaatRating::MpaatUnspecified => write!(f, "mpaatUnspecified"),
-            ContentRatingMpaatRating::MpaatGb => write!(f, "mpaatGb"),
-            ContentRatingMpaatRating::MpaatRb => write!(f, "mpaatRb"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingMedietilsynetRating {
-    Undefined,
-    #[serde(rename = "medietilsynetUnspecified")]
-    MedietilsynetUnspecified,
-    /// A
-    #[serde(rename = "medietilsynetA")]
-    MedietilsynetA,
-    /// 6
-    #[serde(rename = "medietilsynet6")]
-    Medietilsynet6,
-    /// 7
-    #[serde(rename = "medietilsynet7")]
-    Medietilsynet7,
-    /// 9
-    #[serde(rename = "medietilsynet9")]
-    Medietilsynet9,
-    /// 11
-    #[serde(rename = "medietilsynet11")]
-    Medietilsynet11,
-    /// 12
-    #[serde(rename = "medietilsynet12")]
-    Medietilsynet12,
-    /// 15
-    #[serde(rename = "medietilsynet15")]
-    Medietilsynet15,
-    /// 18
-    #[serde(rename = "medietilsynet18")]
-    Medietilsynet18,
-    #[serde(rename = "medietilsynetUnrated")]
-    MedietilsynetUnrated,
-}
-
-impl std::default::Default for ContentRatingMedietilsynetRating {
-    fn default() -> ContentRatingMedietilsynetRating {
-        ContentRatingMedietilsynetRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingMedietilsynetRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingMedietilsynetRating::Undefined => write!(f, "undefined"),
-            ContentRatingMedietilsynetRating::MedietilsynetUnspecified => {
-                write!(f, "medietilsynetUnspecified")
-            }
-            ContentRatingMedietilsynetRating::MedietilsynetA => write!(f, "medietilsynetA"),
-            ContentRatingMedietilsynetRating::Medietilsynet6 => write!(f, "medietilsynet6"),
-            ContentRatingMedietilsynetRating::Medietilsynet7 => write!(f, "medietilsynet7"),
-            ContentRatingMedietilsynetRating::Medietilsynet9 => write!(f, "medietilsynet9"),
-            ContentRatingMedietilsynetRating::Medietilsynet11 => write!(f, "medietilsynet11"),
-            ContentRatingMedietilsynetRating::Medietilsynet12 => write!(f, "medietilsynet12"),
-            ContentRatingMedietilsynetRating::Medietilsynet15 => write!(f, "medietilsynet15"),
-            ContentRatingMedietilsynetRating::Medietilsynet18 => write!(f, "medietilsynet18"),
-            ContentRatingMedietilsynetRating::MedietilsynetUnrated => {
-                write!(f, "medietilsynetUnrated")
-            }
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingGrfilmRating {
-    Undefined,
-    #[serde(rename = "grfilmUnspecified")]
-    GrfilmUnspecified,
-    /// K
-    #[serde(rename = "grfilmK")]
-    GrfilmK,
-    /// E
-    #[serde(rename = "grfilmE")]
-    GrfilmE,
-    /// K-12
-    #[serde(rename = "grfilmK12")]
-    GrfilmK12,
-    /// K-13
-    #[serde(rename = "grfilmK13")]
-    GrfilmK13,
-    /// K-15
-    #[serde(rename = "grfilmK15")]
-    GrfilmK15,
-    /// K-17
-    #[serde(rename = "grfilmK17")]
-    GrfilmK17,
-    /// K-18
-    #[serde(rename = "grfilmK18")]
-    GrfilmK18,
-    #[serde(rename = "grfilmUnrated")]
-    GrfilmUnrated,
-}
-
-impl std::default::Default for ContentRatingGrfilmRating {
-    fn default() -> ContentRatingGrfilmRating {
-        ContentRatingGrfilmRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingGrfilmRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingGrfilmRating::Undefined => write!(f, "undefined"),
-            ContentRatingGrfilmRating::GrfilmUnspecified => write!(f, "grfilmUnspecified"),
-            ContentRatingGrfilmRating::GrfilmK => write!(f, "grfilmK"),
-            ContentRatingGrfilmRating::GrfilmE => write!(f, "grfilmE"),
-            ContentRatingGrfilmRating::GrfilmK12 => write!(f, "grfilmK12"),
-            ContentRatingGrfilmRating::GrfilmK13 => write!(f, "grfilmK13"),
-            ContentRatingGrfilmRating::GrfilmK15 => write!(f, "grfilmK15"),
-            ContentRatingGrfilmRating::GrfilmK17 => write!(f, "grfilmK17"),
-            ContentRatingGrfilmRating::GrfilmK18 => write!(f, "grfilmK18"),
-            ContentRatingGrfilmRating::GrfilmUnrated => write!(f, "grfilmUnrated"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingEirinRating {
-    Undefined,
-    #[serde(rename = "eirinUnspecified")]
-    EirinUnspecified,
-    /// G
-    #[serde(rename = "eirinG")]
-    EirinG,
-    /// PG-12
-    #[serde(rename = "eirinPg12")]
-    EirinPg12,
-    /// R15+
-    #[serde(rename = "eirinR15plus")]
-    EirinR15plus,
-    /// R18+
-    #[serde(rename = "eirinR18plus")]
-    EirinR18plus,
-    #[serde(rename = "eirinUnrated")]
-    EirinUnrated,
-}
-
-impl std::default::Default for ContentRatingEirinRating {
-    fn default() -> ContentRatingEirinRating {
-        ContentRatingEirinRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingEirinRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingEirinRating::Undefined => write!(f, "undefined"),
-            ContentRatingEirinRating::EirinUnspecified => write!(f, "eirinUnspecified"),
-            ContentRatingEirinRating::EirinG => write!(f, "eirinG"),
-            ContentRatingEirinRating::EirinPg12 => write!(f, "eirinPg12"),
-            ContentRatingEirinRating::EirinR15plus => write!(f, "eirinR15plus"),
-            ContentRatingEirinRating::EirinR18plus => write!(f, "eirinR18plus"),
-            ContentRatingEirinRating::EirinUnrated => write!(f, "eirinUnrated"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingNbcplRating {
-    Undefined,
-    #[serde(rename = "nbcplUnspecified")]
-    NbcplUnspecified,
-    #[serde(rename = "nbcplI")]
-    NbcplI,
-    #[serde(rename = "nbcplIi")]
-    NbcplIi,
-    #[serde(rename = "nbcplIii")]
-    NbcplIii,
-    #[serde(rename = "nbcplIv")]
-    NbcplIv,
-    #[serde(rename = "nbcpl18plus")]
-    Nbcpl18plus,
-    #[serde(rename = "nbcplUnrated")]
-    NbcplUnrated,
-}
-
-impl std::default::Default for ContentRatingNbcplRating {
-    fn default() -> ContentRatingNbcplRating {
-        ContentRatingNbcplRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingNbcplRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingNbcplRating::Undefined => write!(f, "undefined"),
-            ContentRatingNbcplRating::NbcplUnspecified => write!(f, "nbcplUnspecified"),
-            ContentRatingNbcplRating::NbcplI => write!(f, "nbcplI"),
-            ContentRatingNbcplRating::NbcplIi => write!(f, "nbcplIi"),
-            ContentRatingNbcplRating::NbcplIii => write!(f, "nbcplIii"),
-            ContentRatingNbcplRating::NbcplIv => write!(f, "nbcplIv"),
-            ContentRatingNbcplRating::Nbcpl18plus => write!(f, "nbcpl18plus"),
-            ContentRatingNbcplRating::NbcplUnrated => write!(f, "nbcplUnrated"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingPefilmRating {
-    Undefined,
-    #[serde(rename = "pefilmUnspecified")]
-    PefilmUnspecified,
-    /// PT
-    #[serde(rename = "pefilmPt")]
-    PefilmPt,
-    /// PG
-    #[serde(rename = "pefilmPg")]
-    PefilmPg,
-    /// 14
-    #[serde(rename = "pefilm14")]
-    Pefilm14,
-    /// 18
-    #[serde(rename = "pefilm18")]
-    Pefilm18,
-    #[serde(rename = "pefilmUnrated")]
-    PefilmUnrated,
-}
-
-impl std::default::Default for ContentRatingPefilmRating {
-    fn default() -> ContentRatingPefilmRating {
-        ContentRatingPefilmRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingPefilmRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingPefilmRating::Undefined => write!(f, "undefined"),
-            ContentRatingPefilmRating::PefilmUnspecified => write!(f, "pefilmUnspecified"),
-            ContentRatingPefilmRating::PefilmPt => write!(f, "pefilmPt"),
-            ContentRatingPefilmRating::PefilmPg => write!(f, "pefilmPg"),
-            ContentRatingPefilmRating::Pefilm14 => write!(f, "pefilm14"),
-            ContentRatingPefilmRating::Pefilm18 => write!(f, "pefilm18"),
-            ContentRatingPefilmRating::PefilmUnrated => write!(f, "pefilmUnrated"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingFskRating {
-    Undefined,
-    #[serde(rename = "fskUnspecified")]
-    FskUnspecified,
-    /// FSK 0
-    #[serde(rename = "fsk0")]
-    Fsk0,
-    /// FSK 6
-    #[serde(rename = "fsk6")]
-    Fsk6,
-    /// FSK 12
-    #[serde(rename = "fsk12")]
-    Fsk12,
-    /// FSK 16
-    #[serde(rename = "fsk16")]
-    Fsk16,
-    /// FSK 18
-    #[serde(rename = "fsk18")]
-    Fsk18,
-    #[serde(rename = "fskUnrated")]
-    FskUnrated,
-}
-
-impl std::default::Default for ContentRatingFskRating {
-    fn default() -> ContentRatingFskRating {
-        ContentRatingFskRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingFskRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingFskRating::Undefined => write!(f, "undefined"),
-            ContentRatingFskRating::FskUnspecified => write!(f, "fskUnspecified"),
-            ContentRatingFskRating::Fsk0 => write!(f, "fsk0"),
-            ContentRatingFskRating::Fsk6 => write!(f, "fsk6"),
-            ContentRatingFskRating::Fsk12 => write!(f, "fsk12"),
-            ContentRatingFskRating::Fsk16 => write!(f, "fsk16"),
-            ContentRatingFskRating::Fsk18 => write!(f, "fsk18"),
-            ContentRatingFskRating::FskUnrated => write!(f, "fskUnrated"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingOflcRating {
-    Undefined,
-    #[serde(rename = "oflcUnspecified")]
-    OflcUnspecified,
-    /// G
-    #[serde(rename = "oflcG")]
-    OflcG,
-    /// PG
-    #[serde(rename = "oflcPg")]
-    OflcPg,
-    /// M
-    #[serde(rename = "oflcM")]
-    OflcM,
-    /// R13
-    #[serde(rename = "oflcR13")]
-    OflcR13,
-    /// R15
-    #[serde(rename = "oflcR15")]
-    OflcR15,
-    /// R16
-    #[serde(rename = "oflcR16")]
-    OflcR16,
-    /// R18
-    #[serde(rename = "oflcR18")]
-    OflcR18,
-    #[serde(rename = "oflcUnrated")]
-    OflcUnrated,
-    /// RP13
-    #[serde(rename = "oflcRp13")]
-    OflcRp13,
-    /// RP16
-    #[serde(rename = "oflcRp16")]
-    OflcRp16,
-    /// RP18
-    #[serde(rename = "oflcRp18")]
-    OflcRp18,
-}
-
-impl std::default::Default for ContentRatingOflcRating {
-    fn default() -> ContentRatingOflcRating {
-        ContentRatingOflcRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingOflcRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingOflcRating::Undefined => write!(f, "undefined"),
-            ContentRatingOflcRating::OflcUnspecified => write!(f, "oflcUnspecified"),
-            ContentRatingOflcRating::OflcG => write!(f, "oflcG"),
-            ContentRatingOflcRating::OflcPg => write!(f, "oflcPg"),
-            ContentRatingOflcRating::OflcM => write!(f, "oflcM"),
-            ContentRatingOflcRating::OflcR13 => write!(f, "oflcR13"),
-            ContentRatingOflcRating::OflcR15 => write!(f, "oflcR15"),
-            ContentRatingOflcRating::OflcR16 => write!(f, "oflcR16"),
-            ContentRatingOflcRating::OflcR18 => write!(f, "oflcR18"),
-            ContentRatingOflcRating::OflcUnrated => write!(f, "oflcUnrated"),
-            ContentRatingOflcRating::OflcRp13 => write!(f, "oflcRp13"),
-            ContentRatingOflcRating::OflcRp16 => write!(f, "oflcRp16"),
-            ContentRatingOflcRating::OflcRp18 => write!(f, "oflcRp18"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingSmsaRating {
-    Undefined,
-    #[serde(rename = "smsaUnspecified")]
-    SmsaUnspecified,
-    /// All ages
-    #[serde(rename = "smsaA")]
-    SmsaA,
-    /// 7
-    #[serde(rename = "smsa7")]
-    Smsa7,
-    /// 11
-    #[serde(rename = "smsa11")]
-    Smsa11,
-    /// 15
-    #[serde(rename = "smsa15")]
-    Smsa15,
-    #[serde(rename = "smsaUnrated")]
-    SmsaUnrated,
-}
-
-impl std::default::Default for ContentRatingSmsaRating {
-    fn default() -> ContentRatingSmsaRating {
-        ContentRatingSmsaRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingSmsaRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingSmsaRating::Undefined => write!(f, "undefined"),
-            ContentRatingSmsaRating::SmsaUnspecified => write!(f, "smsaUnspecified"),
-            ContentRatingSmsaRating::SmsaA => write!(f, "smsaA"),
-            ContentRatingSmsaRating::Smsa7 => write!(f, "smsa7"),
-            ContentRatingSmsaRating::Smsa11 => write!(f, "smsa11"),
-            ContentRatingSmsaRating::Smsa15 => write!(f, "smsa15"),
-            ContentRatingSmsaRating::SmsaUnrated => write!(f, "smsaUnrated"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingEgfilmRating {
-    Undefined,
-    #[serde(rename = "egfilmUnspecified")]
-    EgfilmUnspecified,
-    /// GN
-    #[serde(rename = "egfilmGn")]
-    EgfilmGn,
-    /// 18
-    #[serde(rename = "egfilm18")]
-    Egfilm18,
-    /// BN
-    #[serde(rename = "egfilmBn")]
-    EgfilmBn,
-    #[serde(rename = "egfilmUnrated")]
-    EgfilmUnrated,
-}
-
-impl std::default::Default for ContentRatingEgfilmRating {
-    fn default() -> ContentRatingEgfilmRating {
-        ContentRatingEgfilmRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingEgfilmRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingEgfilmRating::Undefined => write!(f, "undefined"),
-            ContentRatingEgfilmRating::EgfilmUnspecified => write!(f, "egfilmUnspecified"),
-            ContentRatingEgfilmRating::EgfilmGn => write!(f, "egfilmGn"),
-            ContentRatingEgfilmRating::Egfilm18 => write!(f, "egfilm18"),
-            ContentRatingEgfilmRating::EgfilmBn => write!(f, "egfilmBn"),
-            ContentRatingEgfilmRating::EgfilmUnrated => write!(f, "egfilmUnrated"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingSmaisRating {
-    Undefined,
-    #[serde(rename = "smaisUnspecified")]
-    SmaisUnspecified,
-    /// L
-    #[serde(rename = "smaisL")]
-    SmaisL,
-    /// 7
-    #[serde(rename = "smais7")]
-    Smais7,
-    /// 12
-    #[serde(rename = "smais12")]
-    Smais12,
-    /// 14
-    #[serde(rename = "smais14")]
-    Smais14,
-    /// 16
-    #[serde(rename = "smais16")]
-    Smais16,
-    /// 18
-    #[serde(rename = "smais18")]
-    Smais18,
-    #[serde(rename = "smaisUnrated")]
-    SmaisUnrated,
-}
-
-impl std::default::Default for ContentRatingSmaisRating {
-    fn default() -> ContentRatingSmaisRating {
-        ContentRatingSmaisRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingSmaisRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingSmaisRating::Undefined => write!(f, "undefined"),
-            ContentRatingSmaisRating::SmaisUnspecified => write!(f, "smaisUnspecified"),
-            ContentRatingSmaisRating::SmaisL => write!(f, "smaisL"),
-            ContentRatingSmaisRating::Smais7 => write!(f, "smais7"),
-            ContentRatingSmaisRating::Smais12 => write!(f, "smais12"),
-            ContentRatingSmaisRating::Smais14 => write!(f, "smais14"),
-            ContentRatingSmaisRating::Smais16 => write!(f, "smais16"),
-            ContentRatingSmaisRating::Smais18 => write!(f, "smais18"),
-            ContentRatingSmaisRating::SmaisUnrated => write!(f, "smaisUnrated"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingCscfRating {
-    Undefined,
-    #[serde(rename = "cscfUnspecified")]
-    CscfUnspecified,
-    /// AL
-    #[serde(rename = "cscfAl")]
-    CscfAl,
-    /// A
-    #[serde(rename = "cscfA")]
-    CscfA,
-    /// 6
-    #[serde(rename = "cscf6")]
-    Cscf6,
-    /// 9
-    #[serde(rename = "cscf9")]
-    Cscf9,
-    /// 12
-    #[serde(rename = "cscf12")]
-    Cscf12,
-    /// 16
-    #[serde(rename = "cscf16")]
-    Cscf16,
-    /// 18
-    #[serde(rename = "cscf18")]
-    Cscf18,
-    #[serde(rename = "cscfUnrated")]
-    CscfUnrated,
-}
-
-impl std::default::Default for ContentRatingCscfRating {
-    fn default() -> ContentRatingCscfRating {
-        ContentRatingCscfRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingCscfRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingCscfRating::Undefined => write!(f, "undefined"),
-            ContentRatingCscfRating::CscfUnspecified => write!(f, "cscfUnspecified"),
-            ContentRatingCscfRating::CscfAl => write!(f, "cscfAl"),
-            ContentRatingCscfRating::CscfA => write!(f, "cscfA"),
-            ContentRatingCscfRating::Cscf6 => write!(f, "cscf6"),
-            ContentRatingCscfRating::Cscf9 => write!(f, "cscf9"),
-            ContentRatingCscfRating::Cscf12 => write!(f, "cscf12"),
-            ContentRatingCscfRating::Cscf16 => write!(f, "cscf16"),
-            ContentRatingCscfRating::Cscf18 => write!(f, "cscf18"),
-            ContentRatingCscfRating::CscfUnrated => write!(f, "cscfUnrated"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingCatvfrRating {
-    Undefined,
-    #[serde(rename = "catvfrUnspecified")]
-    CatvfrUnspecified,
-    /// G
-    #[serde(rename = "catvfrG")]
-    CatvfrG,
-    /// 8+
-    #[serde(rename = "catvfr8plus")]
-    Catvfr8plus,
-    /// 13+
-    #[serde(rename = "catvfr13plus")]
-    Catvfr13plus,
-    /// 16+
-    #[serde(rename = "catvfr16plus")]
-    Catvfr16plus,
-    /// 18+
-    #[serde(rename = "catvfr18plus")]
-    Catvfr18plus,
-    #[serde(rename = "catvfrUnrated")]
-    CatvfrUnrated,
-    #[serde(rename = "catvfrE")]
-    CatvfrE,
-}
-
-impl std::default::Default for ContentRatingCatvfrRating {
-    fn default() -> ContentRatingCatvfrRating {
-        ContentRatingCatvfrRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingCatvfrRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingCatvfrRating::Undefined => write!(f, "undefined"),
-            ContentRatingCatvfrRating::CatvfrUnspecified => write!(f, "catvfrUnspecified"),
-            ContentRatingCatvfrRating::CatvfrG => write!(f, "catvfrG"),
-            ContentRatingCatvfrRating::Catvfr8plus => write!(f, "catvfr8plus"),
-            ContentRatingCatvfrRating::Catvfr13plus => write!(f, "catvfr13plus"),
-            ContentRatingCatvfrRating::Catvfr16plus => write!(f, "catvfr16plus"),
-            ContentRatingCatvfrRating::Catvfr18plus => write!(f, "catvfr18plus"),
-            ContentRatingCatvfrRating::CatvfrUnrated => write!(f, "catvfrUnrated"),
-            ContentRatingCatvfrRating::CatvfrE => write!(f, "catvfrE"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingCceRating {
-    Undefined,
-    #[serde(rename = "cceUnspecified")]
-    CceUnspecified,
-    /// 4
-    #[serde(rename = "cceM4")]
-    CceM4,
-    /// 6
-    #[serde(rename = "cceM6")]
-    CceM6,
-    /// 12
-    #[serde(rename = "cceM12")]
-    CceM12,
-    /// 16
-    #[serde(rename = "cceM16")]
-    CceM16,
-    /// 18
-    #[serde(rename = "cceM18")]
-    CceM18,
-    #[serde(rename = "cceUnrated")]
-    CceUnrated,
-    /// 14
-    #[serde(rename = "cceM14")]
-    CceM14,
-}
-
-impl std::default::Default for ContentRatingCceRating {
-    fn default() -> ContentRatingCceRating {
-        ContentRatingCceRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingCceRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingCceRating::Undefined => write!(f, "undefined"),
-            ContentRatingCceRating::CceUnspecified => write!(f, "cceUnspecified"),
-            ContentRatingCceRating::CceM4 => write!(f, "cceM4"),
-            ContentRatingCceRating::CceM6 => write!(f, "cceM6"),
-            ContentRatingCceRating::CceM12 => write!(f, "cceM12"),
-            ContentRatingCceRating::CceM16 => write!(f, "cceM16"),
-            ContentRatingCceRating::CceM18 => write!(f, "cceM18"),
-            ContentRatingCceRating::CceUnrated => write!(f, "cceUnrated"),
-            ContentRatingCceRating::CceM14 => write!(f, "cceM14"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingFpbRating {
-    Undefined,
-    #[serde(rename = "fpbUnspecified")]
-    FpbUnspecified,
-    /// A
-    #[serde(rename = "fpbA")]
-    FpbA,
-    /// PG
-    #[serde(rename = "fpbPg")]
-    FpbPg,
-    /// 7-9PG
-    #[serde(rename = "fpb79Pg")]
-    Fpb79Pg,
-    /// 10-12PG
-    #[serde(rename = "fpb1012Pg")]
-    Fpb1012Pg,
-    /// 13
-    #[serde(rename = "fpb13")]
-    Fpb13,
-    /// 16
-    #[serde(rename = "fpb16")]
-    Fpb16,
-    /// 18
-    #[serde(rename = "fpb18")]
-    Fpb18,
-    /// X18
-    #[serde(rename = "fpbX18")]
-    FpbX18,
-    /// XX
-    #[serde(rename = "fpbXx")]
-    FpbXx,
-    #[serde(rename = "fpbUnrated")]
-    FpbUnrated,
-    /// 10
-    #[serde(rename = "fpb10")]
-    Fpb10,
-}
-
-impl std::default::Default for ContentRatingFpbRating {
-    fn default() -> ContentRatingFpbRating {
-        ContentRatingFpbRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingFpbRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingFpbRating::Undefined => write!(f, "undefined"),
-            ContentRatingFpbRating::FpbUnspecified => write!(f, "fpbUnspecified"),
-            ContentRatingFpbRating::FpbA => write!(f, "fpbA"),
-            ContentRatingFpbRating::FpbPg => write!(f, "fpbPg"),
-            ContentRatingFpbRating::Fpb79Pg => write!(f, "fpb79Pg"),
-            ContentRatingFpbRating::Fpb1012Pg => write!(f, "fpb1012Pg"),
-            ContentRatingFpbRating::Fpb13 => write!(f, "fpb13"),
-            ContentRatingFpbRating::Fpb16 => write!(f, "fpb16"),
-            ContentRatingFpbRating::Fpb18 => write!(f, "fpb18"),
-            ContentRatingFpbRating::FpbX18 => write!(f, "fpbX18"),
-            ContentRatingFpbRating::FpbXx => write!(f, "fpbXx"),
-            ContentRatingFpbRating::FpbUnrated => write!(f, "fpbUnrated"),
-            ContentRatingFpbRating::Fpb10 => write!(f, "fpb10"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingMcstRating {
-    Undefined,
-    #[serde(rename = "mcstUnspecified")]
-    McstUnspecified,
-    /// P
-    #[serde(rename = "mcstP")]
-    McstP,
-    /// 0
-    #[serde(rename = "mcst0")]
-    Mcst0,
-    /// C13
-    #[serde(rename = "mcstC13")]
-    McstC13,
-    /// C16
-    #[serde(rename = "mcstC16")]
-    McstC16,
-    /// 16+
-    #[serde(rename = "mcst16plus")]
-    Mcst16plus,
-    /// C18
-    #[serde(rename = "mcstC18")]
-    McstC18,
-    /// MCST_G_PG
-    #[serde(rename = "mcstGPg")]
-    McstGPg,
-    #[serde(rename = "mcstUnrated")]
-    McstUnrated,
-}
-
-impl std::default::Default for ContentRatingMcstRating {
-    fn default() -> ContentRatingMcstRating {
-        ContentRatingMcstRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingMcstRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingMcstRating::Undefined => write!(f, "undefined"),
-            ContentRatingMcstRating::McstUnspecified => write!(f, "mcstUnspecified"),
-            ContentRatingMcstRating::McstP => write!(f, "mcstP"),
-            ContentRatingMcstRating::Mcst0 => write!(f, "mcst0"),
-            ContentRatingMcstRating::McstC13 => write!(f, "mcstC13"),
-            ContentRatingMcstRating::McstC16 => write!(f, "mcstC16"),
-            ContentRatingMcstRating::Mcst16plus => write!(f, "mcst16plus"),
-            ContentRatingMcstRating::McstC18 => write!(f, "mcstC18"),
-            ContentRatingMcstRating::McstGPg => write!(f, "mcstGPg"),
-            ContentRatingMcstRating::McstUnrated => write!(f, "mcstUnrated"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingMccypRating {
-    Undefined,
-    #[serde(rename = "mccypUnspecified")]
-    MccypUnspecified,
-    /// A
-    #[serde(rename = "mccypA")]
-    MccypA,
-    /// 7
-    #[serde(rename = "mccyp7")]
-    Mccyp7,
-    /// 11
-    #[serde(rename = "mccyp11")]
-    Mccyp11,
-    /// 15
-    #[serde(rename = "mccyp15")]
-    Mccyp15,
-    #[serde(rename = "mccypUnrated")]
-    MccypUnrated,
-}
-
-impl std::default::Default for ContentRatingMccypRating {
-    fn default() -> ContentRatingMccypRating {
-        ContentRatingMccypRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingMccypRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingMccypRating::Undefined => write!(f, "undefined"),
-            ContentRatingMccypRating::MccypUnspecified => write!(f, "mccypUnspecified"),
-            ContentRatingMccypRating::MccypA => write!(f, "mccypA"),
-            ContentRatingMccypRating::Mccyp7 => write!(f, "mccyp7"),
-            ContentRatingMccypRating::Mccyp11 => write!(f, "mccyp11"),
-            ContentRatingMccypRating::Mccyp15 => write!(f, "mccyp15"),
-            ContentRatingMccypRating::MccypUnrated => write!(f, "mccypUnrated"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingFcbmRating {
-    Undefined,
-    #[serde(rename = "fcbmUnspecified")]
-    FcbmUnspecified,
-    /// U
-    #[serde(rename = "fcbmU")]
-    FcbmU,
-    /// PG13
-    #[serde(rename = "fcbmPg13")]
-    FcbmPg13,
-    /// P13
-    #[serde(rename = "fcbmP13")]
-    FcbmP13,
-    /// 18
-    #[serde(rename = "fcbm18")]
-    Fcbm18,
-    /// 18SX
-    #[serde(rename = "fcbm18sx")]
-    Fcbm18sx,
-    /// 18PA
-    #[serde(rename = "fcbm18pa")]
-    Fcbm18pa,
-    /// 18SG
-    #[serde(rename = "fcbm18sg")]
-    Fcbm18sg,
-    /// 18PL
-    #[serde(rename = "fcbm18pl")]
-    Fcbm18pl,
-    #[serde(rename = "fcbmUnrated")]
-    FcbmUnrated,
-}
-
-impl std::default::Default for ContentRatingFcbmRating {
-    fn default() -> ContentRatingFcbmRating {
-        ContentRatingFcbmRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingFcbmRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingFcbmRating::Undefined => write!(f, "undefined"),
-            ContentRatingFcbmRating::FcbmUnspecified => write!(f, "fcbmUnspecified"),
-            ContentRatingFcbmRating::FcbmU => write!(f, "fcbmU"),
-            ContentRatingFcbmRating::FcbmPg13 => write!(f, "fcbmPg13"),
-            ContentRatingFcbmRating::FcbmP13 => write!(f, "fcbmP13"),
-            ContentRatingFcbmRating::Fcbm18 => write!(f, "fcbm18"),
-            ContentRatingFcbmRating::Fcbm18sx => write!(f, "fcbm18sx"),
-            ContentRatingFcbmRating::Fcbm18pa => write!(f, "fcbm18pa"),
-            ContentRatingFcbmRating::Fcbm18sg => write!(f, "fcbm18sg"),
-            ContentRatingFcbmRating::Fcbm18pl => write!(f, "fcbm18pl"),
-            ContentRatingFcbmRating::FcbmUnrated => write!(f, "fcbmUnrated"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingNmcRating {
-    Undefined,
-    #[serde(rename = "nmcUnspecified")]
-    NmcUnspecified,
-    /// G
-    #[serde(rename = "nmcG")]
-    NmcG,
-    /// PG
-    #[serde(rename = "nmcPg")]
-    NmcPg,
-    /// PG-13
-    #[serde(rename = "nmcPg13")]
-    NmcPg13,
-    /// PG-15
-    #[serde(rename = "nmcPg15")]
-    NmcPg15,
-    /// 15+
-    #[serde(rename = "nmc15plus")]
-    Nmc15plus,
-    /// 18+
-    #[serde(rename = "nmc18plus")]
-    Nmc18plus,
-    /// 18TC
-    #[serde(rename = "nmc18tc")]
-    Nmc18tc,
-    #[serde(rename = "nmcUnrated")]
-    NmcUnrated,
-}
-
-impl std::default::Default for ContentRatingNmcRating {
-    fn default() -> ContentRatingNmcRating {
-        ContentRatingNmcRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingNmcRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingNmcRating::Undefined => write!(f, "undefined"),
-            ContentRatingNmcRating::NmcUnspecified => write!(f, "nmcUnspecified"),
-            ContentRatingNmcRating::NmcG => write!(f, "nmcG"),
-            ContentRatingNmcRating::NmcPg => write!(f, "nmcPg"),
-            ContentRatingNmcRating::NmcPg13 => write!(f, "nmcPg13"),
-            ContentRatingNmcRating::NmcPg15 => write!(f, "nmcPg15"),
-            ContentRatingNmcRating::Nmc15plus => write!(f, "nmc15plus"),
-            ContentRatingNmcRating::Nmc18plus => write!(f, "nmc18plus"),
-            ContentRatingNmcRating::Nmc18tc => write!(f, "nmc18tc"),
-            ContentRatingNmcRating::NmcUnrated => write!(f, "nmcUnrated"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingChfilmRating {
-    Undefined,
-    #[serde(rename = "chfilmUnspecified")]
-    ChfilmUnspecified,
-    /// 0
-    #[serde(rename = "chfilm0")]
-    Chfilm0,
-    /// 6
-    #[serde(rename = "chfilm6")]
-    Chfilm6,
-    /// 12
-    #[serde(rename = "chfilm12")]
-    Chfilm12,
-    /// 16
-    #[serde(rename = "chfilm16")]
-    Chfilm16,
-    /// 18
-    #[serde(rename = "chfilm18")]
-    Chfilm18,
-    #[serde(rename = "chfilmUnrated")]
-    ChfilmUnrated,
-}
-
-impl std::default::Default for ContentRatingChfilmRating {
-    fn default() -> ContentRatingChfilmRating {
-        ContentRatingChfilmRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingChfilmRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingChfilmRating::Undefined => write!(f, "undefined"),
-            ContentRatingChfilmRating::ChfilmUnspecified => write!(f, "chfilmUnspecified"),
-            ContentRatingChfilmRating::Chfilm0 => write!(f, "chfilm0"),
-            ContentRatingChfilmRating::Chfilm6 => write!(f, "chfilm6"),
-            ContentRatingChfilmRating::Chfilm12 => write!(f, "chfilm12"),
-            ContentRatingChfilmRating::Chfilm16 => write!(f, "chfilm16"),
-            ContentRatingChfilmRating::Chfilm18 => write!(f, "chfilm18"),
-            ContentRatingChfilmRating::ChfilmUnrated => write!(f, "chfilmUnrated"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingNkclvRating {
-    Undefined,
-    #[serde(rename = "nkclvUnspecified")]
-    NkclvUnspecified,
-    /// U
-    #[serde(rename = "nkclvU")]
-    NkclvU,
-    /// 7+
-    #[serde(rename = "nkclv7plus")]
-    Nkclv7plus,
-    /// 12+
-    #[serde(rename = "nkclv12plus")]
-    Nkclv12plus,
-    /// ! 16+
-    #[serde(rename = "nkclv16plus")]
-    Nkclv16plus,
-    /// 18+
-    #[serde(rename = "nkclv18plus")]
-    Nkclv18plus,
-    #[serde(rename = "nkclvUnrated")]
-    NkclvUnrated,
-}
-
-impl std::default::Default for ContentRatingNkclvRating {
-    fn default() -> ContentRatingNkclvRating {
-        ContentRatingNkclvRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingNkclvRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingNkclvRating::Undefined => write!(f, "undefined"),
-            ContentRatingNkclvRating::NkclvUnspecified => write!(f, "nkclvUnspecified"),
-            ContentRatingNkclvRating::NkclvU => write!(f, "nkclvU"),
-            ContentRatingNkclvRating::Nkclv7plus => write!(f, "nkclv7plus"),
-            ContentRatingNkclvRating::Nkclv12plus => write!(f, "nkclv12plus"),
-            ContentRatingNkclvRating::Nkclv16plus => write!(f, "nkclv16plus"),
-            ContentRatingNkclvRating::Nkclv18plus => write!(f, "nkclv18plus"),
-            ContentRatingNkclvRating::NkclvUnrated => write!(f, "nkclvUnrated"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingNfrcRating {
-    Undefined,
-    #[serde(rename = "nfrcUnspecified")]
-    NfrcUnspecified,
-    /// A
-    #[serde(rename = "nfrcA")]
-    NfrcA,
-    /// B
-    #[serde(rename = "nfrcB")]
-    NfrcB,
-    /// C
-    #[serde(rename = "nfrcC")]
-    NfrcC,
-    /// D
-    #[serde(rename = "nfrcD")]
-    NfrcD,
-    /// X
-    #[serde(rename = "nfrcX")]
-    NfrcX,
-    #[serde(rename = "nfrcUnrated")]
-    NfrcUnrated,
-}
-
-impl std::default::Default for ContentRatingNfrcRating {
-    fn default() -> ContentRatingNfrcRating {
-        ContentRatingNfrcRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingNfrcRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingNfrcRating::Undefined => write!(f, "undefined"),
-            ContentRatingNfrcRating::NfrcUnspecified => write!(f, "nfrcUnspecified"),
-            ContentRatingNfrcRating::NfrcA => write!(f, "nfrcA"),
-            ContentRatingNfrcRating::NfrcB => write!(f, "nfrcB"),
-            ContentRatingNfrcRating::NfrcC => write!(f, "nfrcC"),
-            ContentRatingNfrcRating::NfrcD => write!(f, "nfrcD"),
-            ContentRatingNfrcRating::NfrcX => write!(f, "nfrcX"),
-            ContentRatingNfrcRating::NfrcUnrated => write!(f, "nfrcUnrated"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingDjctqRating {
-    Undefined,
-    #[serde(rename = "djctqUnspecified")]
-    DjctqUnspecified,
-    /// L
-    #[serde(rename = "djctqL")]
-    DjctqL,
-    /// 10
-    #[serde(rename = "djctq10")]
-    Djctq10,
-    /// 12
-    #[serde(rename = "djctq12")]
-    Djctq12,
-    /// 14
-    #[serde(rename = "djctq14")]
-    Djctq14,
-    /// 16
-    #[serde(rename = "djctq16")]
-    Djctq16,
-    /// 18
-    #[serde(rename = "djctq18")]
-    Djctq18,
-    #[serde(rename = "djctqEr")]
-    DjctqEr,
-    #[serde(rename = "djctqL10")]
-    DjctqL10,
-    #[serde(rename = "djctqL12")]
-    DjctqL12,
-    #[serde(rename = "djctqL14")]
-    DjctqL14,
-    #[serde(rename = "djctqL16")]
-    DjctqL16,
-    #[serde(rename = "djctqL18")]
-    DjctqL18,
-    #[serde(rename = "djctq1012")]
-    Djctq1012,
-    #[serde(rename = "djctq1014")]
-    Djctq1014,
-    #[serde(rename = "djctq1016")]
-    Djctq1016,
-    #[serde(rename = "djctq1018")]
-    Djctq1018,
-    #[serde(rename = "djctq1214")]
-    Djctq1214,
-    #[serde(rename = "djctq1216")]
-    Djctq1216,
-    #[serde(rename = "djctq1218")]
-    Djctq1218,
-    #[serde(rename = "djctq1416")]
-    Djctq1416,
-    #[serde(rename = "djctq1418")]
-    Djctq1418,
-    #[serde(rename = "djctq1618")]
-    Djctq1618,
-    #[serde(rename = "djctqUnrated")]
-    DjctqUnrated,
-}
-
-impl std::default::Default for ContentRatingDjctqRating {
-    fn default() -> ContentRatingDjctqRating {
-        ContentRatingDjctqRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingDjctqRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingDjctqRating::Undefined => write!(f, "undefined"),
-            ContentRatingDjctqRating::DjctqUnspecified => write!(f, "djctqUnspecified"),
-            ContentRatingDjctqRating::DjctqL => write!(f, "djctqL"),
-            ContentRatingDjctqRating::Djctq10 => write!(f, "djctq10"),
-            ContentRatingDjctqRating::Djctq12 => write!(f, "djctq12"),
-            ContentRatingDjctqRating::Djctq14 => write!(f, "djctq14"),
-            ContentRatingDjctqRating::Djctq16 => write!(f, "djctq16"),
-            ContentRatingDjctqRating::Djctq18 => write!(f, "djctq18"),
-            ContentRatingDjctqRating::DjctqEr => write!(f, "djctqEr"),
-            ContentRatingDjctqRating::DjctqL10 => write!(f, "djctqL10"),
-            ContentRatingDjctqRating::DjctqL12 => write!(f, "djctqL12"),
-            ContentRatingDjctqRating::DjctqL14 => write!(f, "djctqL14"),
-            ContentRatingDjctqRating::DjctqL16 => write!(f, "djctqL16"),
-            ContentRatingDjctqRating::DjctqL18 => write!(f, "djctqL18"),
-            ContentRatingDjctqRating::Djctq1012 => write!(f, "djctq1012"),
-            ContentRatingDjctqRating::Djctq1014 => write!(f, "djctq1014"),
-            ContentRatingDjctqRating::Djctq1016 => write!(f, "djctq1016"),
-            ContentRatingDjctqRating::Djctq1018 => write!(f, "djctq1018"),
-            ContentRatingDjctqRating::Djctq1214 => write!(f, "djctq1214"),
-            ContentRatingDjctqRating::Djctq1216 => write!(f, "djctq1216"),
-            ContentRatingDjctqRating::Djctq1218 => write!(f, "djctq1218"),
-            ContentRatingDjctqRating::Djctq1416 => write!(f, "djctq1416"),
-            ContentRatingDjctqRating::Djctq1418 => write!(f, "djctq1418"),
-            ContentRatingDjctqRating::Djctq1618 => write!(f, "djctq1618"),
-            ContentRatingDjctqRating::DjctqUnrated => write!(f, "djctqUnrated"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingBfvcRating {
-    Undefined,
-    #[serde(rename = "bfvcUnspecified")]
-    BfvcUnspecified,
-    /// G
-    #[serde(rename = "bfvcG")]
-    BfvcG,
-    /// E
-    #[serde(rename = "bfvcE")]
-    BfvcE,
-    /// 13
-    #[serde(rename = "bfvc13")]
-    Bfvc13,
-    /// 15
-    #[serde(rename = "bfvc15")]
-    Bfvc15,
-    /// 18
-    #[serde(rename = "bfvc18")]
-    Bfvc18,
-    /// 20
-    #[serde(rename = "bfvc20")]
-    Bfvc20,
-    /// B
-    #[serde(rename = "bfvcB")]
-    BfvcB,
-    #[serde(rename = "bfvcUnrated")]
-    BfvcUnrated,
-}
-
-impl std::default::Default for ContentRatingBfvcRating {
-    fn default() -> ContentRatingBfvcRating {
-        ContentRatingBfvcRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingBfvcRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingBfvcRating::Undefined => write!(f, "undefined"),
-            ContentRatingBfvcRating::BfvcUnspecified => write!(f, "bfvcUnspecified"),
-            ContentRatingBfvcRating::BfvcG => write!(f, "bfvcG"),
-            ContentRatingBfvcRating::BfvcE => write!(f, "bfvcE"),
-            ContentRatingBfvcRating::Bfvc13 => write!(f, "bfvc13"),
-            ContentRatingBfvcRating::Bfvc15 => write!(f, "bfvc15"),
-            ContentRatingBfvcRating::Bfvc18 => write!(f, "bfvc18"),
-            ContentRatingBfvcRating::Bfvc20 => write!(f, "bfvc20"),
-            ContentRatingBfvcRating::BfvcB => write!(f, "bfvcB"),
-            ContentRatingBfvcRating::BfvcUnrated => write!(f, "bfvcUnrated"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingIncaaRating {
-    Undefined,
-    #[serde(rename = "incaaUnspecified")]
-    IncaaUnspecified,
-    /// ATP (Apta para todo publico)
-    #[serde(rename = "incaaAtp")]
-    IncaaAtp,
-    /// 13 (Solo apta para mayores de 13 años)
-    #[serde(rename = "incaaSam13")]
-    IncaaSam13,
-    /// 16 (Solo apta para mayores de 16 años)
-    #[serde(rename = "incaaSam16")]
-    IncaaSam16,
-    /// 18 (Solo apta para mayores de 18 años)
-    #[serde(rename = "incaaSam18")]
-    IncaaSam18,
-    /// X (Solo apta para mayores de 18 años, de exhibición condicionada)
-    #[serde(rename = "incaaC")]
-    IncaaC,
-    #[serde(rename = "incaaUnrated")]
-    IncaaUnrated,
-}
-
-impl std::default::Default for ContentRatingIncaaRating {
-    fn default() -> ContentRatingIncaaRating {
-        ContentRatingIncaaRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingIncaaRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingIncaaRating::Undefined => write!(f, "undefined"),
-            ContentRatingIncaaRating::IncaaUnspecified => write!(f, "incaaUnspecified"),
-            ContentRatingIncaaRating::IncaaAtp => write!(f, "incaaAtp"),
-            ContentRatingIncaaRating::IncaaSam13 => write!(f, "incaaSam13"),
-            ContentRatingIncaaRating::IncaaSam16 => write!(f, "incaaSam16"),
-            ContentRatingIncaaRating::IncaaSam18 => write!(f, "incaaSam18"),
-            ContentRatingIncaaRating::IncaaC => write!(f, "incaaC"),
-            ContentRatingIncaaRating::IncaaUnrated => write!(f, "incaaUnrated"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingCicfRating {
-    Undefined,
-    #[serde(rename = "cicfUnspecified")]
-    CicfUnspecified,
-    /// E
-    #[serde(rename = "cicfE")]
-    CicfE,
-    /// KT/EA
-    #[serde(rename = "cicfKtEa")]
-    CicfKtEa,
-    /// KNT/ENA
-    #[serde(rename = "cicfKntEna")]
-    CicfKntEna,
-    #[serde(rename = "cicfUnrated")]
-    CicfUnrated,
-}
-
-impl std::default::Default for ContentRatingCicfRating {
-    fn default() -> ContentRatingCicfRating {
-        ContentRatingCicfRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingCicfRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingCicfRating::Undefined => write!(f, "undefined"),
-            ContentRatingCicfRating::CicfUnspecified => write!(f, "cicfUnspecified"),
-            ContentRatingCicfRating::CicfE => write!(f, "cicfE"),
-            ContentRatingCicfRating::CicfKtEa => write!(f, "cicfKtEa"),
-            ContentRatingCicfRating::CicfKntEna => write!(f, "cicfKntEna"),
-            ContentRatingCicfRating::CicfUnrated => write!(f, "cicfUnrated"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingKmrbRating {
-    Undefined,
-    #[serde(rename = "kmrbUnspecified")]
-    KmrbUnspecified,
-    /// 전체관람가
-    #[serde(rename = "kmrbAll")]
-    KmrbAll,
-    /// 12세 이상 관람가
-    #[serde(rename = "kmrb12plus")]
-    Kmrb12plus,
-    /// 15세 이상 관람가
-    #[serde(rename = "kmrb15plus")]
-    Kmrb15plus,
-    #[serde(rename = "kmrbTeenr")]
-    KmrbTeenr,
-    /// 청소년 관람불가
-    #[serde(rename = "kmrbR")]
-    KmrbR,
-    #[serde(rename = "kmrbUnrated")]
-    KmrbUnrated,
-}
-
-impl std::default::Default for ContentRatingKmrbRating {
-    fn default() -> ContentRatingKmrbRating {
-        ContentRatingKmrbRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingKmrbRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingKmrbRating::Undefined => write!(f, "undefined"),
-            ContentRatingKmrbRating::KmrbUnspecified => write!(f, "kmrbUnspecified"),
-            ContentRatingKmrbRating::KmrbAll => write!(f, "kmrbAll"),
-            ContentRatingKmrbRating::Kmrb12plus => write!(f, "kmrb12plus"),
-            ContentRatingKmrbRating::Kmrb15plus => write!(f, "kmrb15plus"),
-            ContentRatingKmrbRating::KmrbTeenr => write!(f, "kmrbTeenr"),
-            ContentRatingKmrbRating::KmrbR => write!(f, "kmrbR"),
-            ContentRatingKmrbRating::KmrbUnrated => write!(f, "kmrbUnrated"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingCccRating {
-    Undefined,
-    #[serde(rename = "cccUnspecified")]
-    CccUnspecified,
-    /// Todo espectador
-    #[serde(rename = "cccTe")]
-    CccTe,
-    /// 6+ - Inconveniente para menores de 7 años
-    #[serde(rename = "ccc6")]
-    Ccc6,
-    /// 14+
-    #[serde(rename = "ccc14")]
-    Ccc14,
-    /// 18+
-    #[serde(rename = "ccc18")]
-    Ccc18,
-    /// 18+ - contenido excesivamente violento
-    #[serde(rename = "ccc18v")]
-    Ccc18v,
-    /// 18+ - contenido pornográfico
-    #[serde(rename = "ccc18s")]
-    Ccc18s,
-    #[serde(rename = "cccUnrated")]
-    CccUnrated,
-}
-
-impl std::default::Default for ContentRatingCccRating {
-    fn default() -> ContentRatingCccRating {
-        ContentRatingCccRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingCccRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingCccRating::Undefined => write!(f, "undefined"),
-            ContentRatingCccRating::CccUnspecified => write!(f, "cccUnspecified"),
-            ContentRatingCccRating::CccTe => write!(f, "cccTe"),
-            ContentRatingCccRating::Ccc6 => write!(f, "ccc6"),
-            ContentRatingCccRating::Ccc14 => write!(f, "ccc14"),
-            ContentRatingCccRating::Ccc18 => write!(f, "ccc18"),
-            ContentRatingCccRating::Ccc18v => write!(f, "ccc18v"),
-            ContentRatingCccRating::Ccc18s => write!(f, "ccc18s"),
-            ContentRatingCccRating::CccUnrated => write!(f, "cccUnrated"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingCsaRating {
-    Undefined,
-    #[serde(rename = "csaUnspecified")]
-    CsaUnspecified,
-    /// T
-    #[serde(rename = "csaT")]
-    CsaT,
-    /// 10
-    #[serde(rename = "csa10")]
-    Csa10,
-    /// 12
-    #[serde(rename = "csa12")]
-    Csa12,
-    /// 16
-    #[serde(rename = "csa16")]
-    Csa16,
-    /// 18
-    #[serde(rename = "csa18")]
-    Csa18,
-    /// Interdiction
-    #[serde(rename = "csaInterdiction")]
-    CsaInterdiction,
-    #[serde(rename = "csaUnrated")]
-    CsaUnrated,
-}
-
-impl std::default::Default for ContentRatingCsaRating {
-    fn default() -> ContentRatingCsaRating {
-        ContentRatingCsaRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingCsaRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingCsaRating::Undefined => write!(f, "undefined"),
-            ContentRatingCsaRating::CsaUnspecified => write!(f, "csaUnspecified"),
-            ContentRatingCsaRating::CsaT => write!(f, "csaT"),
-            ContentRatingCsaRating::Csa10 => write!(f, "csa10"),
-            ContentRatingCsaRating::Csa12 => write!(f, "csa12"),
-            ContentRatingCsaRating::Csa16 => write!(f, "csa16"),
-            ContentRatingCsaRating::Csa18 => write!(f, "csa18"),
-            ContentRatingCsaRating::CsaInterdiction => write!(f, "csaInterdiction"),
-            ContentRatingCsaRating::CsaUnrated => write!(f, "csaUnrated"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingRcnofRating {
-    Undefined,
-    #[serde(rename = "rcnofUnspecified")]
-    RcnofUnspecified,
-    #[serde(rename = "rcnofI")]
-    RcnofI,
-    #[serde(rename = "rcnofIi")]
-    RcnofIi,
-    #[serde(rename = "rcnofIii")]
-    RcnofIii,
-    #[serde(rename = "rcnofIv")]
-    RcnofIv,
-    #[serde(rename = "rcnofV")]
-    RcnofV,
-    #[serde(rename = "rcnofVi")]
-    RcnofVi,
-    #[serde(rename = "rcnofUnrated")]
-    RcnofUnrated,
-}
-
-impl std::default::Default for ContentRatingRcnofRating {
-    fn default() -> ContentRatingRcnofRating {
-        ContentRatingRcnofRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingRcnofRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingRcnofRating::Undefined => write!(f, "undefined"),
-            ContentRatingRcnofRating::RcnofUnspecified => write!(f, "rcnofUnspecified"),
-            ContentRatingRcnofRating::RcnofI => write!(f, "rcnofI"),
-            ContentRatingRcnofRating::RcnofIi => write!(f, "rcnofIi"),
-            ContentRatingRcnofRating::RcnofIii => write!(f, "rcnofIii"),
-            ContentRatingRcnofRating::RcnofIv => write!(f, "rcnofIv"),
-            ContentRatingRcnofRating::RcnofV => write!(f, "rcnofV"),
-            ContentRatingRcnofRating::RcnofVi => write!(f, "rcnofVi"),
-            ContentRatingRcnofRating::RcnofUnrated => write!(f, "rcnofUnrated"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ContentRatingRtcRating {
-    Undefined,
-    #[serde(rename = "rtcUnspecified")]
-    RtcUnspecified,
-    /// AA
-    #[serde(rename = "rtcAa")]
-    RtcAa,
-    /// A
-    #[serde(rename = "rtcA")]
-    RtcA,
-    /// B
-    #[serde(rename = "rtcB")]
-    RtcB,
-    /// B15
-    #[serde(rename = "rtcB15")]
-    RtcB15,
-    /// C
-    #[serde(rename = "rtcC")]
-    RtcC,
-    /// D
-    #[serde(rename = "rtcD")]
-    RtcD,
-    #[serde(rename = "rtcUnrated")]
-    RtcUnrated,
-}
-
-impl std::default::Default for ContentRatingRtcRating {
-    fn default() -> ContentRatingRtcRating {
-        ContentRatingRtcRating::Undefined
-    }
-}
-
-impl std::fmt::Display for ContentRatingRtcRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ContentRatingRtcRating::Undefined => write!(f, "undefined"),
-            ContentRatingRtcRating::RtcUnspecified => write!(f, "rtcUnspecified"),
-            ContentRatingRtcRating::RtcAa => write!(f, "rtcAa"),
-            ContentRatingRtcRating::RtcA => write!(f, "rtcA"),
-            ContentRatingRtcRating::RtcB => write!(f, "rtcB"),
-            ContentRatingRtcRating::RtcB15 => write!(f, "rtcB15"),
-            ContentRatingRtcRating::RtcC => write!(f, "rtcC"),
-            ContentRatingRtcRating::RtcD => write!(f, "rtcD"),
-            ContentRatingRtcRating::RtcUnrated => write!(f, "rtcUnrated"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum LiveChatUserBannedMessageDetailsBanType {
-    Undefined,
-    #[serde(rename = "permanent")]
-    Permanent,
-    #[serde(rename = "temporary")]
-    Temporary,
-}
-
-impl std::default::Default for LiveChatUserBannedMessageDetailsBanType {
-    fn default() -> LiveChatUserBannedMessageDetailsBanType {
-        LiveChatUserBannedMessageDetailsBanType::Undefined
-    }
-}
-
-impl std::fmt::Display for LiveChatUserBannedMessageDetailsBanType {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            LiveChatUserBannedMessageDetailsBanType::Undefined => write!(f, "undefined"),
-            LiveChatUserBannedMessageDetailsBanType::Permanent => write!(f, "permanent"),
-            LiveChatUserBannedMessageDetailsBanType::Temporary => write!(f, "temporary"),
+}
+
+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::Private => write!(f, "private"),
+            VideoStatusPrivacyStatus::Public => write!(f, "public"),
+            VideoStatusPrivacyStatus::Unlisted => write!(f, "unlisted"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum VideoStatusRejectionReason {
+    Undefined,
+    /// Copyright infringement.
+    #[serde(rename = "claim")]
+    Claim,
+    /// Inappropriate video content.
+    #[serde(rename = "copyright")]
+    Copyright,
+    /// Duplicate upload in the same channel.
+    #[serde(rename = "duplicate")]
+    Duplicate,
+    /// Terms of use violation.
+    #[serde(rename = "inappropriate")]
+    Inappropriate,
+    /// Uploader account was suspended.
+    #[serde(rename = "legal")]
+    Legal,
+    /// Video duration was too long.
+    #[serde(rename = "length")]
+    Length,
+    /// Blocked by content owner.
+    #[serde(rename = "termsOfUse")]
+    TermsOfUse,
+    /// Uploader closed his/her account.
+    #[serde(rename = "trademark")]
+    Trademark,
+    /// Trademark infringement.
+    #[serde(rename = "uploaderAccountClosed")]
+    UploaderAccountClosed,
+    /// An unspecified legal reason.
+    #[serde(rename = "uploaderAccountSuspended")]
+    UploaderAccountSuspended,
+}
+
+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::Claim => write!(f, "claim"),
+            VideoStatusRejectionReason::Copyright => write!(f, "copyright"),
+            VideoStatusRejectionReason::Duplicate => write!(f, "duplicate"),
+            VideoStatusRejectionReason::Inappropriate => write!(f, "inappropriate"),
+            VideoStatusRejectionReason::Legal => write!(f, "legal"),
+            VideoStatusRejectionReason::Length => write!(f, "length"),
+            VideoStatusRejectionReason::TermsOfUse => write!(f, "termsOfUse"),
+            VideoStatusRejectionReason::Trademark => write!(f, "trademark"),
+            VideoStatusRejectionReason::UploaderAccountClosed => write!(f, "uploaderAccountClosed"),
+            VideoStatusRejectionReason::UploaderAccountSuspended => {
+                write!(f, "uploaderAccountSuspended")
+            }
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum VideoStatusUploadStatus {
+    Undefined,
+    /// Video has been uploaded but not processed yet.
+    #[serde(rename = "deleted")]
+    Deleted,
+    /// Video has been successfully processed.
+    #[serde(rename = "failed")]
+    Failed,
+    /// Processing has failed. See FailureReason.
+    #[serde(rename = "processed")]
+    Processed,
+    /// Video has been rejected. See RejectionReason.
+    #[serde(rename = "rejected")]
+    Rejected,
+    /// Video has been deleted.
+    #[serde(rename = "uploaded")]
+    Uploaded,
+}
+
+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::Deleted => write!(f, "deleted"),
+            VideoStatusUploadStatus::Failed => write!(f, "failed"),
+            VideoStatusUploadStatus::Processed => write!(f, "processed"),
+            VideoStatusUploadStatus::Rejected => write!(f, "rejected"),
+            VideoStatusUploadStatus::Uploaded => write!(f, "uploaded"),
         };
         Ok(())
     }
@@ -9638,17 +10143,17 @@
 pub enum VideoSuggestionsEditorSuggestions {
     Undefined,
     /// Picture brightness levels seem off and could be corrected.
+    #[serde(rename = "audioQuietAudioSwap")]
+    AudioQuietAudioSwap,
+    /// The video appears shaky and could be stabilized.
     #[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,
+    #[serde(rename = "videoStabilize")]
+    VideoStabilize,
 }
 
 impl std::default::Default for VideoSuggestionsEditorSuggestions {
@@ -9661,96 +10166,12 @@
     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")
-            }
+            VideoSuggestionsEditorSuggestions::VideoAutoLevels => write!(f, "videoAutoLevels"),
+            VideoSuggestionsEditorSuggestions::VideoCrop => write!(f, "videoCrop"),
+            VideoSuggestionsEditorSuggestions::VideoStabilize => write!(f, "videoStabilize"),
         };
         Ok(())
     }
@@ -9760,23 +10181,23 @@
 pub enum VideoSuggestionsProcessingErrors {
     Undefined,
     /// File contains audio only (e.g., an MP3 file).
+    #[serde(rename = "archiveFile")]
+    ArchiveFile,
+    /// Image file (e.g., a JPEG image).
     #[serde(rename = "audioFile")]
     AudioFile,
-    /// Image file (e.g., a JPEG image).
+    /// Movie project file (e.g., Microsoft Windows Movie Maker project).
+    #[serde(rename = "docFile")]
+    DocFile,
+    /// Other non-video file.
     #[serde(rename = "imageFile")]
     ImageFile,
-    /// Movie project file (e.g., Microsoft Windows Movie Maker project).
+    /// Document or text file (e.g., MS Word document).
+    #[serde(rename = "notAVideoFile")]
+    NotAVideoFile,
+    /// An archive file (e.g., a ZIP archive).
     #[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,
@@ -9792,12 +10213,12 @@
     fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
         let s = match self {
             VideoSuggestionsProcessingErrors::Undefined => write!(f, "undefined"),
+            VideoSuggestionsProcessingErrors::ArchiveFile => write!(f, "archiveFile"),
             VideoSuggestionsProcessingErrors::AudioFile => write!(f, "audioFile"),
+            VideoSuggestionsProcessingErrors::DocFile => write!(f, "docFile"),
             VideoSuggestionsProcessingErrors::ImageFile => write!(f, "imageFile"),
+            VideoSuggestionsProcessingErrors::NotAVideoFile => write!(f, "notAVideoFile"),
             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")
             }
@@ -9810,23 +10231,23 @@
 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 = "hdrVideo")]
+    HdrVideo,
+    /// Probably a better quality version of the video exists. The video has wide screen aspect ratio, but is not an HD video.
     #[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.
+    /// Uploaded video is spherical 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 = "sphericalVideo")]
+    SphericalVideo,
+    /// Uploaded video is HDR video.
     #[serde(rename = "vrVideo")]
     VrVideo,
-    /// Uploaded video is HDR video.
-    #[serde(rename = "hdrVideo")]
-    HdrVideo,
 }
 
 impl std::default::Default for VideoSuggestionsProcessingHints {
@@ -9839,519 +10260,380 @@
     fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
         let s = match self {
             VideoSuggestionsProcessingHints::Undefined => write!(f, "undefined"),
+            VideoSuggestionsProcessingHints::HdrVideo => write!(f, "hdrVideo"),
             VideoSuggestionsProcessingHints::NonStreamableMov => write!(f, "nonStreamableMov"),
             VideoSuggestionsProcessingHints::SendBestQualityVideo => {
                 write!(f, "sendBestQualityVideo")
             }
+            VideoSuggestionsProcessingHints::SpatialAudio => write!(f, "spatialAudio"),
             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 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 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 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.
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum VideoSuggestionsProcessingWarnings {
+    Undefined,
+    /// Unrecognized file format, transcoding is likely to fail.
+    #[serde(rename = "hasEditlist")]
+    HasEditlist,
+    /// Unrecognized video codec, transcoding is likely to fail.
+    #[serde(rename = "inconsistentResolution")]
+    InconsistentResolution,
+    /// Unrecognized audio codec, transcoding is likely to fail.
+    #[serde(rename = "problematicAudioCodec")]
+    ProblematicAudioCodec,
+    /// Conflicting container and stream resolutions.
+    #[serde(rename = "problematicHdrLookupTable")]
+    ProblematicHdrLookupTable,
+    /// Edit lists are not currently supported.
+    #[serde(rename = "problematicVideoCodec")]
+    ProblematicVideoCodec,
+    /// Video codec that is known to cause problems was used.
+    #[serde(rename = "unknownAudioCodec")]
+    UnknownAudioCodec,
+    /// Audio codec that is known to cause problems was used.
+    #[serde(rename = "unknownContainer")]
+    UnknownContainer,
+    /// Unsupported VR video stereo mode.
+    #[serde(rename = "unknownVideoCodec")]
+    UnknownVideoCodec,
+    /// Unsupported spherical video projection type.
+    #[serde(rename = "unsupportedHdrColorMetadata")]
+    UnsupportedHdrColorMetadata,
+    /// Unsupported HDR pixel format.
+    #[serde(rename = "unsupportedHdrPixelFormat")]
+    UnsupportedHdrPixelFormat,
+    /// Unspecified HDR color metadata.
+    #[serde(rename = "unsupportedSphericalProjectionType")]
+    UnsupportedSphericalProjectionType,
+    /// Problematic HDR lookup table attached.
+    #[serde(rename = "unsupportedVrStereoMode")]
+    UnsupportedVrStereoMode,
+}
+
+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::HasEditlist => write!(f, "hasEditlist"),
+            VideoSuggestionsProcessingWarnings::InconsistentResolution => {
+                write!(f, "inconsistentResolution")
+            }
+            VideoSuggestionsProcessingWarnings::ProblematicAudioCodec => {
+                write!(f, "problematicAudioCodec")
+            }
+            VideoSuggestionsProcessingWarnings::ProblematicHdrLookupTable => {
+                write!(f, "problematicHdrLookupTable")
+            }
+            VideoSuggestionsProcessingWarnings::ProblematicVideoCodec => {
+                write!(f, "problematicVideoCodec")
+            }
+            VideoSuggestionsProcessingWarnings::UnknownAudioCodec => write!(f, "unknownAudioCodec"),
+            VideoSuggestionsProcessingWarnings::UnknownContainer => write!(f, "unknownContainer"),
+            VideoSuggestionsProcessingWarnings::UnknownVideoCodec => write!(f, "unknownVideoCodec"),
+            VideoSuggestionsProcessingWarnings::UnsupportedHdrColorMetadata => {
+                write!(f, "unsupportedHdrColorMetadata")
+            }
+            VideoSuggestionsProcessingWarnings::UnsupportedHdrPixelFormat => {
+                write!(f, "unsupportedHdrPixelFormat")
+            }
+            VideoSuggestionsProcessingWarnings::UnsupportedSphericalProjectionType => {
+                write!(f, "unsupportedSphericalProjectionType")
+            }
+            VideoSuggestionsProcessingWarnings::UnsupportedVrStereoMode => {
+                write!(f, "unsupportedVrStereoMode")
+            }
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum CommentThreadsListModerationStatus {
+    Undefined,
+    /// The comment is available for public display.
+    #[serde(rename = "heldForReview")]
+    HeldForReview,
+    /// The comment is awaiting review by a moderator.
+    #[serde(rename = "likelySpam")]
+    LikelySpam,
+    #[serde(rename = "published")]
+    Published,
+    /// The comment is unfit for display.
+    #[serde(rename = "rejected")]
+    Rejected,
+}
+
+impl std::default::Default for CommentThreadsListModerationStatus {
+    fn default() -> CommentThreadsListModerationStatus {
+        CommentThreadsListModerationStatus::Undefined
+    }
+}
+
+impl std::fmt::Display for CommentThreadsListModerationStatus {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            CommentThreadsListModerationStatus::Undefined => write!(f, "undefined"),
+            CommentThreadsListModerationStatus::HeldForReview => write!(f, "heldForReview"),
+            CommentThreadsListModerationStatus::LikelySpam => write!(f, "likelySpam"),
+            CommentThreadsListModerationStatus::Published => write!(f, "published"),
+            CommentThreadsListModerationStatus::Rejected => write!(f, "rejected"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum CommentThreadsListOrder {
+    Undefined,
+    #[serde(rename = "orderUnspecified")]
+    OrderUnspecified,
+    /// Order by time.
+    #[serde(rename = "relevance")]
+    Relevance,
+    /// Order by relevance.
+    #[serde(rename = "time")]
+    Time,
+}
+
+impl std::default::Default for CommentThreadsListOrder {
+    fn default() -> CommentThreadsListOrder {
+        CommentThreadsListOrder::Undefined
+    }
+}
+
+impl std::fmt::Display for CommentThreadsListOrder {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            CommentThreadsListOrder::Undefined => write!(f, "undefined"),
+            CommentThreadsListOrder::OrderUnspecified => write!(f, "orderUnspecified"),
+            CommentThreadsListOrder::Relevance => write!(f, "relevance"),
+            CommentThreadsListOrder::Time => write!(f, "time"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum CommentThreadsListTextFormat {
+    Undefined,
+    #[serde(rename = "html")]
+    Html,
+    /// Returns the comments in HTML format. This is the default value.
+    #[serde(rename = "plainText")]
+    PlainText,
+    /// Returns the comments in plain text format.
+    #[serde(rename = "textFormatUnspecified")]
+    TextFormatUnspecified,
+}
+
+impl std::default::Default for CommentThreadsListTextFormat {
+    fn default() -> CommentThreadsListTextFormat {
+        CommentThreadsListTextFormat::Undefined
+    }
+}
+
+impl std::fmt::Display for CommentThreadsListTextFormat {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            CommentThreadsListTextFormat::Undefined => write!(f, "undefined"),
+            CommentThreadsListTextFormat::Html => write!(f, "html"),
+            CommentThreadsListTextFormat::PlainText => write!(f, "plainText"),
+            CommentThreadsListTextFormat::TextFormatUnspecified => {
+                write!(f, "textFormatUnspecified")
+            }
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum CommentsListTextFormat {
+    Undefined,
+    #[serde(rename = "html")]
+    Html,
+    /// Returns the comments in HTML format. This is the default value.
+    #[serde(rename = "plainText")]
+    PlainText,
+    /// Returns the comments in plain text format.
+    #[serde(rename = "textFormatUnspecified")]
+    TextFormatUnspecified,
+}
+
+impl std::default::Default for CommentsListTextFormat {
+    fn default() -> CommentsListTextFormat {
+        CommentsListTextFormat::Undefined
+    }
+}
+
+impl std::fmt::Display for CommentsListTextFormat {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            CommentsListTextFormat::Undefined => write!(f, "undefined"),
+            CommentsListTextFormat::Html => write!(f, "html"),
+            CommentsListTextFormat::PlainText => write!(f, "plainText"),
+            CommentsListTextFormat::TextFormatUnspecified => write!(f, "textFormatUnspecified"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum CommentsSetModerationStatusModerationStatus {
+    Undefined,
+    /// The comment is available for public display.
+    #[serde(rename = "heldForReview")]
+    HeldForReview,
+    /// The comment is awaiting review by a moderator.
+    #[serde(rename = "likelySpam")]
+    LikelySpam,
+    #[serde(rename = "published")]
+    Published,
+    /// The comment is unfit for display.
+    #[serde(rename = "rejected")]
+    Rejected,
+}
+
+impl std::default::Default for CommentsSetModerationStatusModerationStatus {
+    fn default() -> CommentsSetModerationStatusModerationStatus {
+        CommentsSetModerationStatusModerationStatus::Undefined
+    }
+}
+
+impl std::fmt::Display for CommentsSetModerationStatusModerationStatus {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            CommentsSetModerationStatusModerationStatus::Undefined => write!(f, "undefined"),
+            CommentsSetModerationStatusModerationStatus::HeldForReview => {
+                write!(f, "heldForReview")
+            }
+            CommentsSetModerationStatusModerationStatus::LikelySpam => write!(f, "likelySpam"),
+            CommentsSetModerationStatusModerationStatus::Published => write!(f, "published"),
+            CommentsSetModerationStatusModerationStatus::Rejected => write!(f, "rejected"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum LiveBroadcastsListBroadcastStatus {
+    Undefined,
+    #[serde(rename = "active")]
+    Active,
+    /// Return all broadcasts.
+    #[serde(rename = "all")]
+    All,
+    /// Return current live broadcasts.
+    #[serde(rename = "broadcastStatusFilterUnspecified")]
+    BroadcastStatusFilterUnspecified,
+    /// Return broadcasts that have not yet started.
+    #[serde(rename = "completed")]
+    Completed,
+    /// Return broadcasts that have already ended.
+    #[serde(rename = "upcoming")]
+    Upcoming,
+}
+
+impl std::default::Default for LiveBroadcastsListBroadcastStatus {
+    fn default() -> LiveBroadcastsListBroadcastStatus {
+        LiveBroadcastsListBroadcastStatus::Undefined
+    }
+}
+
+impl std::fmt::Display for LiveBroadcastsListBroadcastStatus {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            LiveBroadcastsListBroadcastStatus::Undefined => write!(f, "undefined"),
+            LiveBroadcastsListBroadcastStatus::Active => write!(f, "active"),
+            LiveBroadcastsListBroadcastStatus::All => write!(f, "all"),
+            LiveBroadcastsListBroadcastStatus::BroadcastStatusFilterUnspecified => {
+                write!(f, "broadcastStatusFilterUnspecified")
+            }
+            LiveBroadcastsListBroadcastStatus::Completed => write!(f, "completed"),
+            LiveBroadcastsListBroadcastStatus::Upcoming => write!(f, "upcoming"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum LiveBroadcastsListBroadcastType {
+    Undefined,
+    #[serde(rename = "all")]
+    All,
+    /// Return all broadcasts.
+    #[serde(rename = "broadcastTypeFilterUnspecified")]
+    BroadcastTypeFilterUnspecified,
+    /// Return only scheduled event broadcasts.
+    #[serde(rename = "event")]
+    Event,
+    /// Return only persistent broadcasts.
+    #[serde(rename = "persistent")]
+    Persistent,
+}
+
+impl std::default::Default for LiveBroadcastsListBroadcastType {
+    fn default() -> LiveBroadcastsListBroadcastType {
+        LiveBroadcastsListBroadcastType::Undefined
+    }
+}
+
+impl std::fmt::Display for LiveBroadcastsListBroadcastType {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            LiveBroadcastsListBroadcastType::Undefined => write!(f, "undefined"),
+            LiveBroadcastsListBroadcastType::All => write!(f, "all"),
+            LiveBroadcastsListBroadcastType::BroadcastTypeFilterUnspecified => {
+                write!(f, "broadcastTypeFilterUnspecified")
+            }
+            LiveBroadcastsListBroadcastType::Event => write!(f, "event"),
+            LiveBroadcastsListBroadcastType::Persistent => write!(f, "persistent"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum LiveBroadcastsTransitionBroadcastStatus {
+    Undefined,
     #[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 LiveBroadcastStatusPrivacyStatus {
-    Undefined,
-    #[serde(rename = "public")]
-    Public,
-    #[serde(rename = "unlisted")]
-    Unlisted,
-    #[serde(rename = "private")]
-    Private,
-}
-
-impl std::default::Default for LiveBroadcastStatusPrivacyStatus {
-    fn default() -> LiveBroadcastStatusPrivacyStatus {
-        LiveBroadcastStatusPrivacyStatus::Undefined
-    }
-}
-
-impl std::fmt::Display for LiveBroadcastStatusPrivacyStatus {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            LiveBroadcastStatusPrivacyStatus::Undefined => write!(f, "undefined"),
-            LiveBroadcastStatusPrivacyStatus::Public => write!(f, "public"),
-            LiveBroadcastStatusPrivacyStatus::Unlisted => write!(f, "unlisted"),
-            LiveBroadcastStatusPrivacyStatus::Private => write!(f, "private"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum LiveBroadcastStatusRecordingStatus {
-    Undefined,
-    /// No value or the value is unknown.
-    #[serde(rename = "liveBroadcastRecordingStatusUnspecified")]
-    LiveBroadcastRecordingStatusUnspecified,
-    /// The recording has not yet been started.
-    #[serde(rename = "notRecording")]
-    NotRecording,
-    /// The recording is currently on.
-    #[serde(rename = "recording")]
-    Recording,
-    /// The recording is completed, and cannot be started again.
-    #[serde(rename = "recorded")]
-    Recorded,
-}
-
-impl std::default::Default for LiveBroadcastStatusRecordingStatus {
-    fn default() -> LiveBroadcastStatusRecordingStatus {
-        LiveBroadcastStatusRecordingStatus::Undefined
-    }
-}
-
-impl std::fmt::Display for LiveBroadcastStatusRecordingStatus {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            LiveBroadcastStatusRecordingStatus::Undefined => write!(f, "undefined"),
-            LiveBroadcastStatusRecordingStatus::LiveBroadcastRecordingStatusUnspecified => {
-                write!(f, "liveBroadcastRecordingStatusUnspecified")
-            }
-            LiveBroadcastStatusRecordingStatus::NotRecording => write!(f, "notRecording"),
-            LiveBroadcastStatusRecordingStatus::Recording => write!(f, "recording"),
-            LiveBroadcastStatusRecordingStatus::Recorded => write!(f, "recorded"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum LiveBroadcastStatusLiveBroadcastPriority {
-    Undefined,
-    #[serde(rename = "liveBroadcastPriorityUnspecified")]
-    LiveBroadcastPriorityUnspecified,
-    /// Low priority broadcast: for low view count HoAs or other low priority broadcasts.
-    #[serde(rename = "low")]
-    Low,
-    /// Normal priority broadcast: for regular HoAs and broadcasts.
-    #[serde(rename = "normal")]
-    Normal,
-    /// High priority broadcast: for high profile HoAs, like PixelCorp ones.
-    #[serde(rename = "high")]
-    High,
-}
-
-impl std::default::Default for LiveBroadcastStatusLiveBroadcastPriority {
-    fn default() -> LiveBroadcastStatusLiveBroadcastPriority {
-        LiveBroadcastStatusLiveBroadcastPriority::Undefined
-    }
-}
-
-impl std::fmt::Display for LiveBroadcastStatusLiveBroadcastPriority {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            LiveBroadcastStatusLiveBroadcastPriority::Undefined => write!(f, "undefined"),
-            LiveBroadcastStatusLiveBroadcastPriority::LiveBroadcastPriorityUnspecified => {
-                write!(f, "liveBroadcastPriorityUnspecified")
-            }
-            LiveBroadcastStatusLiveBroadcastPriority::Low => write!(f, "low"),
-            LiveBroadcastStatusLiveBroadcastPriority::Normal => write!(f, "normal"),
-            LiveBroadcastStatusLiveBroadcastPriority::High => write!(f, "high"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum InvideoTimingType {
-    Undefined,
-    #[serde(rename = "offsetFromStart")]
-    OffsetFromStart,
-    #[serde(rename = "offsetFromEnd")]
-    OffsetFromEnd,
-}
-
-impl std::default::Default for InvideoTimingType {
-    fn default() -> InvideoTimingType {
-        InvideoTimingType::Undefined
-    }
-}
-
-impl std::fmt::Display for InvideoTimingType {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            InvideoTimingType::Undefined => write!(f, "undefined"),
-            InvideoTimingType::OffsetFromStart => write!(f, "offsetFromStart"),
-            InvideoTimingType::OffsetFromEnd => write!(f, "offsetFromEnd"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ChannelStatusPrivacyStatus {
-    Undefined,
-    #[serde(rename = "public")]
-    Public,
-    #[serde(rename = "unlisted")]
-    Unlisted,
-    #[serde(rename = "private")]
-    Private,
-}
-
-impl std::default::Default for ChannelStatusPrivacyStatus {
-    fn default() -> ChannelStatusPrivacyStatus {
-        ChannelStatusPrivacyStatus::Undefined
-    }
-}
-
-impl std::fmt::Display for ChannelStatusPrivacyStatus {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ChannelStatusPrivacyStatus::Undefined => write!(f, "undefined"),
-            ChannelStatusPrivacyStatus::Public => write!(f, "public"),
-            ChannelStatusPrivacyStatus::Unlisted => write!(f, "unlisted"),
-            ChannelStatusPrivacyStatus::Private => write!(f, "private"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ChannelStatusLongUploadsStatus {
-    Undefined,
-    #[serde(rename = "longUploadsUnspecified")]
-    LongUploadsUnspecified,
-    #[serde(rename = "allowed")]
-    Allowed,
-    #[serde(rename = "eligible")]
-    Eligible,
-    #[serde(rename = "disallowed")]
-    Disallowed,
-}
-
-impl std::default::Default for ChannelStatusLongUploadsStatus {
-    fn default() -> ChannelStatusLongUploadsStatus {
-        ChannelStatusLongUploadsStatus::Undefined
-    }
-}
-
-impl std::fmt::Display for ChannelStatusLongUploadsStatus {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ChannelStatusLongUploadsStatus::Undefined => write!(f, "undefined"),
-            ChannelStatusLongUploadsStatus::LongUploadsUnspecified => {
-                write!(f, "longUploadsUnspecified")
-            }
-            ChannelStatusLongUploadsStatus::Allowed => write!(f, "allowed"),
-            ChannelStatusLongUploadsStatus::Eligible => write!(f, "eligible"),
-            ChannelStatusLongUploadsStatus::Disallowed => write!(f, "disallowed"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ActivityContentDetailsSocialType {
-    Undefined,
-    #[serde(rename = "typeUnspecified")]
-    TypeUnspecified,
-    #[serde(rename = "googlePlus")]
-    GooglePlus,
-    #[serde(rename = "facebook")]
-    Facebook,
-    #[serde(rename = "twitter")]
-    Twitter,
-}
-
-impl std::default::Default for ActivityContentDetailsSocialType {
-    fn default() -> ActivityContentDetailsSocialType {
-        ActivityContentDetailsSocialType::Undefined
-    }
-}
-
-impl std::fmt::Display for ActivityContentDetailsSocialType {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ActivityContentDetailsSocialType::Undefined => write!(f, "undefined"),
-            ActivityContentDetailsSocialType::TypeUnspecified => write!(f, "typeUnspecified"),
-            ActivityContentDetailsSocialType::GooglePlus => write!(f, "googlePlus"),
-            ActivityContentDetailsSocialType::Facebook => write!(f, "facebook"),
-            ActivityContentDetailsSocialType::Twitter => write!(f, "twitter"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum InvideoPositionCornerPosition {
-    Undefined,
-    #[serde(rename = "topLeft")]
-    TopLeft,
-    #[serde(rename = "topRight")]
-    TopRight,
-    #[serde(rename = "bottomLeft")]
-    BottomLeft,
-    #[serde(rename = "bottomRight")]
-    BottomRight,
-}
-
-impl std::default::Default for InvideoPositionCornerPosition {
-    fn default() -> InvideoPositionCornerPosition {
-        InvideoPositionCornerPosition::Undefined
-    }
-}
-
-impl std::fmt::Display for InvideoPositionCornerPosition {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            InvideoPositionCornerPosition::Undefined => write!(f, "undefined"),
-            InvideoPositionCornerPosition::TopLeft => write!(f, "topLeft"),
-            InvideoPositionCornerPosition::TopRight => write!(f, "topRight"),
-            InvideoPositionCornerPosition::BottomLeft => write!(f, "bottomLeft"),
-            InvideoPositionCornerPosition::BottomRight => write!(f, "bottomRight"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum InvideoPositionType {
-    Undefined,
-    #[serde(rename = "corner")]
-    Corner,
-}
-
-impl std::default::Default for InvideoPositionType {
-    fn default() -> InvideoPositionType {
-        InvideoPositionType::Undefined
-    }
-}
-
-impl std::fmt::Display for InvideoPositionType {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            InvideoPositionType::Undefined => write!(f, "undefined"),
-            InvideoPositionType::Corner => write!(f, "corner"),
-        };
-        Ok(())
-    }
-}
-
-#[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"),
+    /// Start testing the broadcast. YouTube transmits video to the broadcast's monitor stream. Note that you can only transition a broadcast to the testing state if its contentDetails.monitorStream.enableMonitorStream property is set to true.",
+    #[serde(rename = "live")]
+    Live,
+    /// Return only persistent broadcasts.
+    #[serde(rename = "statusUnspecified")]
+    StatusUnspecified,
+    /// The broadcast is over. YouTube stops transmitting video.
+    #[serde(rename = "testing")]
+    Testing,
+}
+
+impl std::default::Default for LiveBroadcastsTransitionBroadcastStatus {
+    fn default() -> LiveBroadcastsTransitionBroadcastStatus {
+        LiveBroadcastsTransitionBroadcastStatus::Undefined
+    }
+}
+
+impl std::fmt::Display for LiveBroadcastsTransitionBroadcastStatus {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            LiveBroadcastsTransitionBroadcastStatus::Undefined => write!(f, "undefined"),
+            LiveBroadcastsTransitionBroadcastStatus::Complete => write!(f, "complete"),
+            LiveBroadcastsTransitionBroadcastStatus::Live => write!(f, "live"),
+            LiveBroadcastsTransitionBroadcastStatus::StatusUnspecified => {
+                write!(f, "statusUnspecified")
+            }
+            LiveBroadcastsTransitionBroadcastStatus::Testing => write!(f, "testing"),
         };
         Ok(())
     }
@@ -10360,14 +10642,14 @@
 #[derive(Debug, Clone, Copy, Serialize, Deserialize)]
 pub enum MembersListMode {
     Undefined,
+    #[serde(rename = "all_current")]
+    All_current,
+    /// Return only members that joined after the first call with this mode was made.
     #[serde(rename = "listMembersModeUnknown")]
     ListMembersModeUnknown,
-    /// Return only members that joined after the first call with this mode was made.
+    /// Return all current members, from newest to oldest.
     #[serde(rename = "updates")]
     Updates,
-    /// Return all current members, from newest to oldest.
-    #[serde(rename = "all_current")]
-    All_current,
 }
 
 impl std::default::Default for MembersListMode {
@@ -10380,40 +10662,522 @@
     fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
         let s = match self {
             MembersListMode::Undefined => write!(f, "undefined"),
+            MembersListMode::All_current => write!(f, "all_current"),
             MembersListMode::ListMembersModeUnknown => write!(f, "listMembersModeUnknown"),
             MembersListMode::Updates => write!(f, "updates"),
-            MembersListMode::All_current => write!(f, "all_current"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum VideosListMyRating {
-    Undefined,
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum SearchListChannelType {
+    Undefined,
+    #[serde(rename = "any")]
+    Any,
+    /// Return all channels.
+    #[serde(rename = "channelTypeUnspecified")]
+    ChannelTypeUnspecified,
+    /// Only retrieve shows.
+    #[serde(rename = "show")]
+    Show,
+}
+
+impl std::default::Default for SearchListChannelType {
+    fn default() -> SearchListChannelType {
+        SearchListChannelType::Undefined
+    }
+}
+
+impl std::fmt::Display for SearchListChannelType {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            SearchListChannelType::Undefined => write!(f, "undefined"),
+            SearchListChannelType::Any => write!(f, "any"),
+            SearchListChannelType::ChannelTypeUnspecified => write!(f, "channelTypeUnspecified"),
+            SearchListChannelType::Show => write!(f, "show"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum SearchListEventType {
+    Undefined,
+    #[serde(rename = "completed")]
+    Completed,
+    /// The live broadcast is upcoming.
+    #[serde(rename = "live")]
+    Live,
+    /// The live broadcast is active.
+    #[serde(rename = "none")]
+    None,
+    /// The live broadcast has been completed.
+    #[serde(rename = "upcoming")]
+    Upcoming,
+}
+
+impl std::default::Default for SearchListEventType {
+    fn default() -> SearchListEventType {
+        SearchListEventType::Undefined
+    }
+}
+
+impl std::fmt::Display for SearchListEventType {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            SearchListEventType::Undefined => write!(f, "undefined"),
+            SearchListEventType::Completed => write!(f, "completed"),
+            SearchListEventType::Live => write!(f, "live"),
+            SearchListEventType::None => write!(f, "none"),
+            SearchListEventType::Upcoming => write!(f, "upcoming"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum SearchListOrder {
+    Undefined,
+    #[serde(rename = "date")]
+    Date,
+    /// Resources are sorted in reverse chronological order based on the date they were created.
+    #[serde(rename = "rating")]
+    Rating,
+    /// Resources are sorted from highest to lowest rating.
+    #[serde(rename = "relevance")]
+    Relevance,
+    /// Resources are sorted from highest to lowest number of views.
+    #[serde(rename = "searchSortUnspecified")]
+    SearchSortUnspecified,
+    /// Resources are sorted based on their relevance to the search query. This is the default value for this parameter.
+    #[serde(rename = "title")]
+    Title,
+    /// Resources are sorted alphabetically by title.
+    #[serde(rename = "videoCount")]
+    VideoCount,
+    /// Channels are sorted in descending order of their number of uploaded videos.
+    #[serde(rename = "viewCount")]
+    ViewCount,
+}
+
+impl std::default::Default for SearchListOrder {
+    fn default() -> SearchListOrder {
+        SearchListOrder::Undefined
+    }
+}
+
+impl std::fmt::Display for SearchListOrder {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            SearchListOrder::Undefined => write!(f, "undefined"),
+            SearchListOrder::Date => write!(f, "date"),
+            SearchListOrder::Rating => write!(f, "rating"),
+            SearchListOrder::Relevance => write!(f, "relevance"),
+            SearchListOrder::SearchSortUnspecified => write!(f, "searchSortUnspecified"),
+            SearchListOrder::Title => write!(f, "title"),
+            SearchListOrder::VideoCount => write!(f, "videoCount"),
+            SearchListOrder::ViewCount => write!(f, "viewCount"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum SearchListSafeSearch {
+    Undefined,
+    #[serde(rename = "moderate")]
+    Moderate,
+    /// YouTube will not filter the search result set.
+    #[serde(rename = "none")]
+    None,
+    /// YouTube will filter some content from search results and, at the least, will filter content that is restricted in your locale. Based on their content, search results could be removed from search results or demoted in search results. This is the default parameter value.
+    #[serde(rename = "safeSearchSettingUnspecified")]
+    SafeSearchSettingUnspecified,
+    /// YouTube will try to exclude all restricted content from the search result set. Based on their content, search results could be removed from search results or demoted in search results.
+    #[serde(rename = "strict")]
+    Strict,
+}
+
+impl std::default::Default for SearchListSafeSearch {
+    fn default() -> SearchListSafeSearch {
+        SearchListSafeSearch::Undefined
+    }
+}
+
+impl std::fmt::Display for SearchListSafeSearch {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            SearchListSafeSearch::Undefined => write!(f, "undefined"),
+            SearchListSafeSearch::Moderate => write!(f, "moderate"),
+            SearchListSafeSearch::None => write!(f, "none"),
+            SearchListSafeSearch::SafeSearchSettingUnspecified => {
+                write!(f, "safeSearchSettingUnspecified")
+            }
+            SearchListSafeSearch::Strict => write!(f, "strict"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum SearchListVideoCaption {
+    Undefined,
+    #[serde(rename = "any")]
+    Any,
+    /// Do not filter results based on caption availability.
+    #[serde(rename = "closedCaption")]
+    ClosedCaption,
+    /// Only include videos that have captions.
     #[serde(rename = "none")]
     None,
-    /// The entity is liked.
-    #[serde(rename = "like")]
-    Like,
-    /// The entity is disliked.
-    #[serde(rename = "dislike")]
-    Dislike,
-}
-
-impl std::default::Default for VideosListMyRating {
-    fn default() -> VideosListMyRating {
-        VideosListMyRating::Undefined
-    }
-}
-
-impl std::fmt::Display for VideosListMyRating {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            VideosListMyRating::Undefined => write!(f, "undefined"),
-            VideosListMyRating::None => write!(f, "none"),
-            VideosListMyRating::Like => write!(f, "like"),
-            VideosListMyRating::Dislike => write!(f, "dislike"),
+    /// Only include videos that do not have captions.
+    #[serde(rename = "videoCaptionUnspecified")]
+    VideoCaptionUnspecified,
+}
+
+impl std::default::Default for SearchListVideoCaption {
+    fn default() -> SearchListVideoCaption {
+        SearchListVideoCaption::Undefined
+    }
+}
+
+impl std::fmt::Display for SearchListVideoCaption {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            SearchListVideoCaption::Undefined => write!(f, "undefined"),
+            SearchListVideoCaption::Any => write!(f, "any"),
+            SearchListVideoCaption::ClosedCaption => write!(f, "closedCaption"),
+            SearchListVideoCaption::None => write!(f, "none"),
+            SearchListVideoCaption::VideoCaptionUnspecified => write!(f, "videoCaptionUnspecified"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum SearchListVideoDefinition {
+    Undefined,
+    /// Return all videos, regardless of their resolution.
+    #[serde(rename = "any")]
+    Any,
+    /// Only retrieve videos in standard definition.
+    #[serde(rename = "high")]
+    High,
+    /// Only retrieve HD videos.
+    #[serde(rename = "standard")]
+    Standard,
+}
+
+impl std::default::Default for SearchListVideoDefinition {
+    fn default() -> SearchListVideoDefinition {
+        SearchListVideoDefinition::Undefined
+    }
+}
+
+impl std::fmt::Display for SearchListVideoDefinition {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            SearchListVideoDefinition::Undefined => write!(f, "undefined"),
+            SearchListVideoDefinition::Any => write!(f, "any"),
+            SearchListVideoDefinition::High => write!(f, "high"),
+            SearchListVideoDefinition::Standard => write!(f, "standard"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum SearchListVideoDimension {
+    Undefined,
+    #[serde(rename = "2d")]
+    _2d,
+    /// Restrict search results to exclude 3D videos.
+    #[serde(rename = "3d")]
+    _3d,
+    /// Restrict search results to only include 3D videos.
+    #[serde(rename = "any")]
+    Any,
+}
+
+impl std::default::Default for SearchListVideoDimension {
+    fn default() -> SearchListVideoDimension {
+        SearchListVideoDimension::Undefined
+    }
+}
+
+impl std::fmt::Display for SearchListVideoDimension {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            SearchListVideoDimension::Undefined => write!(f, "undefined"),
+            SearchListVideoDimension::_2d => write!(f, "2d"),
+            SearchListVideoDimension::_3d => write!(f, "3d"),
+            SearchListVideoDimension::Any => write!(f, "any"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum SearchListVideoDuration {
+    Undefined,
+    #[serde(rename = "any")]
+    Any,
+    /// Do not filter video search results based on their duration. This is the default value.
+    #[serde(rename = "long")]
+    Long,
+    /// Only include videos that are less than four minutes long.
+    #[serde(rename = "medium")]
+    Medium,
+    /// Only include videos that are between four and 20 minutes long (inclusive).
+    #[serde(rename = "short")]
+    Short,
+    /// Only include videos longer than 20 minutes.
+    #[serde(rename = "videoDurationUnspecified")]
+    VideoDurationUnspecified,
+}
+
+impl std::default::Default for SearchListVideoDuration {
+    fn default() -> SearchListVideoDuration {
+        SearchListVideoDuration::Undefined
+    }
+}
+
+impl std::fmt::Display for SearchListVideoDuration {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            SearchListVideoDuration::Undefined => write!(f, "undefined"),
+            SearchListVideoDuration::Any => write!(f, "any"),
+            SearchListVideoDuration::Long => write!(f, "long"),
+            SearchListVideoDuration::Medium => write!(f, "medium"),
+            SearchListVideoDuration::Short => write!(f, "short"),
+            SearchListVideoDuration::VideoDurationUnspecified => {
+                write!(f, "videoDurationUnspecified")
+            }
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum SearchListVideoEmbeddable {
+    Undefined,
+    #[serde(rename = "any")]
+    Any,
+    /// Return all videos, embeddable or not.
+    #[serde(rename = "true")]
+    True,
+    /// Only retrieve embeddable videos.
+    #[serde(rename = "videoEmbeddableUnspecified")]
+    VideoEmbeddableUnspecified,
+}
+
+impl std::default::Default for SearchListVideoEmbeddable {
+    fn default() -> SearchListVideoEmbeddable {
+        SearchListVideoEmbeddable::Undefined
+    }
+}
+
+impl std::fmt::Display for SearchListVideoEmbeddable {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            SearchListVideoEmbeddable::Undefined => write!(f, "undefined"),
+            SearchListVideoEmbeddable::Any => write!(f, "any"),
+            SearchListVideoEmbeddable::True => write!(f, "true"),
+            SearchListVideoEmbeddable::VideoEmbeddableUnspecified => {
+                write!(f, "videoEmbeddableUnspecified")
+            }
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum SearchListVideoLicense {
+    Undefined,
+    /// Return all videos, regardless of which license they have, that match the query parameters.
+    #[serde(rename = "any")]
+    Any,
+    /// Only return videos that have the standard YouTube license.
+    #[serde(rename = "creativeCommon")]
+    CreativeCommon,
+    /// Only return videos that have a Creative Commons license. Users can reuse videos with this license in other videos that they create. Learn more.
+    #[serde(rename = "youtube")]
+    Youtube,
+}
+
+impl std::default::Default for SearchListVideoLicense {
+    fn default() -> SearchListVideoLicense {
+        SearchListVideoLicense::Undefined
+    }
+}
+
+impl std::fmt::Display for SearchListVideoLicense {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            SearchListVideoLicense::Undefined => write!(f, "undefined"),
+            SearchListVideoLicense::Any => write!(f, "any"),
+            SearchListVideoLicense::CreativeCommon => write!(f, "creativeCommon"),
+            SearchListVideoLicense::Youtube => write!(f, "youtube"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum SearchListVideoSyndicated {
+    Undefined,
+    #[serde(rename = "any")]
+    Any,
+    /// Return all videos, syndicated or not.
+    #[serde(rename = "true")]
+    True,
+    /// Only retrieve syndicated videos.
+    #[serde(rename = "videoSyndicatedUnspecified")]
+    VideoSyndicatedUnspecified,
+}
+
+impl std::default::Default for SearchListVideoSyndicated {
+    fn default() -> SearchListVideoSyndicated {
+        SearchListVideoSyndicated::Undefined
+    }
+}
+
+impl std::fmt::Display for SearchListVideoSyndicated {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            SearchListVideoSyndicated::Undefined => write!(f, "undefined"),
+            SearchListVideoSyndicated::Any => write!(f, "any"),
+            SearchListVideoSyndicated::True => write!(f, "true"),
+            SearchListVideoSyndicated::VideoSyndicatedUnspecified => {
+                write!(f, "videoSyndicatedUnspecified")
+            }
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum SearchListVideoType {
+    Undefined,
+    #[serde(rename = "any")]
+    Any,
+    /// Return all videos.
+    #[serde(rename = "episode")]
+    Episode,
+    /// Only retrieve movies.
+    #[serde(rename = "movie")]
+    Movie,
+    /// Only retrieve episodes of shows.
+    #[serde(rename = "videoTypeUnspecified")]
+    VideoTypeUnspecified,
+}
+
+impl std::default::Default for SearchListVideoType {
+    fn default() -> SearchListVideoType {
+        SearchListVideoType::Undefined
+    }
+}
+
+impl std::fmt::Display for SearchListVideoType {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            SearchListVideoType::Undefined => write!(f, "undefined"),
+            SearchListVideoType::Any => write!(f, "any"),
+            SearchListVideoType::Episode => write!(f, "episode"),
+            SearchListVideoType::Movie => write!(f, "movie"),
+            SearchListVideoType::VideoTypeUnspecified => write!(f, "videoTypeUnspecified"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum SubscriptionsListOrder {
+    Undefined,
+    #[serde(rename = "alphabetical")]
+    Alphabetical,
+    /// Sort by relevance.
+    #[serde(rename = "relevance")]
+    Relevance,
+    /// Sort by order of activity.
+    #[serde(rename = "subscriptionOrderUnspecified")]
+    SubscriptionOrderUnspecified,
+    /// Sort alphabetically.
+    #[serde(rename = "unread")]
+    Unread,
+}
+
+impl std::default::Default for SubscriptionsListOrder {
+    fn default() -> SubscriptionsListOrder {
+        SubscriptionsListOrder::Undefined
+    }
+}
+
+impl std::fmt::Display for SubscriptionsListOrder {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            SubscriptionsListOrder::Undefined => write!(f, "undefined"),
+            SubscriptionsListOrder::Alphabetical => write!(f, "alphabetical"),
+            SubscriptionsListOrder::Relevance => write!(f, "relevance"),
+            SubscriptionsListOrder::SubscriptionOrderUnspecified => {
+                write!(f, "subscriptionOrderUnspecified")
+            }
+            SubscriptionsListOrder::Unread => write!(f, "unread"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ThirdPartyLinksDeleteType {
+    Undefined,
+    #[serde(rename = "channelToStoreLink")]
+    ChannelToStoreLink,
+    /// 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 = "linkUnspecified")]
+    LinkUnspecified,
+}
+
+impl std::default::Default for ThirdPartyLinksDeleteType {
+    fn default() -> ThirdPartyLinksDeleteType {
+        ThirdPartyLinksDeleteType::Undefined
+    }
+}
+
+impl std::fmt::Display for ThirdPartyLinksDeleteType {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            ThirdPartyLinksDeleteType::Undefined => write!(f, "undefined"),
+            ThirdPartyLinksDeleteType::ChannelToStoreLink => write!(f, "channelToStoreLink"),
+            ThirdPartyLinksDeleteType::LinkUnspecified => write!(f, "linkUnspecified"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum ThirdPartyLinksListType {
+    Undefined,
+    #[serde(rename = "channelToStoreLink")]
+    ChannelToStoreLink,
+    /// 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 = "linkUnspecified")]
+    LinkUnspecified,
+}
+
+impl std::default::Default for ThirdPartyLinksListType {
+    fn default() -> ThirdPartyLinksListType {
+        ThirdPartyLinksListType::Undefined
+    }
+}
+
+impl std::fmt::Display for ThirdPartyLinksListType {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            ThirdPartyLinksListType::Undefined => write!(f, "undefined"),
+            ThirdPartyLinksListType::ChannelToStoreLink => write!(f, "channelToStoreLink"),
+            ThirdPartyLinksListType::LinkUnspecified => write!(f, "linkUnspecified"),
         };
         Ok(())
     }
@@ -10447,16 +11211,47 @@
 }
 
 #[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum VideosRateRating {
-    Undefined,
-    #[serde(rename = "none")]
-    None,
+pub enum VideosListMyRating {
+    Undefined,
+    #[serde(rename = "dislike")]
+    Dislike,
     /// The entity is liked.
     #[serde(rename = "like")]
     Like,
     /// The entity is disliked.
+    #[serde(rename = "none")]
+    None,
+}
+
+impl std::default::Default for VideosListMyRating {
+    fn default() -> VideosListMyRating {
+        VideosListMyRating::Undefined
+    }
+}
+
+impl std::fmt::Display for VideosListMyRating {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let s = match self {
+            VideosListMyRating::Undefined => write!(f, "undefined"),
+            VideosListMyRating::Dislike => write!(f, "dislike"),
+            VideosListMyRating::Like => write!(f, "like"),
+            VideosListMyRating::None => write!(f, "none"),
+        };
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+pub enum VideosRateRating {
+    Undefined,
     #[serde(rename = "dislike")]
     Dislike,
+    /// The entity is liked.
+    #[serde(rename = "like")]
+    Like,
+    /// The entity is disliked.
+    #[serde(rename = "none")]
+    None,
 }
 
 impl std::default::Default for VideosRateRating {
@@ -10469,804 +11264,37 @@
     fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
         let s = match self {
             VideosRateRating::Undefined => write!(f, "undefined"),
-            VideosRateRating::None => write!(f, "none"),
+            VideosRateRating::Dislike => write!(f, "dislike"),
             VideosRateRating::Like => write!(f, "like"),
-            VideosRateRating::Dislike => write!(f, "dislike"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum SearchListVideoSyndicated {
-    Undefined,
-    #[serde(rename = "videoSyndicatedUnspecified")]
-    VideoSyndicatedUnspecified,
-    /// Return all videos, syndicated or not.
-    #[serde(rename = "any")]
-    Any,
-    /// Only retrieve syndicated videos.
-    #[serde(rename = "true")]
-    True,
-}
-
-impl std::default::Default for SearchListVideoSyndicated {
-    fn default() -> SearchListVideoSyndicated {
-        SearchListVideoSyndicated::Undefined
-    }
-}
-
-impl std::fmt::Display for SearchListVideoSyndicated {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            SearchListVideoSyndicated::Undefined => write!(f, "undefined"),
-            SearchListVideoSyndicated::VideoSyndicatedUnspecified => {
-                write!(f, "videoSyndicatedUnspecified")
-            }
-            SearchListVideoSyndicated::Any => write!(f, "any"),
-            SearchListVideoSyndicated::True => write!(f, "true"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum SearchListChannelType {
-    Undefined,
-    #[serde(rename = "channelTypeUnspecified")]
-    ChannelTypeUnspecified,
-    /// Return all channels.
-    #[serde(rename = "any")]
-    Any,
-    /// Only retrieve shows.
-    #[serde(rename = "show")]
-    Show,
-}
-
-impl std::default::Default for SearchListChannelType {
-    fn default() -> SearchListChannelType {
-        SearchListChannelType::Undefined
-    }
-}
-
-impl std::fmt::Display for SearchListChannelType {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            SearchListChannelType::Undefined => write!(f, "undefined"),
-            SearchListChannelType::ChannelTypeUnspecified => write!(f, "channelTypeUnspecified"),
-            SearchListChannelType::Any => write!(f, "any"),
-            SearchListChannelType::Show => write!(f, "show"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum SearchListVideoDimension {
-    Undefined,
-    #[serde(rename = "any")]
-    Any,
-    /// Restrict search results to exclude 3D videos.
-    #[serde(rename = "2d")]
-    _2d,
-    /// Restrict search results to only include 3D videos.
-    #[serde(rename = "3d")]
-    _3d,
-}
-
-impl std::default::Default for SearchListVideoDimension {
-    fn default() -> SearchListVideoDimension {
-        SearchListVideoDimension::Undefined
-    }
-}
-
-impl std::fmt::Display for SearchListVideoDimension {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            SearchListVideoDimension::Undefined => write!(f, "undefined"),
-            SearchListVideoDimension::Any => write!(f, "any"),
-            SearchListVideoDimension::_2d => write!(f, "2d"),
-            SearchListVideoDimension::_3d => write!(f, "3d"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum SearchListVideoDuration {
-    Undefined,
-    #[serde(rename = "videoDurationUnspecified")]
-    VideoDurationUnspecified,
-    /// Do not filter video search results based on their duration. This is the default value.
-    #[serde(rename = "any")]
-    Any,
-    /// Only include videos that are less than four minutes long.
-    #[serde(rename = "short")]
-    Short,
-    /// Only include videos that are between four and 20 minutes long (inclusive).
-    #[serde(rename = "medium")]
-    Medium,
-    /// Only include videos longer than 20 minutes.
-    #[serde(rename = "long")]
-    Long,
-}
-
-impl std::default::Default for SearchListVideoDuration {
-    fn default() -> SearchListVideoDuration {
-        SearchListVideoDuration::Undefined
-    }
-}
-
-impl std::fmt::Display for SearchListVideoDuration {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            SearchListVideoDuration::Undefined => write!(f, "undefined"),
-            SearchListVideoDuration::VideoDurationUnspecified => {
-                write!(f, "videoDurationUnspecified")
-            }
-            SearchListVideoDuration::Any => write!(f, "any"),
-            SearchListVideoDuration::Short => write!(f, "short"),
-            SearchListVideoDuration::Medium => write!(f, "medium"),
-            SearchListVideoDuration::Long => write!(f, "long"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum SearchListOrder {
-    Undefined,
-    #[serde(rename = "searchSortUnspecified")]
-    SearchSortUnspecified,
-    /// Resources are sorted in reverse chronological order based on the date they were created.
-    #[serde(rename = "date")]
-    Date,
-    /// Resources are sorted from highest to lowest rating.
-    #[serde(rename = "rating")]
-    Rating,
-    /// Resources are sorted from highest to lowest number of views.
-    #[serde(rename = "viewCount")]
-    ViewCount,
-    /// Resources are sorted based on their relevance to the search query. This is the default value for this parameter.
-    #[serde(rename = "relevance")]
-    Relevance,
-    /// Resources are sorted alphabetically by title.
-    #[serde(rename = "title")]
-    Title,
-    /// Channels are sorted in descending order of their number of uploaded videos.
-    #[serde(rename = "videoCount")]
-    VideoCount,
-}
-
-impl std::default::Default for SearchListOrder {
-    fn default() -> SearchListOrder {
-        SearchListOrder::Undefined
-    }
-}
-
-impl std::fmt::Display for SearchListOrder {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            SearchListOrder::Undefined => write!(f, "undefined"),
-            SearchListOrder::SearchSortUnspecified => write!(f, "searchSortUnspecified"),
-            SearchListOrder::Date => write!(f, "date"),
-            SearchListOrder::Rating => write!(f, "rating"),
-            SearchListOrder::ViewCount => write!(f, "viewCount"),
-            SearchListOrder::Relevance => write!(f, "relevance"),
-            SearchListOrder::Title => write!(f, "title"),
-            SearchListOrder::VideoCount => write!(f, "videoCount"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum SearchListVideoLicense {
-    Undefined,
-    /// Return all videos, regardless of which license they have, that match the query parameters.
-    #[serde(rename = "any")]
-    Any,
-    /// Only return videos that have the standard YouTube license.
-    #[serde(rename = "youtube")]
-    Youtube,
-    /// Only return videos that have a Creative Commons license. Users can reuse videos with this license in other videos that they create. Learn more.
-    #[serde(rename = "creativeCommon")]
-    CreativeCommon,
-}
-
-impl std::default::Default for SearchListVideoLicense {
-    fn default() -> SearchListVideoLicense {
-        SearchListVideoLicense::Undefined
-    }
-}
-
-impl std::fmt::Display for SearchListVideoLicense {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            SearchListVideoLicense::Undefined => write!(f, "undefined"),
-            SearchListVideoLicense::Any => write!(f, "any"),
-            SearchListVideoLicense::Youtube => write!(f, "youtube"),
-            SearchListVideoLicense::CreativeCommon => write!(f, "creativeCommon"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum SearchListSafeSearch {
-    Undefined,
-    #[serde(rename = "safeSearchSettingUnspecified")]
-    SafeSearchSettingUnspecified,
-    /// YouTube will not filter the search result set.
-    #[serde(rename = "none")]
-    None,
-    /// YouTube will filter some content from search results and, at the least, will filter content that is restricted in your locale. Based on their content, search results could be removed from search results or demoted in search results. This is the default parameter value.
-    #[serde(rename = "moderate")]
-    Moderate,
-    /// YouTube will try to exclude all restricted content from the search result set. Based on their content, search results could be removed from search results or demoted in search results.
-    #[serde(rename = "strict")]
-    Strict,
-}
-
-impl std::default::Default for SearchListSafeSearch {
-    fn default() -> SearchListSafeSearch {
-        SearchListSafeSearch::Undefined
-    }
-}
-
-impl std::fmt::Display for SearchListSafeSearch {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            SearchListSafeSearch::Undefined => write!(f, "undefined"),
-            SearchListSafeSearch::SafeSearchSettingUnspecified => {
-                write!(f, "safeSearchSettingUnspecified")
-            }
-            SearchListSafeSearch::None => write!(f, "none"),
-            SearchListSafeSearch::Moderate => write!(f, "moderate"),
-            SearchListSafeSearch::Strict => write!(f, "strict"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum SearchListVideoType {
-    Undefined,
-    #[serde(rename = "videoTypeUnspecified")]
-    VideoTypeUnspecified,
-    /// Return all videos.
-    #[serde(rename = "any")]
-    Any,
-    /// Only retrieve movies.
-    #[serde(rename = "movie")]
-    Movie,
-    /// Only retrieve episodes of shows.
-    #[serde(rename = "episode")]
-    Episode,
-}
-
-impl std::default::Default for SearchListVideoType {
-    fn default() -> SearchListVideoType {
-        SearchListVideoType::Undefined
-    }
-}
-
-impl std::fmt::Display for SearchListVideoType {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            SearchListVideoType::Undefined => write!(f, "undefined"),
-            SearchListVideoType::VideoTypeUnspecified => write!(f, "videoTypeUnspecified"),
-            SearchListVideoType::Any => write!(f, "any"),
-            SearchListVideoType::Movie => write!(f, "movie"),
-            SearchListVideoType::Episode => write!(f, "episode"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum SearchListVideoEmbeddable {
-    Undefined,
-    #[serde(rename = "videoEmbeddableUnspecified")]
-    VideoEmbeddableUnspecified,
-    /// Return all videos, embeddable or not.
-    #[serde(rename = "any")]
-    Any,
-    /// Only retrieve embeddable videos.
-    #[serde(rename = "true")]
-    True,
-}
-
-impl std::default::Default for SearchListVideoEmbeddable {
-    fn default() -> SearchListVideoEmbeddable {
-        SearchListVideoEmbeddable::Undefined
-    }
-}
-
-impl std::fmt::Display for SearchListVideoEmbeddable {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            SearchListVideoEmbeddable::Undefined => write!(f, "undefined"),
-            SearchListVideoEmbeddable::VideoEmbeddableUnspecified => {
-                write!(f, "videoEmbeddableUnspecified")
-            }
-            SearchListVideoEmbeddable::Any => write!(f, "any"),
-            SearchListVideoEmbeddable::True => write!(f, "true"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum SearchListVideoDefinition {
-    Undefined,
-    /// Return all videos, regardless of their resolution.
-    #[serde(rename = "any")]
-    Any,
-    /// Only retrieve videos in standard definition.
-    #[serde(rename = "standard")]
-    Standard,
-    /// Only retrieve HD videos.
-    #[serde(rename = "high")]
-    High,
-}
-
-impl std::default::Default for SearchListVideoDefinition {
-    fn default() -> SearchListVideoDefinition {
-        SearchListVideoDefinition::Undefined
-    }
-}
-
-impl std::fmt::Display for SearchListVideoDefinition {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            SearchListVideoDefinition::Undefined => write!(f, "undefined"),
-            SearchListVideoDefinition::Any => write!(f, "any"),
-            SearchListVideoDefinition::Standard => write!(f, "standard"),
-            SearchListVideoDefinition::High => write!(f, "high"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum SearchListVideoCaption {
-    Undefined,
-    #[serde(rename = "videoCaptionUnspecified")]
-    VideoCaptionUnspecified,
-    /// Do not filter results based on caption availability.
-    #[serde(rename = "any")]
-    Any,
-    /// Only include videos that have captions.
-    #[serde(rename = "closedCaption")]
-    ClosedCaption,
-    /// Only include videos that do not have captions.
-    #[serde(rename = "none")]
-    None,
-}
-
-impl std::default::Default for SearchListVideoCaption {
-    fn default() -> SearchListVideoCaption {
-        SearchListVideoCaption::Undefined
-    }
-}
-
-impl std::fmt::Display for SearchListVideoCaption {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            SearchListVideoCaption::Undefined => write!(f, "undefined"),
-            SearchListVideoCaption::VideoCaptionUnspecified => write!(f, "videoCaptionUnspecified"),
-            SearchListVideoCaption::Any => write!(f, "any"),
-            SearchListVideoCaption::ClosedCaption => write!(f, "closedCaption"),
-            SearchListVideoCaption::None => write!(f, "none"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum SearchListEventType {
-    Undefined,
-    #[serde(rename = "none")]
-    None,
-    /// The live broadcast is upcoming.
-    #[serde(rename = "upcoming")]
-    Upcoming,
-    /// The live broadcast is active.
-    #[serde(rename = "live")]
-    Live,
-    /// The live broadcast has been completed.
-    #[serde(rename = "completed")]
-    Completed,
-}
-
-impl std::default::Default for SearchListEventType {
-    fn default() -> SearchListEventType {
-        SearchListEventType::Undefined
-    }
-}
-
-impl std::fmt::Display for SearchListEventType {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            SearchListEventType::Undefined => write!(f, "undefined"),
-            SearchListEventType::None => write!(f, "none"),
-            SearchListEventType::Upcoming => write!(f, "upcoming"),
-            SearchListEventType::Live => write!(f, "live"),
-            SearchListEventType::Completed => write!(f, "completed"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ThirdPartyLinksDeleteType {
-    Undefined,
-    #[serde(rename = "linkUnspecified")]
-    LinkUnspecified,
-    /// A link that is connecting (or about to connect) a channel with a store on a merchandising platform in order to enable retail commerce capabilities for that channel on YouTube.
-    #[serde(rename = "channelToStoreLink")]
-    ChannelToStoreLink,
-}
-
-impl std::default::Default for ThirdPartyLinksDeleteType {
-    fn default() -> ThirdPartyLinksDeleteType {
-        ThirdPartyLinksDeleteType::Undefined
-    }
-}
-
-impl std::fmt::Display for ThirdPartyLinksDeleteType {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ThirdPartyLinksDeleteType::Undefined => write!(f, "undefined"),
-            ThirdPartyLinksDeleteType::LinkUnspecified => write!(f, "linkUnspecified"),
-            ThirdPartyLinksDeleteType::ChannelToStoreLink => write!(f, "channelToStoreLink"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum ThirdPartyLinksListType {
-    Undefined,
-    #[serde(rename = "linkUnspecified")]
-    LinkUnspecified,
-    /// A link that is connecting (or about to connect) a channel with a store on a merchandising platform in order to enable retail commerce capabilities for that channel on YouTube.
-    #[serde(rename = "channelToStoreLink")]
-    ChannelToStoreLink,
-}
-
-impl std::default::Default for ThirdPartyLinksListType {
-    fn default() -> ThirdPartyLinksListType {
-        ThirdPartyLinksListType::Undefined
-    }
-}
-
-impl std::fmt::Display for ThirdPartyLinksListType {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            ThirdPartyLinksListType::Undefined => write!(f, "undefined"),
-            ThirdPartyLinksListType::LinkUnspecified => write!(f, "linkUnspecified"),
-            ThirdPartyLinksListType::ChannelToStoreLink => write!(f, "channelToStoreLink"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum LiveBroadcastsTransitionBroadcastStatus {
-    Undefined,
-    #[serde(rename = "statusUnspecified")]
-    StatusUnspecified,
-    /// Start testing the broadcast. YouTube transmits video to the broadcast's monitor stream. Note that you can only transition a broadcast to the testing state if its contentDetails.monitorStream.enableMonitorStream property is set to true.",
-    #[serde(rename = "testing")]
-    Testing,
-    /// Return only persistent broadcasts.
-    #[serde(rename = "live")]
-    Live,
-    /// The broadcast is over. YouTube stops transmitting video.
-    #[serde(rename = "complete")]
-    Complete,
-}
-
-impl std::default::Default for LiveBroadcastsTransitionBroadcastStatus {
-    fn default() -> LiveBroadcastsTransitionBroadcastStatus {
-        LiveBroadcastsTransitionBroadcastStatus::Undefined
-    }
-}
-
-impl std::fmt::Display for LiveBroadcastsTransitionBroadcastStatus {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            LiveBroadcastsTransitionBroadcastStatus::Undefined => write!(f, "undefined"),
-            LiveBroadcastsTransitionBroadcastStatus::StatusUnspecified => {
-                write!(f, "statusUnspecified")
-            }
-            LiveBroadcastsTransitionBroadcastStatus::Testing => write!(f, "testing"),
-            LiveBroadcastsTransitionBroadcastStatus::Live => write!(f, "live"),
-            LiveBroadcastsTransitionBroadcastStatus::Complete => write!(f, "complete"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum LiveBroadcastsListBroadcastType {
-    Undefined,
-    #[serde(rename = "broadcastTypeFilterUnspecified")]
-    BroadcastTypeFilterUnspecified,
-    /// Return all broadcasts.
-    #[serde(rename = "all")]
-    All,
-    /// Return only scheduled event broadcasts.
-    #[serde(rename = "event")]
-    Event,
-    /// Return only persistent broadcasts.
-    #[serde(rename = "persistent")]
-    Persistent,
-}
-
-impl std::default::Default for LiveBroadcastsListBroadcastType {
-    fn default() -> LiveBroadcastsListBroadcastType {
-        LiveBroadcastsListBroadcastType::Undefined
-    }
-}
-
-impl std::fmt::Display for LiveBroadcastsListBroadcastType {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            LiveBroadcastsListBroadcastType::Undefined => write!(f, "undefined"),
-            LiveBroadcastsListBroadcastType::BroadcastTypeFilterUnspecified => {
-                write!(f, "broadcastTypeFilterUnspecified")
-            }
-            LiveBroadcastsListBroadcastType::All => write!(f, "all"),
-            LiveBroadcastsListBroadcastType::Event => write!(f, "event"),
-            LiveBroadcastsListBroadcastType::Persistent => write!(f, "persistent"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum LiveBroadcastsListBroadcastStatus {
-    Undefined,
-    #[serde(rename = "broadcastStatusFilterUnspecified")]
-    BroadcastStatusFilterUnspecified,
-    /// Return all broadcasts.
-    #[serde(rename = "all")]
-    All,
-    /// Return current live broadcasts.
-    #[serde(rename = "active")]
-    Active,
-    /// Return broadcasts that have not yet started.
-    #[serde(rename = "upcoming")]
-    Upcoming,
-    /// Return broadcasts that have already ended.
-    #[serde(rename = "completed")]
-    Completed,
-}
-
-impl std::default::Default for LiveBroadcastsListBroadcastStatus {
-    fn default() -> LiveBroadcastsListBroadcastStatus {
-        LiveBroadcastsListBroadcastStatus::Undefined
-    }
-}
-
-impl std::fmt::Display for LiveBroadcastsListBroadcastStatus {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            LiveBroadcastsListBroadcastStatus::Undefined => write!(f, "undefined"),
-            LiveBroadcastsListBroadcastStatus::BroadcastStatusFilterUnspecified => {
-                write!(f, "broadcastStatusFilterUnspecified")
-            }
-            LiveBroadcastsListBroadcastStatus::All => write!(f, "all"),
-            LiveBroadcastsListBroadcastStatus::Active => write!(f, "active"),
-            LiveBroadcastsListBroadcastStatus::Upcoming => write!(f, "upcoming"),
-            LiveBroadcastsListBroadcastStatus::Completed => write!(f, "completed"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum SubscriptionsListOrder {
-    Undefined,
-    #[serde(rename = "subscriptionOrderUnspecified")]
-    SubscriptionOrderUnspecified,
-    /// Sort by relevance.
-    #[serde(rename = "relevance")]
-    Relevance,
-    /// Sort by order of activity.
-    #[serde(rename = "unread")]
-    Unread,
-    /// Sort alphabetically.
-    #[serde(rename = "alphabetical")]
-    Alphabetical,
-}
-
-impl std::default::Default for SubscriptionsListOrder {
-    fn default() -> SubscriptionsListOrder {
-        SubscriptionsListOrder::Undefined
-    }
-}
-
-impl std::fmt::Display for SubscriptionsListOrder {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            SubscriptionsListOrder::Undefined => write!(f, "undefined"),
-            SubscriptionsListOrder::SubscriptionOrderUnspecified => {
-                write!(f, "subscriptionOrderUnspecified")
-            }
-            SubscriptionsListOrder::Relevance => write!(f, "relevance"),
-            SubscriptionsListOrder::Unread => write!(f, "unread"),
-            SubscriptionsListOrder::Alphabetical => write!(f, "alphabetical"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum CommentsSetModerationStatusModerationStatus {
-    Undefined,
-    /// The comment is available for public display.
-    #[serde(rename = "published")]
-    Published,
-    /// The comment is awaiting review by a moderator.
-    #[serde(rename = "heldForReview")]
-    HeldForReview,
-    #[serde(rename = "likelySpam")]
-    LikelySpam,
-    /// The comment is unfit for display.
-    #[serde(rename = "rejected")]
-    Rejected,
-}
-
-impl std::default::Default for CommentsSetModerationStatusModerationStatus {
-    fn default() -> CommentsSetModerationStatusModerationStatus {
-        CommentsSetModerationStatusModerationStatus::Undefined
-    }
-}
-
-impl std::fmt::Display for CommentsSetModerationStatusModerationStatus {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            CommentsSetModerationStatusModerationStatus::Undefined => write!(f, "undefined"),
-            CommentsSetModerationStatusModerationStatus::Published => write!(f, "published"),
-            CommentsSetModerationStatusModerationStatus::HeldForReview => {
-                write!(f, "heldForReview")
-            }
-            CommentsSetModerationStatusModerationStatus::LikelySpam => write!(f, "likelySpam"),
-            CommentsSetModerationStatusModerationStatus::Rejected => write!(f, "rejected"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum CommentsListTextFormat {
-    Undefined,
-    #[serde(rename = "textFormatUnspecified")]
-    TextFormatUnspecified,
-    /// Returns the comments in HTML format. This is the default value.
-    #[serde(rename = "html")]
-    Html,
-    /// Returns the comments in plain text format.
-    #[serde(rename = "plainText")]
-    PlainText,
-}
-
-impl std::default::Default for CommentsListTextFormat {
-    fn default() -> CommentsListTextFormat {
-        CommentsListTextFormat::Undefined
-    }
-}
-
-impl std::fmt::Display for CommentsListTextFormat {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            CommentsListTextFormat::Undefined => write!(f, "undefined"),
-            CommentsListTextFormat::TextFormatUnspecified => write!(f, "textFormatUnspecified"),
-            CommentsListTextFormat::Html => write!(f, "html"),
-            CommentsListTextFormat::PlainText => write!(f, "plainText"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum CommentThreadsListTextFormat {
-    Undefined,
-    #[serde(rename = "textFormatUnspecified")]
-    TextFormatUnspecified,
-    /// Returns the comments in HTML format. This is the default value.
-    #[serde(rename = "html")]
-    Html,
-    /// Returns the comments in plain text format.
-    #[serde(rename = "plainText")]
-    PlainText,
-}
-
-impl std::default::Default for CommentThreadsListTextFormat {
-    fn default() -> CommentThreadsListTextFormat {
-        CommentThreadsListTextFormat::Undefined
-    }
-}
-
-impl std::fmt::Display for CommentThreadsListTextFormat {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            CommentThreadsListTextFormat::Undefined => write!(f, "undefined"),
-            CommentThreadsListTextFormat::TextFormatUnspecified => {
-                write!(f, "textFormatUnspecified")
-            }
-            CommentThreadsListTextFormat::Html => write!(f, "html"),
-            CommentThreadsListTextFormat::PlainText => write!(f, "plainText"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum CommentThreadsListModerationStatus {
-    Undefined,
-    /// The comment is available for public display.
-    #[serde(rename = "published")]
-    Published,
-    /// The comment is awaiting review by a moderator.
-    #[serde(rename = "heldForReview")]
-    HeldForReview,
-    #[serde(rename = "likelySpam")]
-    LikelySpam,
-    /// The comment is unfit for display.
-    #[serde(rename = "rejected")]
-    Rejected,
-}
-
-impl std::default::Default for CommentThreadsListModerationStatus {
-    fn default() -> CommentThreadsListModerationStatus {
-        CommentThreadsListModerationStatus::Undefined
-    }
-}
-
-impl std::fmt::Display for CommentThreadsListModerationStatus {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            CommentThreadsListModerationStatus::Undefined => write!(f, "undefined"),
-            CommentThreadsListModerationStatus::Published => write!(f, "published"),
-            CommentThreadsListModerationStatus::HeldForReview => write!(f, "heldForReview"),
-            CommentThreadsListModerationStatus::LikelySpam => write!(f, "likelySpam"),
-            CommentThreadsListModerationStatus::Rejected => write!(f, "rejected"),
-        };
-        Ok(())
-    }
-}
-
-#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
-pub enum CommentThreadsListOrder {
-    Undefined,
-    #[serde(rename = "orderUnspecified")]
-    OrderUnspecified,
-    /// Order by time.
-    #[serde(rename = "time")]
-    Time,
-    /// Order by relevance.
-    #[serde(rename = "relevance")]
-    Relevance,
-}
-
-impl std::default::Default for CommentThreadsListOrder {
-    fn default() -> CommentThreadsListOrder {
-        CommentThreadsListOrder::Undefined
-    }
-}
-
-impl std::fmt::Display for CommentThreadsListOrder {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let s = match self {
-            CommentThreadsListOrder::Undefined => write!(f, "undefined"),
-            CommentThreadsListOrder::OrderUnspecified => write!(f, "orderUnspecified"),
-            CommentThreadsListOrder::Time => write!(f, "time"),
-            CommentThreadsListOrder::Relevance => write!(f, "relevance"),
+            VideosRateRating::None => write!(f, "none"),
+        };
+        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(())
     }
@@ -11304,54 +11332,543 @@
     }
 }
 
-#[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 `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>,
+/// 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 `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 = "channelId")]
+    pub channel_id: 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>,
+    #[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>,
+    /// 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 = "publishedAfter")]
+    pub published_after: Option<String>,
+    #[serde(rename = "publishedBefore")]
+    pub published_before: 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.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()
+            )?;
+        }
+        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.published_after {
+            write!(
+                f,
+                "&publishedAfter={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.published_before {
+            write!(
+                f,
+                "&publishedBefore={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.region_code {
+            write!(
+                f,
+                "&regionCode={}",
+                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,
+    /// ID of the Google+ Page for the channel that the request is be on behalf of
+    #[serde(rename = "onBehalfOf")]
+    pub on_behalf_of: Option<String>,
+    /// *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwner* parameter indicates that the request's authorization credentials identify a YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and get access to all their video and channel data, without having to provide authentication credentials for each individual channel. The actual CMS account that the user authenticates with must be linked to the specified YouTube content owner.
+    #[serde(rename = "onBehalfOfContentOwner")]
+    pub on_behalf_of_content_owner: Option<String>,
+}
+
+impl std::fmt::Display for CaptionsDeleteParams {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        write!(
+            f,
+            "&id={}",
+            percent_encode(format!("{}", self.id).as_bytes(), NON_ALPHANUMERIC).to_string()
+        )?;
+        if let Some(ref v) = self.on_behalf_of {
+            write!(
+                f,
+                "&onBehalfOf={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.on_behalf_of_content_owner {
+            write!(
+                f,
+                "&onBehalfOfContentOwner={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        Ok(())
+    }
+}
+
+/// Parameters for the `captions.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>,
+    /// The ID of the caption track to download, required for One Platform.
+    #[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>,
+    /// *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwner* parameter indicates that the request's authorization credentials identify a YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and get access to all their video and channel data, without having to provide authentication credentials for each individual channel. The actual CMS account that the user authenticates with must be linked to the specified YouTube content owner.
+    #[serde(rename = "onBehalfOfContentOwner")]
+    pub on_behalf_of_content_owner: Option<String>,
+    /// Convert the captions into this format. Supported options are sbv, srt, and vtt.
+    #[serde(rename = "tfmt")]
+    pub tfmt: Option<String>,
+    /// tlang is the language code; machine translate the captions into this language.
+    #[serde(rename = "tlang")]
+    pub tlang: Option<String>,
+}
+
+impl std::fmt::Display for CaptionsDownloadParams {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        if let Some(ref v) = self.on_behalf_of {
+            write!(
+                f,
+                "&onBehalfOf={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.on_behalf_of_content_owner {
+            write!(
+                f,
+                "&onBehalfOfContentOwner={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.tfmt {
+            write!(
+                f,
+                "&tfmt={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.tlang {
+            write!(
+                f,
+                "&tlang={}",
+                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>,
+    /// ID of the Google+ Page for the channel that the request is be on behalf of
+    #[serde(rename = "onBehalfOf")]
+    pub on_behalf_of: Option<String>,
+    /// *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwner* parameter indicates that the request's authorization credentials identify a YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and get access to all their video and channel data, without having to provide authentication credentials for each individual channel. The actual CMS account that the user authenticates with must be linked to the specified YouTube content owner.
+    #[serde(rename = "onBehalfOfContentOwner")]
+    pub on_behalf_of_content_owner: Option<String>,
+    /// The *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>,
+}
+
+impl std::fmt::Display for CaptionsInsertParams {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        write!(
+            f,
+            "&part={}",
+            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
+        )?;
+        if let Some(ref v) = self.on_behalf_of {
+            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.sync {
+            write!(
+                f,
+                "&sync={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        Ok(())
+    }
+}
+
+/// Parameters for the `captions.list` method.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct CaptionsListParams {
+    /// General attributes applying to any API call
+    #[serde(flatten)]
+    pub youtube_params: Option<YoutubeParams>,
+    /// Returns the captions with the given IDs for Stubby or Apiary.
+    #[serde(rename = "id")]
+    pub id: Option<String>,
+    /// 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>,
+    /// The *part* parameter specifies a comma-separated list of one or more caption resource parts that the API response will include. The part names that you can include in the parameter value are id and snippet.
+    #[serde(rename = "part")]
+    pub part: String,
+    /// Returns the captions for the specified video.
+    #[serde(rename = "videoId")]
+    pub video_id: String,
+}
+
+impl std::fmt::Display for CaptionsListParams {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        write!(
+            f,
+            "&part={}",
+            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
+        )?;
+        write!(
+            f,
+            "&videoId={}",
+            percent_encode(format!("{}", self.video_id).as_bytes(), NON_ALPHANUMERIC).to_string()
+        )?;
+        if let Some(ref v) = self.id {
+            write!(
+                f,
+                "&id={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.on_behalf_of {
+            write!(
+                f,
+                "&onBehalfOf={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.on_behalf_of_content_owner {
+            write!(
+                f,
+                "&onBehalfOfContentOwner={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        Ok(())
+    }
+}
+
+/// Parameters for the `captions.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>,
+    /// *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwner* parameter indicates that the request's authorization credentials identify a YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners 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,
+    /// 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 {
+            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.sync {
+            write!(
+                f,
+                "&sync={}",
+                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 `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>,
+    /// This parameter can only be used in a properly authorized request. *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwnerChannel* parameter specifies the YouTube channel ID of the channel to which a video is being added. This parameter is required when a request specifies a value for the onBehalfOfContentOwner parameter, and it can only be used in conjunction with that parameter. In addition, the request must be authorized using a CMS account that is linked to the content owner that the onBehalfOfContentOwner parameter specifies. Finally, the channel that the onBehalfOfContentOwnerChannel parameter value specifies must be linked to the content owner that the onBehalfOfContentOwner parameter specifies. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and perform actions on behalf of the channel specified in the parameter value, without having to provide authentication credentials for each separate channel.
+    #[serde(rename = "onBehalfOfContentOwnerChannel")]
+    pub on_behalf_of_content_owner_channel: Option<String>,
+    /// The *part* parameter serves two purposes in this operation. It identifies the properties that the write operation will set as well as the properties that the API response will include. The part names that you can include in the parameter value are snippet and contentDetails.
+    #[serde(rename = "part")]
+    pub part: String,
+}
+
+impl std::fmt::Display for ChannelSectionsInsertParams {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        write!(
+            f,
+            "&part={}",
+            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
+        )?;
+        if let Some(ref v) = self.on_behalf_of_content_owner {
+            write!(
+                f,
+                "&onBehalfOfContentOwner={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.on_behalf_of_content_owner_channel {
+            write!(
+                f,
+                "&onBehalfOfContentOwnerChannel={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        Ok(())
+    }
+}
+
+/// Parameters for the `channelSections.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 content in specified language
     #[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()
-        )?;
+    /// Return the ChannelSections with the given IDs for Stubby or Apiary.
+    #[serde(rename = "id")]
+    pub id: Option<String>,
+    /// Return the ChannelSections owned by the authenticated user.
+    #[serde(rename = "mine")]
+    pub mine: Option<bool>,
+    /// *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwner* parameter indicates that the request's authorization credentials identify a YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and get access to all their video and channel data, without having to provide authentication credentials for each individual channel. The CMS account that the user authenticates with must be linked to the specified YouTube content owner.
+    #[serde(rename = "onBehalfOfContentOwner")]
+    pub on_behalf_of_content_owner: Option<String>,
+    /// 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,
+}
+
+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.hl {
             write!(
                 f,
@@ -11359,28 +11876,181 @@
                 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()
-        )?;
+        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()
+            )?;
+        }
+        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 `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 within the specified guide category ID.
+    #[serde(rename = "categoryId")]
+    pub category_id: Option<String>,
+    /// 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>,
+    /// Return the channels with the specified IDs.
+    #[serde(rename = "id")]
+    pub id: Option<String>,
+    /// Return the channels managed by the authenticated user.
+    #[serde(rename = "managedByMe")]
+    pub managed_by_me: 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>,
+    /// Return the ids of channels owned by the authenticated user.
+    #[serde(rename = "mine")]
+    pub mine: Option<bool>,
+    /// Return the channels subscribed to the authenticated user
+    #[serde(rename = "mySubscribers")]
+    pub my_subscribers: Option<bool>,
+    /// *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwner* parameter indicates that the request's authorization credentials identify a YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners 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 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,
+}
+
+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.category_id {
+            write!(
+                f,
+                "&categoryId={}",
+                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.id {
+            write!(
+                f,
+                "&id={}",
+                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.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.my_subscribers {
+            write!(
+                f,
+                "&mySubscribers={}",
+                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(())
     }
 }
@@ -11417,93 +12087,86 @@
     }
 }
 
-/// Parameters for the `channels.list` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct ChannelsListParams {
-    /// General attributes applying to any API call
-    #[serde(flatten)]
-    pub youtube_params: Option<YoutubeParams>,
-    /// The *pageToken* parameter identifies a specific page in the result set that should be returned. In an API response, the nextPageToken and prevPageToken properties identify other pages that could be retrieved.
-    #[serde(rename = "pageToken")]
-    pub page_token: Option<String>,
-    /// *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwner* parameter indicates that the request's authorization credentials identify a YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and get access to all their video and channel data, without having to provide authentication credentials for each individual channel. The CMS account that the user authenticates with must be linked to the specified YouTube content owner.
-    #[serde(rename = "onBehalfOfContentOwner")]
-    pub on_behalf_of_content_owner: Option<String>,
-    /// Return the channels within the specified guide category ID.
-    #[serde(rename = "categoryId")]
-    pub category_id: Option<String>,
-    /// The *part* parameter specifies a comma-separated list of one or more channel resource properties that the API response will include. If the parameter identifies a property that contains child properties, the child properties will be included in the response. For example, in a channel resource, the contentDetails property contains other properties, such as the uploads properties. As such, if you set *part=contentDetails*, the API response will also contain all of those nested properties.
-    #[serde(rename = "part")]
-    pub part: String,
-    /// Return the ids of channels owned by the authenticated user.
-    #[serde(rename = "mine")]
-    pub mine: Option<bool>,
-    /// Return the channels subscribed to the authenticated user
-    #[serde(rename = "mySubscribers")]
-    pub my_subscribers: Option<bool>,
-    /// Stands for "host language". Specifies the localization language of the metadata to be filled into snippet.localized. The field is filled with the default metadata if there is no localization in the specified language. The parameter value must be a language code included in the list returned by the i18nLanguages.list method (e.g. en_US, es_MX).
-    #[serde(rename = "hl")]
-    pub hl: Option<String>,
-    /// Return the channels with the specified IDs.
+/// Parameters for the `commentThreads.insert` method.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct CommentThreadsInsertParams {
+    /// General attributes applying to any API call
+    #[serde(flatten)]
+    pub youtube_params: Option<YoutubeParams>,
+    /// The *part* parameter identifies the properties that the API response will include. Set the parameter value to snippet. The snippet part has a quota cost of 2 units.
+    #[serde(rename = "part")]
+    pub part: String,
+}
+
+impl std::fmt::Display for CommentThreadsInsertParams {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        write!(
+            f,
+            "&part={}",
+            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
+        )?;
+        Ok(())
+    }
+}
+
+/// Parameters for the `commentThreads.list` method.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct CommentThreadsListParams {
+    /// General attributes applying to any API call
+    #[serde(flatten)]
+    pub youtube_params: Option<YoutubeParams>,
+    /// Returns the comment threads of all videos of the channel and the channel comments as well.
+    #[serde(rename = "allThreadsRelatedToChannelId")]
+    pub all_threads_related_to_channel_id: Option<String>,
+    /// Returns the comment threads for all the channel comments (ie does not include comments left on videos).
+    #[serde(rename = "channelId")]
+    pub channel_id: Option<String>,
+    /// Returns the comment threads with the given IDs for Stubby or Apiary.
     #[serde(rename = "id")]
     pub id: Option<String>,
     /// The *maxResults* parameter specifies the maximum number of items that should be returned in the result set.
     #[serde(rename = "maxResults")]
     pub max_results: Option<u32>,
-    /// Return the channel associated with a YouTube username.
-    #[serde(rename = "forUsername")]
-    pub for_username: Option<String>,
-    /// Return the channels managed by the authenticated user.
-    #[serde(rename = "managedByMe")]
-    pub managed_by_me: Option<bool>,
-}
-
-impl std::fmt::Display for ChannelsListParams {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        write!(
-            f,
-            "&part={}",
-            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
-        )?;
-        if let Some(ref v) = self.page_token {
-            write!(
-                f,
-                "&pageToken={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.on_behalf_of_content_owner {
-            write!(
-                f,
-                "&onBehalfOfContentOwner={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.category_id {
-            write!(
-                f,
-                "&categoryId={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.mine {
-            write!(
-                f,
-                "&mine={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.my_subscribers {
-            write!(
-                f,
-                "&mySubscribers={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.hl {
-            write!(
-                f,
-                "&hl={}",
+    /// Limits the returned comment threads to those with the specified moderation status. Not compatible with the 'id' filter. Valid values: published, heldForReview, likelySpam.
+    #[serde(rename = "moderationStatus")]
+    pub moderation_status: Option<CommentThreadsListModerationStatus>,
+    #[serde(rename = "order")]
+    pub order: Option<CommentThreadsListOrder>,
+    /// The *pageToken* parameter identifies a specific page in the result set that should be returned. In an API response, the nextPageToken and prevPageToken properties identify other pages that could be retrieved.
+    #[serde(rename = "pageToken")]
+    pub page_token: Option<String>,
+    /// The *part* parameter specifies a comma-separated list of one or more commentThread resource properties that the API response will include.
+    #[serde(rename = "part")]
+    pub part: String,
+    /// Limits the returned comment threads to those matching the specified key words. Not compatible with the 'id' filter.
+    #[serde(rename = "searchTerms")]
+    pub search_terms: Option<String>,
+    /// The requested text format for the returned comments.
+    #[serde(rename = "textFormat")]
+    pub text_format: Option<CommentThreadsListTextFormat>,
+    /// Returns the comment threads of the specified video.
+    #[serde(rename = "videoId")]
+    pub video_id: Option<String>,
+}
+
+impl std::fmt::Display for CommentThreadsListParams {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        write!(
+            f,
+            "&part={}",
+            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
+        )?;
+        if let Some(ref v) = self.all_threads_related_to_channel_id {
+            write!(
+                f,
+                "&allThreadsRelatedToChannelId={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.channel_id {
+            write!(
+                f,
+                "&channelId={}",
                 percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
             )?;
         }
@@ -11521,46 +12184,922 @@
                 percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
             )?;
         }
-        if let Some(ref v) = self.for_username {
-            write!(
-                f,
-                "&forUsername={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.managed_by_me {
-            write!(
-                f,
-                "&managedByMe={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        Ok(())
-    }
-}
-
-/// Parameters for the `superChatEvents.list` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct SuperChatEventsListParams {
-    /// General attributes applying to any API call
-    #[serde(flatten)]
-    pub youtube_params: Option<YoutubeParams>,
-    /// The *part* parameter specifies the superChatEvent resource parts that the API response will include. Supported values are id and snippet.
-    #[serde(rename = "part")]
-    pub part: String,
+        if let Some(ref v) = self.moderation_status {
+            write!(
+                f,
+                "&moderationStatus={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.order {
+            write!(
+                f,
+                "&order={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.page_token {
+            write!(
+                f,
+                "&pageToken={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.search_terms {
+            write!(
+                f,
+                "&searchTerms={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        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.video_id {
+            write!(
+                f,
+                "&videoId={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        Ok(())
+    }
+}
+
+/// Parameters for the `commentThreads.update` method.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct CommentThreadsUpdateParams {
+    /// General attributes applying to any API call
+    #[serde(flatten)]
+    pub youtube_params: Option<YoutubeParams>,
+    /// The *part* parameter specifies a comma-separated list of commentThread resource properties that the API response will include. You must at least include the snippet part in the parameter value since that part contains all of the properties that the API request can update.
+    #[serde(rename = "part")]
+    pub part: String,
+}
+
+impl std::fmt::Display for CommentThreadsUpdateParams {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        write!(
+            f,
+            "&part={}",
+            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
+        )?;
+        Ok(())
+    }
+}
+
+/// Parameters for the `comments.delete` method.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct CommentsDeleteParams {
+    /// General attributes applying to any API call
+    #[serde(flatten)]
+    pub youtube_params: Option<YoutubeParams>,
+    #[serde(rename = "id")]
+    pub id: String,
+}
+
+impl std::fmt::Display for CommentsDeleteParams {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        write!(
+            f,
+            "&id={}",
+            percent_encode(format!("{}", self.id).as_bytes(), NON_ALPHANUMERIC).to_string()
+        )?;
+        Ok(())
+    }
+}
+
+/// Parameters for the `comments.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.
+    #[serde(rename = "id")]
+    pub id: Option<String>,
     /// The *maxResults* parameter specifies the maximum number of items that should be returned in the result set.
     #[serde(rename = "maxResults")]
     pub max_results: Option<u32>,
     /// The *pageToken* parameter identifies a specific page in the result set that should be returned. In an API response, the nextPageToken and prevPageToken properties identify other pages that could be retrieved.
     #[serde(rename = "pageToken")]
     pub page_token: Option<String>,
-    /// Return rendered funding amounts in specified language.
+    /// Returns replies to the specified comment. Note, currently YouTube features only one level of replies (ie replies to top level comments). However replies to replies may be supported in the future.
+    #[serde(rename = "parentId")]
+    pub parent_id: Option<String>,
+    /// The *part* parameter specifies a comma-separated list of one or more comment resource properties that the API response will include.
+    #[serde(rename = "part")]
+    pub part: String,
+    /// The requested text format for the returned comments.
+    #[serde(rename = "textFormat")]
+    pub text_format: Option<CommentsListTextFormat>,
+}
+
+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.id {
+            write!(
+                f,
+                "&id={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.max_results {
+            write!(
+                f,
+                "&maxResults={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.page_token {
+            write!(
+                f,
+                "&pageToken={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.parent_id {
+            write!(
+                f,
+                "&parentId={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.text_format {
+            write!(
+                f,
+                "&textFormat={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        Ok(())
+    }
+}
+
+/// Parameters for the `comments.markAsSpam` method.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct CommentsMarkAsSpamParams {
+    /// General attributes applying to any API call
+    #[serde(flatten)]
+    pub youtube_params: Option<YoutubeParams>,
+    /// Flags the comments with the given IDs as spam in the caller's opinion.
+    #[serde(rename = "id")]
+    pub id: String,
+}
+
+impl std::fmt::Display for CommentsMarkAsSpamParams {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        write!(
+            f,
+            "&id={}",
+            percent_encode(format!("{}", self.id).as_bytes(), NON_ALPHANUMERIC).to_string()
+        )?;
+        Ok(())
+    }
+}
+
+/// Parameters for the `comments.setModerationStatus` method.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct CommentsSetModerationStatusParams {
+    /// General attributes applying to any API call
+    #[serde(flatten)]
+    pub youtube_params: Option<YoutubeParams>,
+    /// If set to true the author of the comment gets added to the ban list. This means all future comments of the author will autmomatically be rejected. Only valid in combination with STATUS_REJECTED.
+    #[serde(rename = "banAuthor")]
+    pub ban_author: Option<bool>,
+    /// Modifies the moderation status of the comments with the given IDs
+    #[serde(rename = "id")]
+    pub id: String,
+    /// Specifies the requested moderation status. Note, comments can be in statuses, which are not available through this call. For example, this call does not allow to mark a comment as 'likely spam'. Valid values: MODERATION_STATUS_PUBLISHED, MODERATION_STATUS_HELD_FOR_REVIEW, MODERATION_STATUS_REJECTED.
+    #[serde(rename = "moderationStatus")]
+    pub moderation_status: CommentsSetModerationStatusModerationStatus,
+}
+
+impl std::fmt::Display for CommentsSetModerationStatusParams {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        write!(
+            f,
+            "&id={}",
+            percent_encode(format!("{}", self.id).as_bytes(), NON_ALPHANUMERIC).to_string()
+        )?;
+        write!(
+            f,
+            "&moderationStatus={}",
+            percent_encode(
+                format!("{}", self.moderation_status).as_bytes(),
+                NON_ALPHANUMERIC
+            )
+            .to_string()
+        )?;
+        if let Some(ref v) = self.ban_author {
+            write!(
+                f,
+                "&banAuthor={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        Ok(())
+    }
+}
+
+/// Parameters for the `comments.update` method.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct CommentsUpdateParams {
+    /// General attributes applying to any API call
+    #[serde(flatten)]
+    pub youtube_params: Option<YoutubeParams>,
+    /// The *part* parameter identifies the properties that the API response will include. You must at least include the snippet part in the parameter value since that part contains all of the properties that the API request can update.
+    #[serde(rename = "part")]
+    pub part: String,
+}
+
+impl std::fmt::Display for CommentsUpdateParams {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        write!(
+            f,
+            "&part={}",
+            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
+        )?;
+        Ok(())
+    }
+}
+
+/// Parameters for the `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 `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>,
-}
-
-impl std::fmt::Display for SuperChatEventsListParams {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+    /// 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 `liveBroadcasts.bind` method.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct LiveBroadcastsBindParams {
+    /// General attributes applying to any API call
+    #[serde(flatten)]
+    pub youtube_params: Option<YoutubeParams>,
+    /// Broadcast to bind to the stream
+    #[serde(rename = "id")]
+    pub id: String,
+    /// *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwner* parameter indicates that the request's authorization credentials identify a YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and get access to all their video and channel data, without having to provide authentication credentials for each individual channel. The CMS account that the user authenticates with must be linked to the specified YouTube content owner.
+    #[serde(rename = "onBehalfOfContentOwner")]
+    pub on_behalf_of_content_owner: Option<String>,
+    /// This parameter can only be used in a properly authorized request. *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwnerChannel* parameter specifies the YouTube channel ID of the channel to which a video is being added. This parameter is required when a request specifies a value for the onBehalfOfContentOwner parameter, and it can only be used in conjunction with that parameter. In addition, the request must be authorized using a CMS account that is linked to the content owner that the onBehalfOfContentOwner parameter specifies. Finally, the channel that the onBehalfOfContentOwnerChannel parameter value specifies must be linked to the content owner that the onBehalfOfContentOwner parameter specifies. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and perform actions on behalf of the channel specified in the parameter value, without having to provide authentication credentials for each separate channel.
+    #[serde(rename = "onBehalfOfContentOwnerChannel")]
+    pub on_behalf_of_content_owner_channel: Option<String>,
+    /// The *part* parameter specifies a comma-separated list of one or more liveBroadcast resource properties that the API response will include. The part names that you can include in the parameter value are id, snippet, contentDetails, and status.
+    #[serde(rename = "part")]
+    pub part: String,
+    /// Stream to bind, if not set unbind the current one.
+    #[serde(rename = "streamId")]
+    pub stream_id: Option<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.on_behalf_of_content_owner {
+            write!(
+                f,
+                "&onBehalfOfContentOwner={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.on_behalf_of_content_owner_channel {
+            write!(
+                f,
+                "&onBehalfOfContentOwnerChannel={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.stream_id {
+            write!(
+                f,
+                "&streamId={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        Ok(())
+    }
+}
+
+/// Parameters for the `liveBroadcasts.delete` method.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct LiveBroadcastsDeleteParams {
+    /// General attributes applying to any API call
+    #[serde(flatten)]
+    pub youtube_params: Option<YoutubeParams>,
+    /// Broadcast to delete.
+    #[serde(rename = "id")]
+    pub id: String,
+    /// *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwner* parameter indicates that the request's authorization credentials identify a YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and get access to all their video and channel data, without having to provide authentication credentials for each individual channel. The CMS account that the user authenticates with must be linked to the specified YouTube content owner.
+    #[serde(rename = "onBehalfOfContentOwner")]
+    pub on_behalf_of_content_owner: Option<String>,
+    /// 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 LiveBroadcastsDeleteParams {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        write!(
+            f,
+            "&id={}",
+            percent_encode(format!("{}", self.id).as_bytes(), NON_ALPHANUMERIC).to_string()
+        )?;
+        if let Some(ref v) = self.on_behalf_of_content_owner {
+            write!(
+                f,
+                "&onBehalfOfContentOwner={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.on_behalf_of_content_owner_channel {
+            write!(
+                f,
+                "&onBehalfOfContentOwnerChannel={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        Ok(())
+    }
+}
+
+/// Parameters for the `liveBroadcasts.insert` method.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct LiveBroadcastsInsertParams {
+    /// General attributes applying to any API call
+    #[serde(flatten)]
+    pub youtube_params: Option<YoutubeParams>,
+    /// *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwner* parameter indicates that the request's authorization credentials identify a YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and get access to all their video and channel data, without having to provide authentication credentials for each individual channel. The CMS account that the user authenticates with must be linked to the specified YouTube content owner.
+    #[serde(rename = "onBehalfOfContentOwner")]
+    pub on_behalf_of_content_owner: Option<String>,
+    /// This parameter can only be used in a properly authorized request. *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwnerChannel* parameter specifies the YouTube channel ID of the channel to which a video is being added. This parameter is required when a request specifies a value for the onBehalfOfContentOwner parameter, and it can only be used in conjunction with that parameter. In addition, the request must be authorized using a CMS account that is linked to the content owner that the onBehalfOfContentOwner parameter specifies. Finally, the channel that the onBehalfOfContentOwnerChannel parameter value specifies must be linked to the content owner that the onBehalfOfContentOwner parameter specifies. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and perform actions on behalf of the channel specified in the parameter value, without having to provide authentication credentials for each separate channel.
+    #[serde(rename = "onBehalfOfContentOwnerChannel")]
+    pub on_behalf_of_content_owner_channel: Option<String>,
+    /// The *part* parameter serves two purposes in this operation. It identifies the properties that the write operation will set as well as the properties that the API response will include. The part properties that you can include in the parameter value are id, snippet, contentDetails, and status.
+    #[serde(rename = "part")]
+    pub part: String,
+}
+
+impl std::fmt::Display for LiveBroadcastsInsertParams {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        write!(
+            f,
+            "&part={}",
+            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
+        )?;
+        if let Some(ref v) = self.on_behalf_of_content_owner {
+            write!(
+                f,
+                "&onBehalfOfContentOwner={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.on_behalf_of_content_owner_channel {
+            write!(
+                f,
+                "&onBehalfOfContentOwnerChannel={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        Ok(())
+    }
+}
+
+/// Parameters for the `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 a certain status, e.g. active broadcasts.
+    #[serde(rename = "broadcastStatus")]
+    pub broadcast_status: Option<LiveBroadcastsListBroadcastStatus>,
+    /// Return only broadcasts with the selected type.
+    #[serde(rename = "broadcastType")]
+    pub broadcast_type: Option<LiveBroadcastsListBroadcastType>,
+    /// Return broadcasts with the given ids from Stubby or Apiary.
+    #[serde(rename = "id")]
+    pub id: Option<String>,
+    /// The *maxResults* parameter specifies the maximum number of items that should be returned in the result set.
+    #[serde(rename = "maxResults")]
+    pub max_results: Option<u32>,
+    #[serde(rename = "mine")]
+    pub mine: Option<bool>,
+    /// *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwner* parameter indicates that the request's authorization credentials identify a YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and get access to all their video and channel data, without having to provide authentication credentials for each individual channel. The CMS account that the user authenticates with must be linked to the specified YouTube content owner.
+    #[serde(rename = "onBehalfOfContentOwner")]
+    pub on_behalf_of_content_owner: Option<String>,
+    /// This parameter can only be used in a properly authorized request. *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwnerChannel* parameter specifies the YouTube channel ID of the channel to which a video is being added. This parameter is required when a request specifies a value for the onBehalfOfContentOwner parameter, and it can only be used in conjunction with that parameter. In addition, the request must be authorized using a CMS account that is linked to the content owner that the onBehalfOfContentOwner parameter specifies. Finally, the channel that the onBehalfOfContentOwnerChannel parameter value specifies must be linked to the content owner that the onBehalfOfContentOwner parameter specifies. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and perform actions on behalf of the channel specified in the parameter value, without having to provide authentication credentials for each separate channel.
+    #[serde(rename = "onBehalfOfContentOwnerChannel")]
+    pub on_behalf_of_content_owner_channel: Option<String>,
+    /// The *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,
+}
+
+impl std::fmt::Display for LiveBroadcastsListParams {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        write!(
+            f,
+            "&part={}",
+            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
+        )?;
+        if let Some(ref v) = self.broadcast_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.id {
+            write!(
+                f,
+                "&id={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.max_results {
+            write!(
+                f,
+                "&maxResults={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.mine {
+            write!(
+                f,
+                "&mine={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.on_behalf_of_content_owner {
+            write!(
+                f,
+                "&onBehalfOfContentOwner={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.on_behalf_of_content_owner_channel {
+            write!(
+                f,
+                "&onBehalfOfContentOwnerChannel={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.page_token {
+            write!(
+                f,
+                "&pageToken={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        Ok(())
+    }
+}
+
+/// Parameters for the `liveBroadcasts.transition` method.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct LiveBroadcastsTransitionParams {
+    /// General attributes applying to any API call
+    #[serde(flatten)]
+    pub youtube_params: Option<YoutubeParams>,
+    /// The status to which the broadcast is going to transition.
+    #[serde(rename = "broadcastStatus")]
+    pub broadcast_status: LiveBroadcastsTransitionBroadcastStatus,
+    /// Broadcast to transition.
+    #[serde(rename = "id")]
+    pub id: String,
+    /// *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwner* parameter indicates that the request's authorization credentials identify a YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and get access to all their video and channel data, without having to provide authentication credentials for each individual channel. The CMS account that the user authenticates with must be linked to the specified YouTube content owner.
+    #[serde(rename = "onBehalfOfContentOwner")]
+    pub on_behalf_of_content_owner: Option<String>,
+    /// This parameter can only be used in a properly authorized request. *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwnerChannel* parameter specifies the YouTube channel ID of the channel to which a video is being added. This parameter is required when a request specifies a value for the onBehalfOfContentOwner parameter, and it can only be used in conjunction with that parameter. In addition, the request must be authorized using a CMS account that is linked to the content owner that the onBehalfOfContentOwner parameter specifies. Finally, the channel that the onBehalfOfContentOwnerChannel parameter value specifies must be linked to the content owner that the onBehalfOfContentOwner parameter specifies. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and perform actions on behalf of the channel specified in the parameter value, without having to provide authentication credentials for each separate channel.
+    #[serde(rename = "onBehalfOfContentOwnerChannel")]
+    pub on_behalf_of_content_owner_channel: Option<String>,
+    /// The *part* parameter specifies a comma-separated list of one or more liveBroadcast resource properties that the API response will include. The part names that you can include in the parameter value are id, snippet, contentDetails, and status.
+    #[serde(rename = "part")]
+    pub part: String,
+}
+
+impl std::fmt::Display for LiveBroadcastsTransitionParams {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        write!(
+            f,
+            "&broadcastStatus={}",
+            percent_encode(
+                format!("{}", self.broadcast_status).as_bytes(),
+                NON_ALPHANUMERIC
+            )
+            .to_string()
+        )?;
+        write!(
+            f,
+            "&id={}",
+            percent_encode(format!("{}", self.id).as_bytes(), NON_ALPHANUMERIC).to_string()
+        )?;
+        write!(
+            f,
+            "&part={}",
+            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
+        )?;
+        if let Some(ref v) = self.on_behalf_of_content_owner {
+            write!(
+                f,
+                "&onBehalfOfContentOwner={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.on_behalf_of_content_owner_channel {
+            write!(
+                f,
+                "&onBehalfOfContentOwnerChannel={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        Ok(())
+    }
+}
+
+/// Parameters for the `liveBroadcasts.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 `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 `liveChatMessages.delete` method.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct LiveChatMessagesDeleteParams {
+    /// General attributes applying to any API call
+    #[serde(flatten)]
+    pub youtube_params: Option<YoutubeParams>,
+    #[serde(rename = "id")]
+    pub id: String,
+}
+
+impl std::fmt::Display for LiveChatMessagesDeleteParams {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        write!(
+            f,
+            "&id={}",
+            percent_encode(format!("{}", self.id).as_bytes(), NON_ALPHANUMERIC).to_string()
+        )?;
+        Ok(())
+    }
+}
+
+/// Parameters for the `liveChatMessages.insert` method.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct LiveChatMessagesInsertParams {
+    /// General attributes applying to any API call
+    #[serde(flatten)]
+    pub youtube_params: Option<YoutubeParams>,
+    /// The *part* parameter serves two purposes. It identifies the properties that the write operation will set as well as the properties that the API response will include. Set the parameter value to snippet.
+    #[serde(rename = "part")]
+    pub part: String,
+}
+
+impl std::fmt::Display for LiveChatMessagesInsertParams {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        write!(
+            f,
+            "&part={}",
+            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
+        )?;
+        Ok(())
+    }
+}
+
+/// Parameters for the `liveChatMessages.list` method.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct LiveChatMessagesListParams {
+    /// General attributes applying to any API call
+    #[serde(flatten)]
+    pub youtube_params: Option<YoutubeParams>,
+    /// Specifies the localization language in which the system messages should be returned.
+    #[serde(rename = "hl")]
+    pub hl: Option<String>,
+    /// The id of the live chat for which comments should be returned.
+    #[serde(rename = "liveChatId")]
+    pub live_chat_id: 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 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 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,
+            "&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.hl {
+            write!(
+                f,
+                "&hl={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.max_results {
+            write!(
+                f,
+                "&maxResults={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.page_token {
+            write!(
+                f,
+                "&pageToken={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.profile_image_size {
+            write!(
+                f,
+                "&profileImageSize={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        Ok(())
+    }
+}
+
+/// Parameters for the `liveChatModerators.delete` method.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct LiveChatModeratorsDeleteParams {
+    /// General attributes applying to any API call
+    #[serde(flatten)]
+    pub youtube_params: Option<YoutubeParams>,
+    #[serde(rename = "id")]
+    pub id: String,
+}
+
+impl std::fmt::Display for LiveChatModeratorsDeleteParams {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        write!(
+            f,
+            "&id={}",
+            percent_encode(format!("{}", self.id).as_bytes(), NON_ALPHANUMERIC).to_string()
+        )?;
+        Ok(())
+    }
+}
+
+/// Parameters for the `liveChatModerators.insert` method.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct LiveChatModeratorsInsertParams {
+    /// General attributes applying to any API call
+    #[serde(flatten)]
+    pub youtube_params: Option<YoutubeParams>,
+    /// The *part* parameter serves two purposes in this operation. It identifies the properties that the write operation will set as well as the properties that the API response returns. Set the parameter value to snippet.
+    #[serde(rename = "part")]
+    pub part: String,
+}
+
+impl std::fmt::Display for LiveChatModeratorsInsertParams {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        write!(
+            f,
+            "&part={}",
+            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
+        )?;
+        Ok(())
+    }
+}
+
+/// Parameters for the `liveChatModerators.list` method.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct LiveChatModeratorsListParams {
+    /// General attributes applying to any API call
+    #[serde(flatten)]
+    pub youtube_params: Option<YoutubeParams>,
+    /// The id of the live chat for which moderators should be returned.
+    #[serde(rename = "liveChatId")]
+    pub live_chat_id: 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 the liveChatModerator resource parts that the API response will include. Supported values are id and snippet.
+    #[serde(rename = "part")]
+    pub part: String,
+}
+
+impl std::fmt::Display for LiveChatModeratorsListParams {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        write!(
+            f,
+            "&liveChatId={}",
+            percent_encode(
+                format!("{}", self.live_chat_id).as_bytes(),
+                NON_ALPHANUMERIC
+            )
+            .to_string()
+        )?;
         write!(
             f,
             "&part={}",
@@ -11580,10 +13119,209 @@
                 percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
             )?;
         }
-        if let Some(ref v) = self.hl {
-            write!(
-                f,
-                "&hl={}",
+        Ok(())
+    }
+}
+
+/// Parameters for the `liveStreams.delete` method.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct LiveStreamsDeleteParams {
+    /// General attributes applying to any API call
+    #[serde(flatten)]
+    pub youtube_params: Option<YoutubeParams>,
+    #[serde(rename = "id")]
+    pub id: String,
+    /// *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwner* parameter indicates that the request's authorization credentials identify a YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and get access to all their video and channel data, without having to provide authentication credentials for each individual channel. The CMS account that the user authenticates with must be linked to the specified YouTube content owner.
+    #[serde(rename = "onBehalfOfContentOwner")]
+    pub on_behalf_of_content_owner: Option<String>,
+    /// This parameter can only be used in a properly authorized request. *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwnerChannel* parameter specifies the YouTube channel ID of the channel to which a video is being added. This parameter is required when a request specifies a value for the onBehalfOfContentOwner parameter, and it can only be used in conjunction with that parameter. In addition, the request must be authorized using a CMS account that is linked to the content owner that the onBehalfOfContentOwner parameter specifies. Finally, the channel that the onBehalfOfContentOwnerChannel parameter value specifies must be linked to the content owner that the onBehalfOfContentOwner parameter specifies. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and perform actions on behalf of the channel specified in the parameter value, without having to provide authentication credentials for each separate channel.
+    #[serde(rename = "onBehalfOfContentOwnerChannel")]
+    pub on_behalf_of_content_owner_channel: Option<String>,
+}
+
+impl std::fmt::Display for LiveStreamsDeleteParams {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        write!(
+            f,
+            "&id={}",
+            percent_encode(format!("{}", self.id).as_bytes(), NON_ALPHANUMERIC).to_string()
+        )?;
+        if let Some(ref v) = self.on_behalf_of_content_owner {
+            write!(
+                f,
+                "&onBehalfOfContentOwner={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.on_behalf_of_content_owner_channel {
+            write!(
+                f,
+                "&onBehalfOfContentOwnerChannel={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        Ok(())
+    }
+}
+
+/// Parameters for the `liveStreams.insert` method.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct LiveStreamsInsertParams {
+    /// General attributes applying to any API call
+    #[serde(flatten)]
+    pub youtube_params: Option<YoutubeParams>,
+    /// *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwner* parameter indicates that the request's authorization credentials identify a YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners 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, content_details, 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.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 *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>,
+    /// *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwner* parameter indicates that the request's authorization credentials identify a YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners 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 *pageToken* parameter identifies a specific page in the result set that should be returned. In an API response, the nextPageToken and prevPageToken properties identify other pages that could be retrieved.
+    #[serde(rename = "pageToken")]
+    pub page_token: Option<String>,
+    /// The *part* parameter specifies a comma-separated list of one or more liveStream resource properties that the API response will include. The part names that you can include in the parameter value are id, snippet, cdn, and status.
+    #[serde(rename = "part")]
+    pub part: String,
+}
+
+impl std::fmt::Display for LiveStreamsListParams {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        write!(
+            f,
+            "&part={}",
+            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
+        )?;
+        if let Some(ref v) = self.id {
+            write!(
+                f,
+                "&id={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.max_results {
+            write!(
+                f,
+                "&maxResults={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.mine {
+            write!(
+                f,
+                "&mine={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.on_behalf_of_content_owner {
+            write!(
+                f,
+                "&onBehalfOfContentOwner={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.on_behalf_of_content_owner_channel {
+            write!(
+                f,
+                "&onBehalfOfContentOwnerChannel={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.page_token {
+            write!(
+                f,
+                "&pageToken={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        Ok(())
+    }
+}
+
+/// Parameters for the `liveStreams.update` method.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct LiveStreamsUpdateParams {
+    /// General attributes applying to any API call
+    #[serde(flatten)]
+    pub youtube_params: Option<YoutubeParams>,
+    /// *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwner* parameter indicates that the request's authorization credentials identify a YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and get access to all their video and channel data, without having to provide authentication credentials for each individual channel. The CMS account that the user authenticates with must be linked to the specified YouTube content owner.
+    #[serde(rename = "onBehalfOfContentOwner")]
+    pub on_behalf_of_content_owner: Option<String>,
+    /// This parameter can only be used in a properly authorized request. *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwnerChannel* parameter specifies the YouTube channel ID of the channel to which a video is being added. This parameter is required when a request specifies a value for the onBehalfOfContentOwner parameter, and it can only be used in conjunction with that parameter. In addition, the request must be authorized using a CMS account that is linked to the content owner that the onBehalfOfContentOwner parameter specifies. Finally, the channel that the onBehalfOfContentOwnerChannel parameter value specifies must be linked to the content owner that the onBehalfOfContentOwner parameter specifies. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and perform actions on behalf of the channel specified in the parameter value, without having to provide authentication credentials for each separate channel.
+    #[serde(rename = "onBehalfOfContentOwnerChannel")]
+    pub on_behalf_of_content_owner_channel: Option<String>,
+    /// The *part* parameter serves two purposes in this operation. It identifies the properties that the write operation will set as well as the properties that the API response will include. The part properties that you can include in the parameter value are id, snippet, cdn, and status. Note that this method will override the existing values for all of the mutable properties that are contained in any parts that the parameter value specifies. If the request body does not specify a value for a mutable property, the existing value for that property will be removed.
+    #[serde(rename = "part")]
+    pub part: String,
+}
+
+impl std::fmt::Display for LiveStreamsUpdateParams {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        write!(
+            f,
+            "&part={}",
+            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
+        )?;
+        if let Some(ref v) = self.on_behalf_of_content_owner {
+            write!(
+                f,
+                "&onBehalfOfContentOwner={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.on_behalf_of_content_owner_channel {
+            write!(
+                f,
+                "&onBehalfOfContentOwnerChannel={}",
                 percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
             )?;
         }
@@ -11597,24 +13335,24 @@
     /// General attributes applying to any API call
     #[serde(flatten)]
     pub youtube_params: Option<YoutubeParams>,
-    /// Parameter that specifies which channel members to return.
-    #[serde(rename = "mode")]
-    pub mode: Option<MembersListMode>,
+    /// 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>,
     /// Filter members in the results set to the ones that have access to a level.
     #[serde(rename = "hasAccessToLevel")]
     pub has_access_to_level: Option<String>,
-    /// The *part* parameter specifies the member resource parts that the API response will include. Set the parameter value to snippet.
-    #[serde(rename = "part")]
-    pub part: String,
-    /// Comma separated list of channel IDs. Only data about members that are part of this list will be included in the response.
-    #[serde(rename = "filterByMemberChannelId")]
-    pub filter_by_member_channel_id: Option<String>,
     /// The *maxResults* parameter specifies the maximum number of items that should be returned in the result set.
     #[serde(rename = "maxResults")]
     pub max_results: Option<u32>,
+    /// Parameter that specifies which channel members to return.
+    #[serde(rename = "mode")]
+    pub mode: Option<MembersListMode>,
     /// 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 member resource parts that the API response will include. Set the parameter value to snippet.
+    #[serde(rename = "part")]
+    pub part: String,
 }
 
 impl std::fmt::Display for MembersListParams {
@@ -11624,10 +13362,10 @@
             "&part={}",
             percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
         )?;
-        if let Some(ref v) = self.mode {
-            write!(
-                f,
-                "&mode={}",
+        if let Some(ref v) = self.filter_by_member_channel_id {
+            write!(
+                f,
+                "&filterByMemberChannelId={}",
                 percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
             )?;
         }
@@ -11638,13 +13376,6 @@
                 percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
             )?;
         }
-        if let Some(ref v) = self.filter_by_member_channel_id {
-            write!(
-                f,
-                "&filterByMemberChannelId={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
         if let Some(ref v) = self.max_results {
             write!(
                 f,
@@ -11652,6 +13383,13 @@
                 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.page_token {
             write!(
                 f,
@@ -11663,78 +13401,24 @@
     }
 }
 
-/// Parameters for the `channelBanners.insert` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct ChannelBannersInsertParams {
-    /// General attributes applying to any API call
-    #[serde(flatten)]
-    pub youtube_params: Option<YoutubeParams>,
-    /// This parameter can only be used in a properly authorized request. *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwnerChannel* parameter specifies the YouTube channel ID of the channel to which a video is being added. This parameter is required when a request specifies a value for the onBehalfOfContentOwner parameter, and it can only be used in conjunction with that parameter. In addition, the request must be authorized using a CMS account that is linked to the content owner that the onBehalfOfContentOwner parameter specifies. Finally, the channel that the onBehalfOfContentOwnerChannel parameter value specifies must be linked to the content owner that the onBehalfOfContentOwner parameter specifies. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and perform actions on behalf of the channel specified in the parameter value, without having to provide authentication credentials for each separate channel.
-    #[serde(rename = "onBehalfOfContentOwnerChannel")]
-    pub on_behalf_of_content_owner_channel: Option<String>,
-    /// Unused, channel_id is currently derived from the security context of the requestor.
-    #[serde(rename = "channelId")]
-    pub channel_id: Option<String>,
-    /// *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwner* parameter indicates that the request's authorization credentials identify a YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and get access to all their video and channel data, without having to provide authentication credentials for each individual channel. The actual CMS account that the user authenticates with must be linked to the specified YouTube content owner.
-    #[serde(rename = "onBehalfOfContentOwner")]
-    pub on_behalf_of_content_owner: Option<String>,
-}
-
-impl std::fmt::Display for ChannelBannersInsertParams {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        if let Some(ref v) = self.on_behalf_of_content_owner_channel {
-            write!(
-                f,
-                "&onBehalfOfContentOwnerChannel={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.channel_id {
-            write!(
-                f,
-                "&channelId={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.on_behalf_of_content_owner {
-            write!(
-                f,
-                "&onBehalfOfContentOwner={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        Ok(())
-    }
-}
-
-/// Parameters for the `playlistItems.update` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct PlaylistItemsUpdateParams {
-    /// General attributes applying to any API call
-    #[serde(flatten)]
-    pub youtube_params: Option<YoutubeParams>,
-    /// The *part* parameter serves two purposes in this operation. It identifies the properties that the write operation will set as well as the properties that the API response will include. Note that this method will override the existing values for all of the mutable properties that are contained in any parts that the parameter value specifies. For example, a playlist item can specify a start time and end time, which identify the times portion of the video that should play when users watch the video in the playlist. If your request is updating a playlist item that sets these values, and the request's part parameter value includes the contentDetails part, the playlist item's start and end times will be updated to whatever value the request body specifies. If the request body does not specify values, the existing start and end times will be removed and replaced with the default settings.
-    #[serde(rename = "part")]
-    pub part: String,
-    /// *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwner* parameter indicates that the request's authorization credentials identify a YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and get access to all their video and channel data, without having to provide authentication credentials for each individual channel. The CMS account that the user authenticates with must be linked to the specified YouTube content owner.
-    #[serde(rename = "onBehalfOfContentOwner")]
-    pub on_behalf_of_content_owner: Option<String>,
-}
-
-impl std::fmt::Display for PlaylistItemsUpdateParams {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        write!(
-            f,
-            "&part={}",
-            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
-        )?;
-        if let Some(ref v) = self.on_behalf_of_content_owner {
-            write!(
-                f,
-                "&onBehalfOfContentOwner={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
+/// 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(())
     }
 }
@@ -11776,12 +13460,12 @@
     /// 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>,
+    /// The *part* parameter serves two purposes in this operation. It identifies the properties that the write operation will set as well as the properties that the API response will include.
+    #[serde(rename = "part")]
+    pub part: String,
 }
 
 impl std::fmt::Display for PlaylistItemsInsertParams {
@@ -11808,26 +13492,26 @@
     /// General attributes applying to any API call
     #[serde(flatten)]
     pub youtube_params: Option<YoutubeParams>,
-    /// The *pageToken* parameter identifies a specific page in the result set that should be returned. In an API response, the nextPageToken and prevPageToken properties identify other pages that could be retrieved.
-    #[serde(rename = "pageToken")]
-    pub page_token: Option<String>,
-    /// Return the playlist items within the given playlist.
-    #[serde(rename = "playlistId")]
-    pub playlist_id: Option<String>,
-    /// The *part* parameter specifies a comma-separated list of one or more playlistItem resource properties that the API response will include. If the parameter identifies a property that contains child properties, the child properties will be included in the response. For example, in a playlistItem resource, the snippet property contains numerous fields, including the title, description, position, and resourceId properties. As such, if you set *part=snippet*, the API response will contain all of those properties.
-    #[serde(rename = "part")]
-    pub part: String,
-    /// *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwner* parameter indicates that the request's authorization credentials identify a YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and get access to all their video and channel data, without having to provide authentication credentials for each individual channel. The CMS account that the user authenticates with must be linked to the specified YouTube content owner.
-    #[serde(rename = "onBehalfOfContentOwner")]
-    pub on_behalf_of_content_owner: Option<String>,
+    #[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>,
+    /// *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwner* parameter indicates that the request's authorization credentials identify a YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners 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 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,
+    /// Return the playlist items within the given playlist.
+    #[serde(rename = "playlistId")]
+    pub playlist_id: Option<String>,
     /// Return the playlist items associated with the given video ID.
     #[serde(rename = "videoId")]
     pub video_id: Option<String>,
-    #[serde(rename = "id")]
-    pub id: Option<String>,
 }
 
 impl std::fmt::Display for PlaylistItemsListParams {
@@ -11837,6 +13521,27 @@
             "&part={}",
             percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
         )?;
+        if let Some(ref v) = self.id {
+            write!(
+                f,
+                "&id={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.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,
@@ -11851,6 +13556,69 @@
                 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()
+            )?;
+        }
+        Ok(())
+    }
+}
+
+/// Parameters for the `playlistItems.update` method.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct PlaylistItemsUpdateParams {
+    /// General attributes applying to any API call
+    #[serde(flatten)]
+    pub youtube_params: Option<YoutubeParams>,
+    /// *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwner* parameter indicates that the request's authorization credentials identify a YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and get access to all their video and channel data, without having to provide authentication credentials for each individual channel. The CMS account that the user authenticates with must be linked to the specified YouTube content owner.
+    #[serde(rename = "onBehalfOfContentOwner")]
+    pub on_behalf_of_content_owner: Option<String>,
+    /// The *part* parameter serves two purposes in this operation. It identifies the properties that the write operation will set as well as the properties that the API response will include. Note that this method will override the existing values for all of the mutable properties that are contained in any parts that the parameter value specifies. For example, a playlist item can specify a start time and end time, which identify the times portion of the video that should play when users watch the video in the playlist. If your request is updating a playlist item that sets these values, and the request's part parameter value includes the contentDetails part, the playlist item's start and end times will be updated to whatever value the request body specifies. If the request body does not specify values, the existing start and end times will be removed and replaced with the default settings.
+    #[serde(rename = "part")]
+    pub part: String,
+}
+
+impl std::fmt::Display for PlaylistItemsUpdateParams {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        write!(
+            f,
+            "&part={}",
+            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
+        )?;
+        if let Some(ref v) = self.on_behalf_of_content_owner {
+            write!(
+                f,
+                "&onBehalfOfContentOwner={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        Ok(())
+    }
+}
+
+/// Parameters for the `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,
@@ -11858,17 +13626,105 @@
                 percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
             )?;
         }
-        if let Some(ref v) = self.max_results {
-            write!(
-                f,
-                "&maxResults={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.video_id {
-            write!(
-                f,
-                "&videoId={}",
+        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.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 specified channel ID.
+    #[serde(rename = "channelId")]
+    pub channel_id: Option<String>,
+    /// Returen content in specified language
+    #[serde(rename = "hl")]
+    pub hl: Option<String>,
+    /// Return the playlists with the given IDs for Stubby or Apiary.
+    #[serde(rename = "id")]
+    pub id: Option<String>,
+    /// 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 playlists owned by the authenticated user.
+    #[serde(rename = "mine")]
+    pub mine: Option<bool>,
+    /// *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwner* parameter indicates that the request's authorization credentials identify a YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and get access to all their video and channel data, without having to provide authentication credentials for each individual channel. The CMS account that the user authenticates with must be linked to the specified YouTube content owner.
+    #[serde(rename = "onBehalfOfContentOwner")]
+    pub on_behalf_of_content_owner: Option<String>,
+    /// This parameter can only be used in a properly authorized request. *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwnerChannel* parameter specifies the YouTube channel ID of the channel to which a video is being added. This parameter is required when a request specifies a value for the onBehalfOfContentOwner parameter, and it can only be used in conjunction with that parameter. In addition, the request must be authorized using a CMS account that is linked to the content owner that the onBehalfOfContentOwner parameter specifies. Finally, the channel that the onBehalfOfContentOwnerChannel parameter value specifies must be linked to the content owner that the onBehalfOfContentOwner parameter specifies. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and perform actions on behalf of the channel specified in the parameter value, without having to provide authentication credentials for each separate channel.
+    #[serde(rename = "onBehalfOfContentOwnerChannel")]
+    pub on_behalf_of_content_owner_channel: Option<String>,
+    /// The *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 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.channel_id {
+            write!(
+                f,
+                "&channelId={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.hl {
+            write!(
+                f,
+                "&hl={}",
                 percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
             )?;
         }
@@ -11879,99 +13735,60 @@
                 percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
             )?;
         }
-        Ok(())
-    }
-}
-
-/// Parameters for the `videoCategories.list` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct VideoCategoriesListParams {
-    /// General attributes applying to any API call
-    #[serde(flatten)]
-    pub youtube_params: Option<YoutubeParams>,
-    /// Returns the video categories with the given IDs for Stubby or Apiary.
-    #[serde(rename = "id")]
-    pub id: Option<String>,
-    /// The *part* parameter specifies the videoCategory resource properties that the API response will include. Set the parameter value to snippet.
-    #[serde(rename = "part")]
-    pub part: String,
-    #[serde(rename = "hl")]
-    pub hl: Option<String>,
-    #[serde(rename = "regionCode")]
-    pub region_code: Option<String>,
-}
-
-impl std::fmt::Display for VideoCategoriesListParams {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        write!(
-            f,
-            "&part={}",
-            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
-        )?;
-        if let Some(ref v) = self.id {
-            write!(
-                f,
-                "&id={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.hl {
-            write!(
-                f,
-                "&hl={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.region_code {
-            write!(
-                f,
-                "&regionCode={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        Ok(())
-    }
-}
-
-/// Parameters for the `videos.reportAbuse` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct VideosReportAbuseParams {
+        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.on_behalf_of_content_owner {
+            write!(
+                f,
+                "&onBehalfOfContentOwner={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.on_behalf_of_content_owner_channel {
+            write!(
+                f,
+                "&onBehalfOfContentOwnerChannel={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.page_token {
+            write!(
+                f,
+                "&pageToken={}",
+                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>,
-}
-
-impl std::fmt::Display for VideosReportAbuseParams {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        if let Some(ref v) = self.on_behalf_of_content_owner {
-            write!(
-                f,
-                "&onBehalfOfContentOwner={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        Ok(())
-    }
-}
-
-/// Parameters for the `videos.update` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct VideosUpdateParams {
-    /// General attributes applying to any API call
-    #[serde(flatten)]
-    pub youtube_params: Option<YoutubeParams>,
-    /// The *part* parameter serves two purposes in this operation. It identifies the properties that the write operation will set as well as the properties that the API response will include. Note that this method will override the existing values for all of the mutable properties that are contained in any parts that the parameter value specifies. For example, a video's privacy setting is contained in the status part. As such, if your request is updating a private video, and the request's part parameter value includes the status part, the video's privacy setting will be updated to whatever value the request body specifies. If the request body does not specify a value, the existing privacy setting will be removed and the video will revert to the default privacy setting. In addition, not all parts contain properties that can be set when inserting or updating a video. For example, the statistics object encapsulates statistics that YouTube calculates for a video and does not contain values that you can set or modify. If the parameter value specifies a part that does not contain mutable values, that part will still be included in the API response.
-    #[serde(rename = "part")]
-    pub part: String,
-    /// *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwner* parameter indicates that the request's authorization credentials identify a YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and get access to all their video and channel data, without having to provide authentication credentials for each individual channel. The actual CMS account that the user authenticates with must be linked to the specified YouTube content owner.
-    #[serde(rename = "onBehalfOfContentOwner")]
-    pub on_behalf_of_content_owner: Option<String>,
-}
-
-impl std::fmt::Display for VideosUpdateParams {
+    /// 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,
@@ -11989,58 +13806,177 @@
     }
 }
 
-/// 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>,
+/// 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 resources belonging to this channelId.
+    #[serde(rename = "channelId")]
+    pub channel_id: Option<String>,
+    /// Add a filter on the channel search.
+    #[serde(rename = "channelType")]
+    pub channel_type: Option<SearchListChannelType>,
+    /// Filter on the livestream status of the videos.
+    #[serde(rename = "eventType")]
+    pub event_type: Option<SearchListEventType>,
+    /// Search owned by a content owner.
+    #[serde(rename = "forContentOwner")]
+    pub for_content_owner: Option<bool>,
+    /// Restrict the search to only retrieve videos uploaded using the project id of the authenticated user.
+    #[serde(rename = "forDeveloper")]
+    pub for_developer: Option<bool>,
+    /// Search for the private videos of the authenticated user.
+    #[serde(rename = "forMine")]
+    pub for_mine: Option<bool>,
+    /// Filter on location of the video
+    #[serde(rename = "location")]
+    pub location: Option<String>,
+    /// Filter on distance from the location (specified above).
+    #[serde(rename = "locationRadius")]
+    pub location_radius: 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>,
-    /// Stands for "host language". Specifies the localization language of the metadata to be filled into snippet.localized. The field is filled with the default metadata if there is no localization in the specified language. The parameter value must be a language code included in the list returned by the i18nLanguages.list method (e.g. en_US, es_MX).
-    #[serde(rename = "hl")]
-    pub hl: Option<String>,
-    /// The *maxResults* parameter specifies the maximum number of items that should be returned in the result set. *Note:* This parameter is supported for use in conjunction with the myRating and chart parameters, but it is not supported for use in conjunction with the id parameter.
-    #[serde(rename = "maxResults")]
-    pub max_results: Option<u32>,
-    /// The *pageToken* parameter identifies a specific page in the result set that should be returned. In an API response, the nextPageToken and prevPageToken properties identify other pages that could be retrieved. *Note:* This parameter is supported for use in conjunction with the myRating and chart parameters, but it is not supported for use in conjunction with the id parameter.
+    /// Sort order of the results.
+    #[serde(rename = "order")]
+    pub order: Option<SearchListOrder>,
+    /// 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>,
-    /// Use a chart that is specific to the specified region
+    /// The *part* parameter specifies a comma-separated list of one or more search resource properties that the API response will include. Set the parameter value to snippet.
+    #[serde(rename = "part")]
+    pub part: String,
+    /// Filter on resources published after this date.
+    #[serde(rename = "publishedAfter")]
+    pub published_after: Option<String>,
+    /// Filter on resources published before this date.
+    #[serde(rename = "publishedBefore")]
+    pub published_before: Option<String>,
+    /// Textual search terms to match.
+    #[serde(rename = "q")]
+    pub q: Option<String>,
+    /// Display the content as seen by viewers in this country.
     #[serde(rename = "regionCode")]
     pub region_code: Option<String>,
-    /// Return videos with the given ids.
-    #[serde(rename = "id")]
-    pub id: Option<String>,
-    /// Return the player with maximum height specified in
-    #[serde(rename = "maxWidth")]
-    pub max_width: Option<i32>,
-    #[serde(rename = "locale")]
-    pub locale: Option<String>,
-    /// Return videos liked/disliked by the authenticated user. Does not support RateType.RATED_TYPE_NONE.
-    #[serde(rename = "myRating")]
-    pub my_rating: Option<VideosListMyRating>,
-    #[serde(rename = "maxHeight")]
-    pub max_height: Option<i32>,
-    /// Use chart that is specific to the specified video category
+    /// Search related to a resource.
+    #[serde(rename = "relatedToVideoId")]
+    pub related_to_video_id: Option<String>,
+    /// Return results relevant to this language.
+    #[serde(rename = "relevanceLanguage")]
+    pub relevance_language: Option<String>,
+    /// Indicates whether the search results should include restricted content as well as standard content.
+    #[serde(rename = "safeSearch")]
+    pub safe_search: Option<SearchListSafeSearch>,
+    /// Restrict results to a particular topic.
+    #[serde(rename = "topicId")]
+    pub topic_id: Option<String>,
+    /// Restrict results to a particular set of resource types from One Platform.
+    #[serde(rename = "type")]
+    pub type_: Option<String>,
+    /// Filter on the presence of captions on the videos.
+    #[serde(rename = "videoCaption")]
+    pub video_caption: Option<SearchListVideoCaption>,
+    /// Filter on videos in a specific category.
     #[serde(rename = "videoCategoryId")]
     pub video_category_id: Option<String>,
-    /// Return the videos that are in the specified chart.
-    #[serde(rename = "chart")]
-    pub chart: Option<VideosListChart>,
-    /// The *part* parameter specifies a comma-separated list of one or more video resource properties that the API response will include. If the parameter identifies a property that contains child properties, the child properties will be included in the response. For example, in a video resource, the snippet property contains the channelId, title, description, tags, and categoryId properties. As such, if you set *part=snippet*, the API response will contain all of those properties.
-    #[serde(rename = "part")]
-    pub part: String,
-}
-
-impl std::fmt::Display for VideosListParams {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        write!(
-            f,
-            "&part={}",
-            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
-        )?;
+    /// Filter on the definition of the videos.
+    #[serde(rename = "videoDefinition")]
+    pub video_definition: Option<SearchListVideoDefinition>,
+    /// Filter on 3d videos.
+    #[serde(rename = "videoDimension")]
+    pub video_dimension: Option<SearchListVideoDimension>,
+    /// Filter on the duration of the videos.
+    #[serde(rename = "videoDuration")]
+    pub video_duration: Option<SearchListVideoDuration>,
+    /// Filter on embeddable videos.
+    #[serde(rename = "videoEmbeddable")]
+    pub video_embeddable: Option<SearchListVideoEmbeddable>,
+    /// Filter on the license of the videos.
+    #[serde(rename = "videoLicense")]
+    pub video_license: Option<SearchListVideoLicense>,
+    /// Filter on syndicated videos.
+    #[serde(rename = "videoSyndicated")]
+    pub video_syndicated: Option<SearchListVideoSyndicated>,
+    /// Filter on videos of a specific type.
+    #[serde(rename = "videoType")]
+    pub video_type: Option<SearchListVideoType>,
+}
+
+impl std::fmt::Display for SearchListParams {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        write!(
+            f,
+            "&part={}",
+            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
+        )?;
+        if let Some(ref v) = self.channel_id {
+            write!(
+                f,
+                "&channelId={}",
+                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.event_type {
+            write!(
+                f,
+                "&eventType={}",
+                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.for_developer {
+            write!(
+                f,
+                "&forDeveloper={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.for_mine {
+            write!(
+                f,
+                "&forMine={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.location {
+            write!(
+                f,
+                "&location={}",
+                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.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,
@@ -12048,6 +13984,351 @@
                 percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
             )?;
         }
+        if let Some(ref v) = self.order {
+            write!(
+                f,
+                "&order={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.page_token {
+            write!(
+                f,
+                "&pageToken={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.published_after {
+            write!(
+                f,
+                "&publishedAfter={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.published_before {
+            write!(
+                f,
+                "&publishedBefore={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.q {
+            write!(
+                f,
+                "&q={}",
+                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.related_to_video_id {
+            write!(
+                f,
+                "&relatedToVideoId={}",
+                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.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.type_ {
+            write!(
+                f,
+                "&type={}",
+                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.video_category_id {
+            write!(
+                f,
+                "&videoCategoryId={}",
+                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.video_dimension {
+            write!(
+                f,
+                "&videoDimension={}",
+                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_embeddable {
+            write!(
+                f,
+                "&videoEmbeddable={}",
+                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.video_syndicated {
+            write!(
+                f,
+                "&videoSyndicated={}",
+                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()
+            )?;
+        }
+        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.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.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 of the given channel owner.
+    #[serde(rename = "channelId")]
+    pub channel_id: Option<String>,
+    /// Return the subscriptions to the subset of these channels that the authenticated user is subscribed to.
+    #[serde(rename = "forChannelId")]
+    pub for_channel_id: Option<String>,
+    /// Return the subscriptions with the given IDs for Stubby or Apiary.
+    #[serde(rename = "id")]
+    pub id: Option<String>,
+    /// The *maxResults* parameter specifies the maximum number of items that should be returned in the result set.
+    #[serde(rename = "maxResults")]
+    pub max_results: Option<u32>,
+    /// Flag for returning the subscriptions of the authenticated user.
+    #[serde(rename = "mine")]
+    pub mine: Option<bool>,
+    #[serde(rename = "myRecentSubscribers")]
+    pub my_recent_subscribers: Option<bool>,
+    /// Return the subscribers of the given channel owner.
+    #[serde(rename = "mySubscribers")]
+    pub my_subscribers: Option<bool>,
+    /// *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwner* parameter indicates that the request's authorization credentials identify a YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and get access to all their video and channel data, without having to provide authentication credentials for each individual channel. The CMS account that the user authenticates with must be linked to the specified YouTube content owner.
+    #[serde(rename = "onBehalfOfContentOwner")]
+    pub on_behalf_of_content_owner: Option<String>,
+    /// This parameter can only be used in a properly authorized request. *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwnerChannel* parameter specifies the YouTube channel ID of the channel to which a video is being added. This parameter is required when a request specifies a value for the onBehalfOfContentOwner parameter, and it can only be used in conjunction with that parameter. In addition, the request must be authorized using a CMS account that is linked to the content owner that the onBehalfOfContentOwner parameter specifies. Finally, the channel that the onBehalfOfContentOwnerChannel parameter value specifies must be linked to the content owner that the onBehalfOfContentOwner parameter specifies. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and perform actions on behalf of the channel specified in the parameter value, without having to provide authentication credentials for each separate channel.
+    #[serde(rename = "onBehalfOfContentOwnerChannel")]
+    pub on_behalf_of_content_owner_channel: Option<String>,
+    /// The order of the returned subscriptions
+    #[serde(rename = "order")]
+    pub order: Option<SubscriptionsListOrder>,
+    /// 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 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,
+}
+
+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.channel_id {
+            write!(
+                f,
+                "&channelId={}",
+                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.id {
+            write!(
+                f,
+                "&id={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.max_results {
+            write!(
+                f,
+                "&maxResults={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.mine {
+            write!(
+                f,
+                "&mine={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.my_recent_subscribers {
+            write!(
+                f,
+                "&myRecentSubscribers={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.my_subscribers {
+            write!(
+                f,
+                "&mySubscribers={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.on_behalf_of_content_owner {
+            write!(
+                f,
+                "&onBehalfOfContentOwner={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.on_behalf_of_content_owner_channel {
+            write!(
+                f,
+                "&onBehalfOfContentOwnerChannel={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.order {
+            write!(
+                f,
+                "&order={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.page_token {
+            write!(
+                f,
+                "&pageToken={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        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.
+    #[serde(rename = "hl")]
+    pub hl: Option<String>,
+    /// The *maxResults* parameter specifies the maximum number of items that should be returned in the result set.
+    #[serde(rename = "maxResults")]
+    pub max_results: Option<u32>,
+    /// 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 superChatEvent 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 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.hl {
             write!(
                 f,
@@ -12069,959 +14350,6 @@
                 percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
             )?;
         }
-        if let Some(ref v) = self.region_code {
-            write!(
-                f,
-                "&regionCode={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.id {
-            write!(
-                f,
-                "&id={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.max_width {
-            write!(
-                f,
-                "&maxWidth={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.locale {
-            write!(
-                f,
-                "&locale={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.my_rating {
-            write!(
-                f,
-                "&myRating={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.max_height {
-            write!(
-                f,
-                "&maxHeight={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.video_category_id {
-            write!(
-                f,
-                "&videoCategoryId={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.chart {
-            write!(
-                f,
-                "&chart={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        Ok(())
-    }
-}
-
-/// Parameters for the `videos.delete` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct VideosDeleteParams {
-    /// General attributes applying to any API call
-    #[serde(flatten)]
-    pub youtube_params: Option<YoutubeParams>,
-    #[serde(rename = "id")]
-    pub id: String,
-    /// *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwner* parameter indicates that the request's authorization credentials identify a YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and get access to all their video and channel data, without having to provide authentication credentials for each individual channel. The actual CMS account that the user authenticates with must be linked to the specified YouTube content owner.
-    #[serde(rename = "onBehalfOfContentOwner")]
-    pub on_behalf_of_content_owner: Option<String>,
-}
-
-impl std::fmt::Display for VideosDeleteParams {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        write!(
-            f,
-            "&id={}",
-            percent_encode(format!("{}", self.id).as_bytes(), NON_ALPHANUMERIC).to_string()
-        )?;
-        if let Some(ref v) = self.on_behalf_of_content_owner {
-            write!(
-                f,
-                "&onBehalfOfContentOwner={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        Ok(())
-    }
-}
-
-/// Parameters for the `videos.insert` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct VideosInsertParams {
-    /// General attributes applying to any API call
-    #[serde(flatten)]
-    pub youtube_params: Option<YoutubeParams>,
-    /// The *part* parameter serves two purposes in this operation. It identifies the properties that the write operation will set as well as the properties that the API response will include. Note that not all parts contain properties that can be set when inserting or updating a video. For example, the statistics object encapsulates statistics that YouTube calculates for a video and does not contain values that you can set or modify. If the parameter value specifies a part that does not contain mutable values, that part will still be included in the API response.
-    #[serde(rename = "part")]
-    pub part: String,
-    /// This parameter can only be used in a properly authorized request. *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwnerChannel* parameter specifies the YouTube channel ID of the channel to which a video is being added. This parameter is required when a request specifies a value for the onBehalfOfContentOwner parameter, and it can only be used in conjunction with that parameter. In addition, the request must be authorized using a CMS account that is linked to the content owner that the onBehalfOfContentOwner parameter specifies. Finally, the channel that the onBehalfOfContentOwnerChannel parameter value specifies must be linked to the content owner that the onBehalfOfContentOwner parameter specifies. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and perform actions on behalf of the channel specified in the parameter value, without having to provide authentication credentials for each separate channel.
-    #[serde(rename = "onBehalfOfContentOwnerChannel")]
-    pub on_behalf_of_content_owner_channel: Option<String>,
-    /// Should stabilize be applied to the upload.
-    #[serde(rename = "stabilize")]
-    pub stabilize: Option<bool>,
-    /// *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwner* parameter indicates that the request's authorization credentials identify a YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and get access to all their video and channel data, without having to provide authentication credentials for each individual channel. The CMS account that the user authenticates with must be linked to the specified YouTube content owner.
-    #[serde(rename = "onBehalfOfContentOwner")]
-    pub on_behalf_of_content_owner: Option<String>,
-    /// Should auto-levels be applied to the upload.
-    #[serde(rename = "autoLevels")]
-    pub auto_levels: Option<bool>,
-    /// Notify the channel subscribers about the new video. As default, the notification is enabled.
-    #[serde(rename = "notifySubscribers")]
-    pub notify_subscribers: Option<bool>,
-}
-
-impl std::fmt::Display for VideosInsertParams {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        write!(
-            f,
-            "&part={}",
-            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
-        )?;
-        if let Some(ref v) = self.on_behalf_of_content_owner_channel {
-            write!(
-                f,
-                "&onBehalfOfContentOwnerChannel={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.stabilize {
-            write!(
-                f,
-                "&stabilize={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.on_behalf_of_content_owner {
-            write!(
-                f,
-                "&onBehalfOfContentOwner={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.auto_levels {
-            write!(
-                f,
-                "&autoLevels={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.notify_subscribers {
-            write!(
-                f,
-                "&notifySubscribers={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        Ok(())
-    }
-}
-
-/// Parameters for the `videos.getRating` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct VideosGetRatingParams {
-    /// General attributes applying to any API call
-    #[serde(flatten)]
-    pub youtube_params: Option<YoutubeParams>,
-    #[serde(rename = "id")]
-    pub id: String,
-    /// *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwner* parameter indicates that the request's authorization credentials identify a YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and get access to all their video and channel data, without having to provide authentication credentials for each individual channel. The CMS account that the user authenticates with must be linked to the specified YouTube content owner.
-    #[serde(rename = "onBehalfOfContentOwner")]
-    pub on_behalf_of_content_owner: Option<String>,
-}
-
-impl std::fmt::Display for VideosGetRatingParams {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        write!(
-            f,
-            "&id={}",
-            percent_encode(format!("{}", self.id).as_bytes(), NON_ALPHANUMERIC).to_string()
-        )?;
-        if let Some(ref v) = self.on_behalf_of_content_owner {
-            write!(
-                f,
-                "&onBehalfOfContentOwner={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        Ok(())
-    }
-}
-
-/// Parameters for the `videos.rate` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct VideosRateParams {
-    /// General attributes applying to any API call
-    #[serde(flatten)]
-    pub youtube_params: Option<YoutubeParams>,
-    #[serde(rename = "rating")]
-    pub rating: VideosRateRating,
-    #[serde(rename = "id")]
-    pub id: String,
-}
-
-impl std::fmt::Display for VideosRateParams {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        write!(
-            f,
-            "&rating={}",
-            percent_encode(format!("{}", self.rating).as_bytes(), NON_ALPHANUMERIC).to_string()
-        )?;
-        write!(
-            f,
-            "&id={}",
-            percent_encode(format!("{}", self.id).as_bytes(), NON_ALPHANUMERIC).to_string()
-        )?;
-        Ok(())
-    }
-}
-
-/// Parameters for the `channelSections.delete` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct ChannelSectionsDeleteParams {
-    /// General attributes applying to any API call
-    #[serde(flatten)]
-    pub youtube_params: Option<YoutubeParams>,
-    /// *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwner* parameter indicates that the request's authorization credentials identify a YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and get access to all their video and channel data, without having to provide authentication credentials for each individual channel. The CMS account that the user authenticates with must be linked to the specified YouTube content owner.
-    #[serde(rename = "onBehalfOfContentOwner")]
-    pub on_behalf_of_content_owner: Option<String>,
-    #[serde(rename = "id")]
-    pub id: String,
-}
-
-impl std::fmt::Display for ChannelSectionsDeleteParams {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        write!(
-            f,
-            "&id={}",
-            percent_encode(format!("{}", self.id).as_bytes(), NON_ALPHANUMERIC).to_string()
-        )?;
-        if let Some(ref v) = self.on_behalf_of_content_owner {
-            write!(
-                f,
-                "&onBehalfOfContentOwner={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        Ok(())
-    }
-}
-
-/// Parameters for the `channelSections.update` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct ChannelSectionsUpdateParams {
-    /// General attributes applying to any API call
-    #[serde(flatten)]
-    pub youtube_params: Option<YoutubeParams>,
-    /// The *part* parameter serves two purposes in this operation. It identifies the properties that the write operation will set as well as the properties that the API response will include. The part names that you can include in the parameter value are snippet and contentDetails.
-    #[serde(rename = "part")]
-    pub part: String,
-    /// *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwner* parameter indicates that the request's authorization credentials identify a YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and get access to all their video and channel data, without having to provide authentication credentials for each individual channel. The CMS account that the user authenticates with must be linked to the specified YouTube content owner.
-    #[serde(rename = "onBehalfOfContentOwner")]
-    pub on_behalf_of_content_owner: Option<String>,
-}
-
-impl std::fmt::Display for ChannelSectionsUpdateParams {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        write!(
-            f,
-            "&part={}",
-            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
-        )?;
-        if let Some(ref v) = self.on_behalf_of_content_owner {
-            write!(
-                f,
-                "&onBehalfOfContentOwner={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        Ok(())
-    }
-}
-
-/// Parameters for the `channelSections.list` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct ChannelSectionsListParams {
-    /// General attributes applying to any API call
-    #[serde(flatten)]
-    pub youtube_params: Option<YoutubeParams>,
-    /// Return the ChannelSections owned by the authenticated user.
-    #[serde(rename = "mine")]
-    pub mine: Option<bool>,
-    /// Return content in specified language
-    #[serde(rename = "hl")]
-    pub hl: Option<String>,
-    /// The *part* parameter specifies a comma-separated list of one or more channelSection resource properties that the API response will include. The part names that you can include in the parameter value are id, snippet, and contentDetails. If the parameter identifies a property that contains child properties, the child properties will be included in the response. For example, in a channelSection resource, the snippet property contains other properties, such as a display title for the channelSection. If you set *part=snippet*, the API response will also contain all of those nested properties.
-    #[serde(rename = "part")]
-    pub part: String,
-    /// Return the ChannelSections with the given IDs for Stubby or Apiary.
-    #[serde(rename = "id")]
-    pub id: Option<String>,
-    /// Return the ChannelSections owned by the specified channel ID.
-    #[serde(rename = "channelId")]
-    pub channel_id: Option<String>,
-    /// *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwner* parameter indicates that the request's authorization credentials identify a YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and get access to all their video and channel data, without having to provide authentication credentials for each individual channel. The CMS account that the user authenticates with must be linked to the specified YouTube content owner.
-    #[serde(rename = "onBehalfOfContentOwner")]
-    pub on_behalf_of_content_owner: Option<String>,
-}
-
-impl std::fmt::Display for ChannelSectionsListParams {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        write!(
-            f,
-            "&part={}",
-            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
-        )?;
-        if let Some(ref v) = self.mine {
-            write!(
-                f,
-                "&mine={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.hl {
-            write!(
-                f,
-                "&hl={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.id {
-            write!(
-                f,
-                "&id={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.channel_id {
-            write!(
-                f,
-                "&channelId={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.on_behalf_of_content_owner {
-            write!(
-                f,
-                "&onBehalfOfContentOwner={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        Ok(())
-    }
-}
-
-/// Parameters for the `channelSections.insert` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct ChannelSectionsInsertParams {
-    /// General attributes applying to any API call
-    #[serde(flatten)]
-    pub youtube_params: Option<YoutubeParams>,
-    /// The *part* parameter serves two purposes in this operation. It identifies the properties that the write operation will set as well as the properties that the API response will include. The part names that you can include in the parameter value are snippet and contentDetails.
-    #[serde(rename = "part")]
-    pub part: String,
-    /// This parameter can only be used in a properly authorized request. *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwnerChannel* parameter specifies the YouTube channel ID of the channel to which a video is being added. This parameter is required when a request specifies a value for the onBehalfOfContentOwner parameter, and it can only be used in conjunction with that parameter. In addition, the request must be authorized using a CMS account that is linked to the content owner that the onBehalfOfContentOwner parameter specifies. Finally, the channel that the onBehalfOfContentOwnerChannel parameter value specifies must be linked to the content owner that the onBehalfOfContentOwner parameter specifies. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and perform actions on behalf of the channel specified in the parameter value, without having to provide authentication credentials for each separate channel.
-    #[serde(rename = "onBehalfOfContentOwnerChannel")]
-    pub on_behalf_of_content_owner_channel: Option<String>,
-    /// *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwner* parameter indicates that the request's authorization credentials identify a YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and get access to all their video and channel data, without having to provide authentication credentials for each individual channel. The CMS account that the user authenticates with must be linked to the specified YouTube content owner.
-    #[serde(rename = "onBehalfOfContentOwner")]
-    pub on_behalf_of_content_owner: Option<String>,
-}
-
-impl std::fmt::Display for ChannelSectionsInsertParams {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        write!(
-            f,
-            "&part={}",
-            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
-        )?;
-        if let Some(ref v) = self.on_behalf_of_content_owner_channel {
-            write!(
-                f,
-                "&onBehalfOfContentOwnerChannel={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.on_behalf_of_content_owner {
-            write!(
-                f,
-                "&onBehalfOfContentOwner={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        Ok(())
-    }
-}
-
-/// Parameters for the `liveChatModerators.delete` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct LiveChatModeratorsDeleteParams {
-    /// General attributes applying to any API call
-    #[serde(flatten)]
-    pub youtube_params: Option<YoutubeParams>,
-    #[serde(rename = "id")]
-    pub id: String,
-}
-
-impl std::fmt::Display for LiveChatModeratorsDeleteParams {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        write!(
-            f,
-            "&id={}",
-            percent_encode(format!("{}", self.id).as_bytes(), NON_ALPHANUMERIC).to_string()
-        )?;
-        Ok(())
-    }
-}
-
-/// Parameters for the `liveChatModerators.list` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct LiveChatModeratorsListParams {
-    /// General attributes applying to any API call
-    #[serde(flatten)]
-    pub youtube_params: Option<YoutubeParams>,
-    /// The *maxResults* parameter specifies the maximum number of items that should be returned in the result set.
-    #[serde(rename = "maxResults")]
-    pub max_results: Option<u32>,
-    /// The id of the live chat for which moderators should be returned.
-    #[serde(rename = "liveChatId")]
-    pub live_chat_id: String,
-    /// The *part* parameter specifies the liveChatModerator resource parts that the API response will include. Supported values are id and snippet.
-    #[serde(rename = "part")]
-    pub part: String,
-    /// The *pageToken* parameter identifies a specific page in the result set that should be returned. In an API response, the nextPageToken and prevPageToken properties identify other pages that could be retrieved.
-    #[serde(rename = "pageToken")]
-    pub page_token: Option<String>,
-}
-
-impl std::fmt::Display for LiveChatModeratorsListParams {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        write!(
-            f,
-            "&liveChatId={}",
-            percent_encode(
-                format!("{}", self.live_chat_id).as_bytes(),
-                NON_ALPHANUMERIC
-            )
-            .to_string()
-        )?;
-        write!(
-            f,
-            "&part={}",
-            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
-        )?;
-        if let Some(ref v) = self.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 `liveChatModerators.insert` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct LiveChatModeratorsInsertParams {
-    /// General attributes applying to any API call
-    #[serde(flatten)]
-    pub youtube_params: Option<YoutubeParams>,
-    /// The *part* parameter serves two purposes in this operation. It identifies the properties that the write operation will set as well as the properties that the API response returns. Set the parameter value to snippet.
-    #[serde(rename = "part")]
-    pub part: String,
-}
-
-impl std::fmt::Display for LiveChatModeratorsInsertParams {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        write!(
-            f,
-            "&part={}",
-            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
-        )?;
-        Ok(())
-    }
-}
-
-/// Parameters for the `liveChatMessages.list` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct LiveChatMessagesListParams {
-    /// General attributes applying to any API call
-    #[serde(flatten)]
-    pub youtube_params: Option<YoutubeParams>,
-    /// The *maxResults* parameter specifies the maximum number of items that should be returned in the result set.
-    #[serde(rename = "maxResults")]
-    pub max_results: Option<u32>,
-    /// The *part* parameter specifies the liveChatComment resource parts that the API response will include. Supported values are id and snippet.
-    #[serde(rename = "part")]
-    pub part: String,
-    /// The id of the live chat for which comments should be returned.
-    #[serde(rename = "liveChatId")]
-    pub live_chat_id: String,
-    /// Specifies the localization language in which the system messages should be returned.
-    #[serde(rename = "hl")]
-    pub hl: Option<String>,
-    /// Specifies the size of the profile image that should be returned for each user.
-    #[serde(rename = "profileImageSize")]
-    pub profile_image_size: Option<u32>,
-    /// The *pageToken* parameter identifies a specific page in the result set that should be returned. In an API response, the nextPageToken property identify other pages that could be retrieved.
-    #[serde(rename = "pageToken")]
-    pub page_token: Option<String>,
-}
-
-impl std::fmt::Display for 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.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.page_token {
-            write!(
-                f,
-                "&pageToken={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        Ok(())
-    }
-}
-
-/// Parameters for the `liveChatMessages.delete` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct LiveChatMessagesDeleteParams {
-    /// General attributes applying to any API call
-    #[serde(flatten)]
-    pub youtube_params: Option<YoutubeParams>,
-    #[serde(rename = "id")]
-    pub id: String,
-}
-
-impl std::fmt::Display for LiveChatMessagesDeleteParams {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        write!(
-            f,
-            "&id={}",
-            percent_encode(format!("{}", self.id).as_bytes(), NON_ALPHANUMERIC).to_string()
-        )?;
-        Ok(())
-    }
-}
-
-/// Parameters for the `liveChatMessages.insert` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct LiveChatMessagesInsertParams {
-    /// General attributes applying to any API call
-    #[serde(flatten)]
-    pub youtube_params: Option<YoutubeParams>,
-    /// The *part* parameter serves two purposes. It identifies the properties that the write operation will set as well as the properties that the API response will include. Set the parameter value to snippet.
-    #[serde(rename = "part")]
-    pub part: String,
-}
-
-impl std::fmt::Display for LiveChatMessagesInsertParams {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        write!(
-            f,
-            "&part={}",
-            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
-        )?;
-        Ok(())
-    }
-}
-
-/// Parameters for the `abuseReports.insert` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct AbuseReportsInsertParams {
-    /// General attributes applying to any API call
-    #[serde(flatten)]
-    pub youtube_params: Option<YoutubeParams>,
-    /// The *part* parameter serves two purposes in this operation. It identifies the properties that the write operation will set as well as the properties that the API response will include.
-    #[serde(rename = "part")]
-    pub part: String,
-}
-
-impl std::fmt::Display for AbuseReportsInsertParams {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        write!(
-            f,
-            "&part={}",
-            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
-        )?;
-        Ok(())
-    }
-}
-
-/// Parameters for the `search.list` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct SearchListParams {
-    /// General attributes applying to any API call
-    #[serde(flatten)]
-    pub youtube_params: Option<YoutubeParams>,
-    /// Filter on syndicated videos.
-    #[serde(rename = "videoSyndicated")]
-    pub video_syndicated: Option<SearchListVideoSyndicated>,
-    /// Add a filter on the channel search.
-    #[serde(rename = "channelType")]
-    pub channel_type: Option<SearchListChannelType>,
-    /// The *maxResults* parameter specifies the maximum number of items that should be returned in the result set.
-    #[serde(rename = "maxResults")]
-    pub max_results: Option<u32>,
-    /// Filter on 3d videos.
-    #[serde(rename = "videoDimension")]
-    pub video_dimension: Option<SearchListVideoDimension>,
-    /// Restrict results to a particular topic.
-    #[serde(rename = "topicId")]
-    pub topic_id: Option<String>,
-    /// Filter on the duration of the videos.
-    #[serde(rename = "videoDuration")]
-    pub video_duration: Option<SearchListVideoDuration>,
-    /// Search for the private videos of the authenticated user.
-    #[serde(rename = "forMine")]
-    pub for_mine: Option<bool>,
-    /// Sort order of the results.
-    #[serde(rename = "order")]
-    pub order: Option<SearchListOrder>,
-    /// Filter on the license of the videos.
-    #[serde(rename = "videoLicense")]
-    pub video_license: Option<SearchListVideoLicense>,
-    /// Return results relevant to this language.
-    #[serde(rename = "relevanceLanguage")]
-    pub relevance_language: Option<String>,
-    /// Display the content as seen by viewers in this country.
-    #[serde(rename = "regionCode")]
-    pub region_code: Option<String>,
-    /// Search owned by a content owner.
-    #[serde(rename = "forContentOwner")]
-    pub for_content_owner: Option<bool>,
-    /// The *part* parameter specifies a comma-separated list of one or more search resource properties that the API response will include. Set the parameter value to snippet.
-    #[serde(rename = "part")]
-    pub part: String,
-    /// Filter on videos in a specific category.
-    #[serde(rename = "videoCategoryId")]
-    pub video_category_id: Option<String>,
-    /// Restrict results to a particular set of resource types from One Platform.
-    #[serde(rename = "type")]
-    pub type_: Option<String>,
-    /// Search related to a resource.
-    #[serde(rename = "relatedToVideoId")]
-    pub related_to_video_id: Option<String>,
-    /// Filter on distance from the location (specified above).
-    #[serde(rename = "locationRadius")]
-    pub location_radius: Option<String>,
-    /// Indicates whether the search results should include restricted content as well as standard content.
-    #[serde(rename = "safeSearch")]
-    pub safe_search: Option<SearchListSafeSearch>,
-    /// Filter on resources belonging to this channelId.
-    #[serde(rename = "channelId")]
-    pub channel_id: Option<String>,
-    /// Filter on resources published before this date.
-    #[serde(rename = "publishedBefore")]
-    pub published_before: Option<String>,
-    /// Filter on videos of a specific type.
-    #[serde(rename = "videoType")]
-    pub video_type: Option<SearchListVideoType>,
-    /// *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwner* parameter indicates that the request's authorization credentials identify a YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and get access to all their video and channel data, without having to provide authentication credentials for each individual channel. The CMS account that the user authenticates with must be linked to the specified YouTube content owner.
-    #[serde(rename = "onBehalfOfContentOwner")]
-    pub on_behalf_of_content_owner: Option<String>,
-    /// Restrict the search to only retrieve videos uploaded using the project id of the authenticated user.
-    #[serde(rename = "forDeveloper")]
-    pub for_developer: Option<bool>,
-    /// Filter on embeddable videos.
-    #[serde(rename = "videoEmbeddable")]
-    pub video_embeddable: Option<SearchListVideoEmbeddable>,
-    /// Filter on the definition of the videos.
-    #[serde(rename = "videoDefinition")]
-    pub video_definition: Option<SearchListVideoDefinition>,
-    /// The *pageToken* parameter identifies a specific page in the result set that should be returned. In an API response, the nextPageToken and prevPageToken properties identify other pages that could be retrieved.
-    #[serde(rename = "pageToken")]
-    pub page_token: Option<String>,
-    /// Filter on location of the video
-    #[serde(rename = "location")]
-    pub location: Option<String>,
-    /// Filter on the presence of captions on the videos.
-    #[serde(rename = "videoCaption")]
-    pub video_caption: Option<SearchListVideoCaption>,
-    /// Textual search terms to match.
-    #[serde(rename = "q")]
-    pub q: Option<String>,
-    /// Filter on the livestream status of the videos.
-    #[serde(rename = "eventType")]
-    pub event_type: Option<SearchListEventType>,
-    /// Filter on resources published after this date.
-    #[serde(rename = "publishedAfter")]
-    pub published_after: Option<String>,
-}
-
-impl std::fmt::Display for SearchListParams {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        write!(
-            f,
-            "&part={}",
-            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
-        )?;
-        if let Some(ref v) = self.video_syndicated {
-            write!(
-                f,
-                "&videoSyndicated={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.channel_type {
-            write!(
-                f,
-                "&channelType={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.max_results {
-            write!(
-                f,
-                "&maxResults={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.video_dimension {
-            write!(
-                f,
-                "&videoDimension={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.topic_id {
-            write!(
-                f,
-                "&topicId={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.video_duration {
-            write!(
-                f,
-                "&videoDuration={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.for_mine {
-            write!(
-                f,
-                "&forMine={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.order {
-            write!(
-                f,
-                "&order={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.video_license {
-            write!(
-                f,
-                "&videoLicense={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.relevance_language {
-            write!(
-                f,
-                "&relevanceLanguage={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.region_code {
-            write!(
-                f,
-                "&regionCode={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.for_content_owner {
-            write!(
-                f,
-                "&forContentOwner={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.video_category_id {
-            write!(
-                f,
-                "&videoCategoryId={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.type_ {
-            write!(
-                f,
-                "&type={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.related_to_video_id {
-            write!(
-                f,
-                "&relatedToVideoId={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.location_radius {
-            write!(
-                f,
-                "&locationRadius={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.safe_search {
-            write!(
-                f,
-                "&safeSearch={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.channel_id {
-            write!(
-                f,
-                "&channelId={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.published_before {
-            write!(
-                f,
-                "&publishedBefore={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.video_type {
-            write!(
-                f,
-                "&videoType={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.on_behalf_of_content_owner {
-            write!(
-                f,
-                "&onBehalfOfContentOwner={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.for_developer {
-            write!(
-                f,
-                "&forDeveloper={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.video_embeddable {
-            write!(
-                f,
-                "&videoEmbeddable={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.video_definition {
-            write!(
-                f,
-                "&videoDefinition={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.page_token {
-            write!(
-                f,
-                "&pageToken={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.location {
-            write!(
-                f,
-                "&location={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.video_caption {
-            write!(
-                f,
-                "&videoCaption={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.q {
-            write!(
-                f,
-                "&q={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.event_type {
-            write!(
-                f,
-                "&eventType={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.published_after {
-            write!(
-                f,
-                "&publishedAfter={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
         Ok(())
     }
 }
@@ -13056,12 +14384,12 @@
     /// 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>,
     /// Type of the link to be deleted.
     #[serde(rename = "type")]
     pub type_: ThirdPartyLinksDeleteType,
-    /// Do not use. Required for compatibility.
-    #[serde(rename = "part")]
-    pub part: Option<String>,
 }
 
 impl std::fmt::Display for ThirdPartyLinksDeleteParams {
@@ -13177,1370 +14505,6 @@
     }
 }
 
-/// Parameters for the `liveStreams.list` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct LiveStreamsListParams {
-    /// General attributes applying to any API call
-    #[serde(flatten)]
-    pub youtube_params: Option<YoutubeParams>,
-    /// The *maxResults* parameter specifies the maximum number of items that should be returned in the result set.
-    #[serde(rename = "maxResults")]
-    pub max_results: Option<u32>,
-    /// Return LiveStreams with the given ids from Stubby or Apiary.
-    #[serde(rename = "id")]
-    pub id: Option<String>,
-    #[serde(rename = "mine")]
-    pub mine: Option<bool>,
-    /// The *pageToken* parameter identifies a specific page in the result set that should be returned. In an API response, the nextPageToken and prevPageToken properties identify other pages that could be retrieved.
-    #[serde(rename = "pageToken")]
-    pub page_token: Option<String>,
-    /// The *part* parameter specifies a comma-separated list of one or more liveStream resource properties that the API response will include. The part names that you can include in the parameter value are id, snippet, cdn, and status.
-    #[serde(rename = "part")]
-    pub part: String,
-    /// This parameter can only be used in a properly authorized request. *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwnerChannel* parameter specifies the YouTube channel ID of the channel to which a video is being added. This parameter is required when a request specifies a value for the onBehalfOfContentOwner parameter, and it can only be used in conjunction with that parameter. In addition, the request must be authorized using a CMS account that is linked to the content owner that the onBehalfOfContentOwner parameter specifies. Finally, the channel that the onBehalfOfContentOwnerChannel parameter value specifies must be linked to the content owner that the onBehalfOfContentOwner parameter specifies. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and perform actions on behalf of the channel specified in the parameter value, without having to provide authentication credentials for each separate channel.
-    #[serde(rename = "onBehalfOfContentOwnerChannel")]
-    pub on_behalf_of_content_owner_channel: Option<String>,
-    /// *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwner* parameter indicates that the request's authorization credentials identify a YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and get access to all their video and channel data, without having to provide authentication credentials for each individual channel. The CMS account that the user authenticates with must be linked to the specified YouTube content owner.
-    #[serde(rename = "onBehalfOfContentOwner")]
-    pub on_behalf_of_content_owner: Option<String>,
-}
-
-impl std::fmt::Display for LiveStreamsListParams {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        write!(
-            f,
-            "&part={}",
-            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
-        )?;
-        if let Some(ref v) = self.max_results {
-            write!(
-                f,
-                "&maxResults={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.id {
-            write!(
-                f,
-                "&id={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.mine {
-            write!(
-                f,
-                "&mine={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.page_token {
-            write!(
-                f,
-                "&pageToken={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.on_behalf_of_content_owner_channel {
-            write!(
-                f,
-                "&onBehalfOfContentOwnerChannel={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.on_behalf_of_content_owner {
-            write!(
-                f,
-                "&onBehalfOfContentOwner={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        Ok(())
-    }
-}
-
-/// Parameters for the `liveStreams.update` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct LiveStreamsUpdateParams {
-    /// General attributes applying to any API call
-    #[serde(flatten)]
-    pub youtube_params: Option<YoutubeParams>,
-    /// *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwner* parameter indicates that the request's authorization credentials identify a YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and get access to all their video and channel data, without having to provide authentication credentials for each individual channel. The CMS account that the user authenticates with must be linked to the specified YouTube content owner.
-    #[serde(rename = "onBehalfOfContentOwner")]
-    pub on_behalf_of_content_owner: Option<String>,
-    /// The *part* parameter serves two purposes in this operation. It identifies the properties that the write operation will set as well as the properties that the API response will include. The part properties that you can include in the parameter value are id, snippet, cdn, and status. Note that this method will override the existing values for all of the mutable properties that are contained in any parts that the parameter value specifies. If the request body does not specify a value for a mutable property, the existing value for that property will be removed.
-    #[serde(rename = "part")]
-    pub part: String,
-    /// This parameter can only be used in a properly authorized request. *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwnerChannel* parameter specifies the YouTube channel ID of the channel to which a video is being added. This parameter is required when a request specifies a value for the onBehalfOfContentOwner parameter, and it can only be used in conjunction with that parameter. In addition, the request must be authorized using a CMS account that is linked to the content owner that the onBehalfOfContentOwner parameter specifies. Finally, the channel that the onBehalfOfContentOwnerChannel parameter value specifies must be linked to the content owner that the onBehalfOfContentOwner parameter specifies. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and perform actions on behalf of the channel specified in the parameter value, without having to provide authentication credentials for each separate channel.
-    #[serde(rename = "onBehalfOfContentOwnerChannel")]
-    pub on_behalf_of_content_owner_channel: Option<String>,
-}
-
-impl std::fmt::Display for LiveStreamsUpdateParams {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        write!(
-            f,
-            "&part={}",
-            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
-        )?;
-        if let Some(ref v) = self.on_behalf_of_content_owner {
-            write!(
-                f,
-                "&onBehalfOfContentOwner={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.on_behalf_of_content_owner_channel {
-            write!(
-                f,
-                "&onBehalfOfContentOwnerChannel={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        Ok(())
-    }
-}
-
-/// Parameters for the `liveStreams.delete` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct LiveStreamsDeleteParams {
-    /// General attributes applying to any API call
-    #[serde(flatten)]
-    pub youtube_params: Option<YoutubeParams>,
-    #[serde(rename = "id")]
-    pub id: String,
-    /// *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwner* parameter indicates that the request's authorization credentials identify a YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and get access to all their video and channel data, without having to provide authentication credentials for each individual channel. The CMS account that the user authenticates with must be linked to the specified YouTube content owner.
-    #[serde(rename = "onBehalfOfContentOwner")]
-    pub on_behalf_of_content_owner: Option<String>,
-    /// This parameter can only be used in a properly authorized request. *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwnerChannel* parameter specifies the YouTube channel ID of the channel to which a video is being added. This parameter is required when a request specifies a value for the onBehalfOfContentOwner parameter, and it can only be used in conjunction with that parameter. In addition, the request must be authorized using a CMS account that is linked to the content owner that the onBehalfOfContentOwner parameter specifies. Finally, the channel that the onBehalfOfContentOwnerChannel parameter value specifies must be linked to the content owner that the onBehalfOfContentOwner parameter specifies. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and perform actions on behalf of the channel specified in the parameter value, without having to provide authentication credentials for each separate channel.
-    #[serde(rename = "onBehalfOfContentOwnerChannel")]
-    pub on_behalf_of_content_owner_channel: Option<String>,
-}
-
-impl std::fmt::Display for LiveStreamsDeleteParams {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        write!(
-            f,
-            "&id={}",
-            percent_encode(format!("{}", self.id).as_bytes(), NON_ALPHANUMERIC).to_string()
-        )?;
-        if let Some(ref v) = self.on_behalf_of_content_owner {
-            write!(
-                f,
-                "&onBehalfOfContentOwner={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.on_behalf_of_content_owner_channel {
-            write!(
-                f,
-                "&onBehalfOfContentOwnerChannel={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        Ok(())
-    }
-}
-
-/// Parameters for the `liveStreams.insert` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct LiveStreamsInsertParams {
-    /// General attributes applying to any API call
-    #[serde(flatten)]
-    pub youtube_params: Option<YoutubeParams>,
-    /// The *part* parameter serves two purposes in this operation. It identifies the properties that the write operation will set as well as the properties that the API response will include. The part properties that you can include in the parameter value are id, snippet, cdn, content_details, and status.
-    #[serde(rename = "part")]
-    pub part: String,
-    /// This parameter can only be used in a properly authorized request. *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwnerChannel* parameter specifies the YouTube channel ID of the channel to which a video is being added. This parameter is required when a request specifies a value for the onBehalfOfContentOwner parameter, and it can only be used in conjunction with that parameter. In addition, the request must be authorized using a CMS account that is linked to the content owner that the onBehalfOfContentOwner parameter specifies. Finally, the channel that the onBehalfOfContentOwnerChannel parameter value specifies must be linked to the content owner that the onBehalfOfContentOwner parameter specifies. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and perform actions on behalf of the channel specified in the parameter value, without having to provide authentication credentials for each separate channel.
-    #[serde(rename = "onBehalfOfContentOwnerChannel")]
-    pub on_behalf_of_content_owner_channel: Option<String>,
-    /// *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwner* parameter indicates that the request's authorization credentials identify a YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and get access to all their video and channel data, without having to provide authentication credentials for each individual channel. The CMS account that the user authenticates with must be linked to the specified YouTube content owner.
-    #[serde(rename = "onBehalfOfContentOwner")]
-    pub on_behalf_of_content_owner: Option<String>,
-}
-
-impl std::fmt::Display for LiveStreamsInsertParams {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        write!(
-            f,
-            "&part={}",
-            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
-        )?;
-        if let Some(ref v) = self.on_behalf_of_content_owner_channel {
-            write!(
-                f,
-                "&onBehalfOfContentOwnerChannel={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.on_behalf_of_content_owner {
-            write!(
-                f,
-                "&onBehalfOfContentOwner={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        Ok(())
-    }
-}
-
-/// Parameters for the `activities.list` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct ActivitiesListParams {
-    /// General attributes applying to any API call
-    #[serde(flatten)]
-    pub youtube_params: Option<YoutubeParams>,
-    #[serde(rename = "home")]
-    pub home: Option<bool>,
-    #[serde(rename = "publishedBefore")]
-    pub published_before: Option<String>,
-    /// The *part* parameter specifies a comma-separated list of one or more activity resource properties that the API response will include. If the parameter identifies a property that contains child properties, the child properties will be included in the response. For example, in an activity resource, the snippet property contains other properties that identify the type of activity, a display title for the activity, and so forth. If you set *part=snippet*, the API response will also contain all of those nested properties.
-    #[serde(rename = "part")]
-    pub part: String,
-    /// The *maxResults* parameter specifies the maximum number of items that should be returned in the result set.
-    #[serde(rename = "maxResults")]
-    pub max_results: Option<u32>,
-    #[serde(rename = "publishedAfter")]
-    pub published_after: Option<String>,
-    #[serde(rename = "channelId")]
-    pub channel_id: Option<String>,
-    #[serde(rename = "regionCode")]
-    pub region_code: Option<String>,
-    #[serde(rename = "mine")]
-    pub mine: Option<bool>,
-    /// The *pageToken* parameter identifies a specific page in the result set that should be returned. In an API response, the nextPageToken and prevPageToken properties identify other pages that could be retrieved.
-    #[serde(rename = "pageToken")]
-    pub page_token: Option<String>,
-}
-
-impl std::fmt::Display for ActivitiesListParams {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        write!(
-            f,
-            "&part={}",
-            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
-        )?;
-        if let Some(ref v) = self.home {
-            write!(
-                f,
-                "&home={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.published_before {
-            write!(
-                f,
-                "&publishedBefore={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.max_results {
-            write!(
-                f,
-                "&maxResults={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.published_after {
-            write!(
-                f,
-                "&publishedAfter={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.channel_id {
-            write!(
-                f,
-                "&channelId={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.region_code {
-            write!(
-                f,
-                "&regionCode={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.mine {
-            write!(
-                f,
-                "&mine={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.page_token {
-            write!(
-                f,
-                "&pageToken={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        Ok(())
-    }
-}
-
-/// Parameters for the `liveBroadcasts.delete` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct LiveBroadcastsDeleteParams {
-    /// General attributes applying to any API call
-    #[serde(flatten)]
-    pub youtube_params: Option<YoutubeParams>,
-    /// This parameter can only be used in a properly authorized request. *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwnerChannel* parameter specifies the YouTube channel ID of the channel to which a video is being added. This parameter is required when a request specifies a value for the onBehalfOfContentOwner parameter, and it can only be used in conjunction with that parameter. In addition, the request must be authorized using a CMS account that is linked to the content owner that the onBehalfOfContentOwner parameter specifies. Finally, the channel that the onBehalfOfContentOwnerChannel parameter value specifies must be linked to the content owner that the onBehalfOfContentOwner parameter specifies. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and perform actions on behalf of the channel specified in the parameter value, without having to provide authentication credentials for each separate channel.
-    #[serde(rename = "onBehalfOfContentOwnerChannel")]
-    pub on_behalf_of_content_owner_channel: Option<String>,
-    /// Broadcast to delete.
-    #[serde(rename = "id")]
-    pub id: String,
-    /// *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwner* parameter indicates that the request's authorization credentials identify a YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and get access to all their video and channel data, without having to provide authentication credentials for each individual channel. The CMS account that the user authenticates with must be linked to the specified YouTube content owner.
-    #[serde(rename = "onBehalfOfContentOwner")]
-    pub on_behalf_of_content_owner: Option<String>,
-}
-
-impl std::fmt::Display for LiveBroadcastsDeleteParams {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        write!(
-            f,
-            "&id={}",
-            percent_encode(format!("{}", self.id).as_bytes(), NON_ALPHANUMERIC).to_string()
-        )?;
-        if let Some(ref v) = self.on_behalf_of_content_owner_channel {
-            write!(
-                f,
-                "&onBehalfOfContentOwnerChannel={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.on_behalf_of_content_owner {
-            write!(
-                f,
-                "&onBehalfOfContentOwner={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        Ok(())
-    }
-}
-
-/// Parameters for the `liveBroadcasts.transition` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct LiveBroadcastsTransitionParams {
-    /// General attributes applying to any API call
-    #[serde(flatten)]
-    pub youtube_params: Option<YoutubeParams>,
-    /// The status to which the broadcast is going to transition.
-    #[serde(rename = "broadcastStatus")]
-    pub broadcast_status: LiveBroadcastsTransitionBroadcastStatus,
-    /// Broadcast to transition.
-    #[serde(rename = "id")]
-    pub id: String,
-    /// *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwner* parameter indicates that the request's authorization credentials identify a YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and get access to all their video and channel data, without having to provide authentication credentials for each individual channel. The CMS account that the user authenticates with must be linked to the specified YouTube content owner.
-    #[serde(rename = "onBehalfOfContentOwner")]
-    pub on_behalf_of_content_owner: Option<String>,
-    /// This parameter can only be used in a properly authorized request. *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwnerChannel* parameter specifies the YouTube channel ID of the channel to which a video is being added. This parameter is required when a request specifies a value for the onBehalfOfContentOwner parameter, and it can only be used in conjunction with that parameter. In addition, the request must be authorized using a CMS account that is linked to the content owner that the onBehalfOfContentOwner parameter specifies. Finally, the channel that the onBehalfOfContentOwnerChannel parameter value specifies must be linked to the content owner that the onBehalfOfContentOwner parameter specifies. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and perform actions on behalf of the channel specified in the parameter value, without having to provide authentication credentials for each separate channel.
-    #[serde(rename = "onBehalfOfContentOwnerChannel")]
-    pub on_behalf_of_content_owner_channel: Option<String>,
-    /// The *part* parameter specifies a comma-separated list of one or more liveBroadcast resource properties that the API response will include. The part names that you can include in the parameter value are id, snippet, contentDetails, and status.
-    #[serde(rename = "part")]
-    pub part: String,
-}
-
-impl std::fmt::Display for LiveBroadcastsTransitionParams {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        write!(
-            f,
-            "&broadcastStatus={}",
-            percent_encode(
-                format!("{}", self.broadcast_status).as_bytes(),
-                NON_ALPHANUMERIC
-            )
-            .to_string()
-        )?;
-        write!(
-            f,
-            "&id={}",
-            percent_encode(format!("{}", self.id).as_bytes(), NON_ALPHANUMERIC).to_string()
-        )?;
-        write!(
-            f,
-            "&part={}",
-            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
-        )?;
-        if let Some(ref v) = self.on_behalf_of_content_owner {
-            write!(
-                f,
-                "&onBehalfOfContentOwner={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.on_behalf_of_content_owner_channel {
-            write!(
-                f,
-                "&onBehalfOfContentOwnerChannel={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        Ok(())
-    }
-}
-
-/// Parameters for the `liveBroadcasts.list` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct LiveBroadcastsListParams {
-    /// General attributes applying to any API call
-    #[serde(flatten)]
-    pub youtube_params: Option<YoutubeParams>,
-    /// The *maxResults* parameter specifies the maximum number of items that should be returned in the result set.
-    #[serde(rename = "maxResults")]
-    pub max_results: Option<u32>,
-    /// Return broadcasts with the given ids from Stubby or Apiary.
-    #[serde(rename = "id")]
-    pub id: Option<String>,
-    /// Return only broadcasts with the selected type.
-    #[serde(rename = "broadcastType")]
-    pub broadcast_type: Option<LiveBroadcastsListBroadcastType>,
-    /// *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwner* parameter indicates that the request's authorization credentials identify a YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and get access to all their video and channel data, without having to provide authentication credentials for each individual channel. The CMS account that the user authenticates with must be linked to the specified YouTube content owner.
-    #[serde(rename = "onBehalfOfContentOwner")]
-    pub on_behalf_of_content_owner: Option<String>,
-    /// This parameter can only be used in a properly authorized request. *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwnerChannel* parameter specifies the YouTube channel ID of the channel to which a video is being added. This parameter is required when a request specifies a value for the onBehalfOfContentOwner parameter, and it can only be used in conjunction with that parameter. In addition, the request must be authorized using a CMS account that is linked to the content owner that the onBehalfOfContentOwner parameter specifies. Finally, the channel that the onBehalfOfContentOwnerChannel parameter value specifies must be linked to the content owner that the onBehalfOfContentOwner parameter specifies. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and perform actions on behalf of the channel specified in the parameter value, without having to provide authentication credentials for each separate channel.
-    #[serde(rename = "onBehalfOfContentOwnerChannel")]
-    pub on_behalf_of_content_owner_channel: Option<String>,
-    /// The *part* parameter specifies a comma-separated list of one or more liveBroadcast resource properties that the API response will include. The part names that you can include in the parameter value are id, snippet, contentDetails, status and statistics.
-    #[serde(rename = "part")]
-    pub part: String,
-    #[serde(rename = "mine")]
-    pub mine: Option<bool>,
-    /// The *pageToken* parameter identifies a specific page in the result set that should be returned. In an API response, the nextPageToken and prevPageToken properties identify other pages that could be retrieved.
-    #[serde(rename = "pageToken")]
-    pub page_token: Option<String>,
-    /// Return broadcasts with a certain status, e.g. active broadcasts.
-    #[serde(rename = "broadcastStatus")]
-    pub broadcast_status: Option<LiveBroadcastsListBroadcastStatus>,
-}
-
-impl std::fmt::Display for LiveBroadcastsListParams {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        write!(
-            f,
-            "&part={}",
-            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
-        )?;
-        if let Some(ref v) = self.max_results {
-            write!(
-                f,
-                "&maxResults={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.id {
-            write!(
-                f,
-                "&id={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.broadcast_type {
-            write!(
-                f,
-                "&broadcastType={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.on_behalf_of_content_owner {
-            write!(
-                f,
-                "&onBehalfOfContentOwner={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.on_behalf_of_content_owner_channel {
-            write!(
-                f,
-                "&onBehalfOfContentOwnerChannel={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.mine {
-            write!(
-                f,
-                "&mine={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        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_status {
-            write!(
-                f,
-                "&broadcastStatus={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        Ok(())
-    }
-}
-
-/// Parameters for the `liveBroadcasts.bind` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct LiveBroadcastsBindParams {
-    /// General attributes applying to any API call
-    #[serde(flatten)]
-    pub youtube_params: Option<YoutubeParams>,
-    /// Broadcast to bind to the stream
-    #[serde(rename = "id")]
-    pub id: String,
-    /// Stream to bind, if not set unbind the current one.
-    #[serde(rename = "streamId")]
-    pub stream_id: Option<String>,
-    /// This parameter can only be used in a properly authorized request. *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwnerChannel* parameter specifies the YouTube channel ID of the channel to which a video is being added. This parameter is required when a request specifies a value for the onBehalfOfContentOwner parameter, and it can only be used in conjunction with that parameter. In addition, the request must be authorized using a CMS account that is linked to the content owner that the onBehalfOfContentOwner parameter specifies. Finally, the channel that the onBehalfOfContentOwnerChannel parameter value specifies must be linked to the content owner that the onBehalfOfContentOwner parameter specifies. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and perform actions on behalf of the channel specified in the parameter value, without having to provide authentication credentials for each separate channel.
-    #[serde(rename = "onBehalfOfContentOwnerChannel")]
-    pub on_behalf_of_content_owner_channel: Option<String>,
-    /// *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwner* parameter indicates that the request's authorization credentials identify a YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and get access to all their video and channel data, without having to provide authentication credentials for each individual channel. The CMS account that the user authenticates with must be linked to the specified YouTube content owner.
-    #[serde(rename = "onBehalfOfContentOwner")]
-    pub on_behalf_of_content_owner: Option<String>,
-    /// The *part* parameter specifies a comma-separated list of one or more liveBroadcast resource properties that the API response will include. The part names that you can include in the parameter value are id, snippet, contentDetails, and status.
-    #[serde(rename = "part")]
-    pub part: String,
-}
-
-impl std::fmt::Display for LiveBroadcastsBindParams {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        write!(
-            f,
-            "&id={}",
-            percent_encode(format!("{}", self.id).as_bytes(), NON_ALPHANUMERIC).to_string()
-        )?;
-        write!(
-            f,
-            "&part={}",
-            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
-        )?;
-        if let Some(ref v) = self.stream_id {
-            write!(
-                f,
-                "&streamId={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.on_behalf_of_content_owner_channel {
-            write!(
-                f,
-                "&onBehalfOfContentOwnerChannel={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.on_behalf_of_content_owner {
-            write!(
-                f,
-                "&onBehalfOfContentOwner={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        Ok(())
-    }
-}
-
-/// Parameters for the `liveBroadcasts.insert` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct LiveBroadcastsInsertParams {
-    /// General attributes applying to any API call
-    #[serde(flatten)]
-    pub youtube_params: Option<YoutubeParams>,
-    /// This parameter can only be used in a properly authorized request. *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwnerChannel* parameter specifies the YouTube channel ID of the channel to which a video is being added. This parameter is required when a request specifies a value for the onBehalfOfContentOwner parameter, and it can only be used in conjunction with that parameter. In addition, the request must be authorized using a CMS account that is linked to the content owner that the onBehalfOfContentOwner parameter specifies. Finally, the channel that the onBehalfOfContentOwnerChannel parameter value specifies must be linked to the content owner that the onBehalfOfContentOwner parameter specifies. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and perform actions on behalf of the channel specified in the parameter value, without having to provide authentication credentials for each separate channel.
-    #[serde(rename = "onBehalfOfContentOwnerChannel")]
-    pub on_behalf_of_content_owner_channel: Option<String>,
-    /// The *part* parameter serves two purposes in this operation. It identifies the properties that the write operation will set as well as the properties that the API response will include. The part properties that you can include in the parameter value are id, snippet, contentDetails, and status.
-    #[serde(rename = "part")]
-    pub part: String,
-    /// *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwner* parameter indicates that the request's authorization credentials identify a YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and get access to all their video and channel data, without having to provide authentication credentials for each individual channel. The CMS account that the user authenticates with must be linked to the specified YouTube content owner.
-    #[serde(rename = "onBehalfOfContentOwner")]
-    pub on_behalf_of_content_owner: Option<String>,
-}
-
-impl std::fmt::Display for LiveBroadcastsInsertParams {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        write!(
-            f,
-            "&part={}",
-            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
-        )?;
-        if let Some(ref v) = self.on_behalf_of_content_owner_channel {
-            write!(
-                f,
-                "&onBehalfOfContentOwnerChannel={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.on_behalf_of_content_owner {
-            write!(
-                f,
-                "&onBehalfOfContentOwner={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        Ok(())
-    }
-}
-
-/// Parameters for the `liveBroadcasts.update` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct LiveBroadcastsUpdateParams {
-    /// General attributes applying to any API call
-    #[serde(flatten)]
-    pub youtube_params: Option<YoutubeParams>,
-    /// *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwner* parameter indicates that the request's authorization credentials identify a YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and get access to all their video and channel data, without having to provide authentication credentials for each individual channel. The CMS account that the user authenticates with must be linked to the specified YouTube content owner.
-    #[serde(rename = "onBehalfOfContentOwner")]
-    pub on_behalf_of_content_owner: Option<String>,
-    /// The *part* parameter serves two purposes in this operation. It identifies the properties that the write operation will set as well as the properties that the API response will include. The part properties that you can include in the parameter value are id, snippet, contentDetails, and status. Note that this method will override the existing values for all of the mutable properties that are contained in any parts that the parameter value specifies. For example, a broadcast's privacy status is defined in the status part. As such, if your request is updating a private or unlisted broadcast, and the request's part parameter value includes the status part, the broadcast's privacy setting will be updated to whatever value the request body specifies. If the request body does not specify a value, the existing privacy setting will be removed and the broadcast will revert to the default privacy setting.
-    #[serde(rename = "part")]
-    pub part: String,
-    /// This parameter can only be used in a properly authorized request. *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwnerChannel* parameter specifies the YouTube channel ID of the channel to which a video is being added. This parameter is required when a request specifies a value for the onBehalfOfContentOwner parameter, and it can only be used in conjunction with that parameter. In addition, the request must be authorized using a CMS account that is linked to the content owner that the onBehalfOfContentOwner parameter specifies. Finally, the channel that the onBehalfOfContentOwnerChannel parameter value specifies must be linked to the content owner that the onBehalfOfContentOwner parameter specifies. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and perform actions on behalf of the channel specified in the parameter value, without having to provide authentication credentials for each separate channel.
-    #[serde(rename = "onBehalfOfContentOwnerChannel")]
-    pub on_behalf_of_content_owner_channel: Option<String>,
-}
-
-impl std::fmt::Display for LiveBroadcastsUpdateParams {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        write!(
-            f,
-            "&part={}",
-            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
-        )?;
-        if let Some(ref v) = self.on_behalf_of_content_owner {
-            write!(
-                f,
-                "&onBehalfOfContentOwner={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.on_behalf_of_content_owner_channel {
-            write!(
-                f,
-                "&onBehalfOfContentOwnerChannel={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        Ok(())
-    }
-}
-
-/// Parameters for the `captions.delete` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct CaptionsDeleteParams {
-    /// General attributes applying to any API call
-    #[serde(flatten)]
-    pub youtube_params: Option<YoutubeParams>,
-    #[serde(rename = "id")]
-    pub id: String,
-    /// *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwner* parameter indicates that the request's authorization credentials identify a YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and get access to all their video and channel data, without having to provide authentication credentials for each individual channel. The actual CMS account that the user authenticates with must be linked to the specified YouTube content owner.
-    #[serde(rename = "onBehalfOfContentOwner")]
-    pub on_behalf_of_content_owner: Option<String>,
-    /// ID of the Google+ Page for the channel that the request is be on behalf of
-    #[serde(rename = "onBehalfOf")]
-    pub on_behalf_of: Option<String>,
-}
-
-impl std::fmt::Display for CaptionsDeleteParams {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        write!(
-            f,
-            "&id={}",
-            percent_encode(format!("{}", self.id).as_bytes(), NON_ALPHANUMERIC).to_string()
-        )?;
-        if let Some(ref v) = self.on_behalf_of_content_owner {
-            write!(
-                f,
-                "&onBehalfOfContentOwner={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.on_behalf_of {
-            write!(
-                f,
-                "&onBehalfOf={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        Ok(())
-    }
-}
-
-/// Parameters for the `captions.update` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct CaptionsUpdateParams {
-    /// General attributes applying to any API call
-    #[serde(flatten)]
-    pub youtube_params: Option<YoutubeParams>,
-    /// Extra parameter to allow automatically syncing the uploaded caption/transcript with the audio.
-    #[serde(rename = "sync")]
-    pub sync: Option<bool>,
-    /// *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwner* parameter indicates that the request's authorization credentials identify a YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and get access to all their video and channel data, without having to provide authentication credentials for each individual channel. The actual CMS account that the user authenticates with must be linked to the specified YouTube content owner.
-    #[serde(rename = "onBehalfOfContentOwner")]
-    pub on_behalf_of_content_owner: Option<String>,
-    /// The *part* parameter specifies a comma-separated list of one or more caption resource parts that the API response will include. The part names that you can include in the parameter value are id and snippet.
-    #[serde(rename = "part")]
-    pub part: String,
-    /// ID of the Google+ Page for the channel that the request is on behalf of.
-    #[serde(rename = "onBehalfOf")]
-    pub on_behalf_of: Option<String>,
-}
-
-impl std::fmt::Display for CaptionsUpdateParams {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        write!(
-            f,
-            "&part={}",
-            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
-        )?;
-        if let Some(ref v) = self.sync {
-            write!(
-                f,
-                "&sync={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.on_behalf_of_content_owner {
-            write!(
-                f,
-                "&onBehalfOfContentOwner={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.on_behalf_of {
-            write!(
-                f,
-                "&onBehalfOf={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        Ok(())
-    }
-}
-
-/// Parameters for the `captions.insert` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct CaptionsInsertParams {
-    /// General attributes applying to any API call
-    #[serde(flatten)]
-    pub youtube_params: Option<YoutubeParams>,
-    /// The *part* parameter specifies the caption resource parts that the API response will include. Set the parameter value to snippet.
-    #[serde(rename = "part")]
-    pub part: String,
-    /// Extra parameter to allow automatically syncing the uploaded caption/transcript with the audio.
-    #[serde(rename = "sync")]
-    pub sync: Option<bool>,
-    /// *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwner* parameter indicates that the request's authorization credentials identify a YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and get access to all their video and channel data, without having to provide authentication credentials for each individual channel. The actual CMS account that the user authenticates with must be linked to the specified YouTube content owner.
-    #[serde(rename = "onBehalfOfContentOwner")]
-    pub on_behalf_of_content_owner: Option<String>,
-    /// ID of the Google+ Page for the channel that the request is be on behalf of
-    #[serde(rename = "onBehalfOf")]
-    pub on_behalf_of: Option<String>,
-}
-
-impl std::fmt::Display for CaptionsInsertParams {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        write!(
-            f,
-            "&part={}",
-            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
-        )?;
-        if let Some(ref v) = self.sync {
-            write!(
-                f,
-                "&sync={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.on_behalf_of_content_owner {
-            write!(
-                f,
-                "&onBehalfOfContentOwner={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.on_behalf_of {
-            write!(
-                f,
-                "&onBehalfOf={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        Ok(())
-    }
-}
-
-/// Parameters for the `captions.download` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct CaptionsDownloadParams {
-    /// General attributes applying to any API call
-    #[serde(flatten)]
-    pub youtube_params: Option<YoutubeParams>,
-    /// ID of the Google+ Page for the channel that the request is be on behalf of
-    #[serde(rename = "onBehalfOf")]
-    pub on_behalf_of: Option<String>,
-    /// The ID of the caption track to download, required for One Platform.
-    #[serde(rename = "id")]
-    pub id: String,
-    /// Convert the captions into this format. Supported options are sbv, srt, and vtt.
-    #[serde(rename = "tfmt")]
-    pub tfmt: Option<String>,
-    /// tlang is the language code; machine translate the captions into this language.
-    #[serde(rename = "tlang")]
-    pub tlang: Option<String>,
-    /// *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwner* parameter indicates that the request's authorization credentials identify a YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and get access to all their video and channel data, without having to provide authentication credentials for each individual channel. The actual CMS account that the user authenticates with must be linked to the specified YouTube content owner.
-    #[serde(rename = "onBehalfOfContentOwner")]
-    pub on_behalf_of_content_owner: Option<String>,
-}
-
-impl std::fmt::Display for CaptionsDownloadParams {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        if let Some(ref v) = self.on_behalf_of {
-            write!(
-                f,
-                "&onBehalfOf={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.tfmt {
-            write!(
-                f,
-                "&tfmt={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.tlang {
-            write!(
-                f,
-                "&tlang={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.on_behalf_of_content_owner {
-            write!(
-                f,
-                "&onBehalfOfContentOwner={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        Ok(())
-    }
-}
-
-/// Parameters for the `captions.list` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct CaptionsListParams {
-    /// General attributes applying to any API call
-    #[serde(flatten)]
-    pub youtube_params: Option<YoutubeParams>,
-    /// Returns the captions for the specified video.
-    #[serde(rename = "videoId")]
-    pub video_id: String,
-    /// *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwner* parameter indicates that the request's authorization credentials identify a YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and get access to all their video and channel data, without having to provide authentication credentials for each individual channel. The actual CMS account that the user authenticates with must be linked to the specified YouTube content owner.
-    #[serde(rename = "onBehalfOfContentOwner")]
-    pub on_behalf_of_content_owner: Option<String>,
-    /// The *part* parameter specifies a comma-separated list of one or more caption resource parts that the API response will include. The part names that you can include in the parameter value are id and snippet.
-    #[serde(rename = "part")]
-    pub part: String,
-    /// ID of the Google+ Page for the channel that the request is on behalf of.
-    #[serde(rename = "onBehalfOf")]
-    pub on_behalf_of: Option<String>,
-    /// Returns the captions with the given IDs for Stubby or Apiary.
-    #[serde(rename = "id")]
-    pub id: Option<String>,
-}
-
-impl std::fmt::Display for CaptionsListParams {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        write!(
-            f,
-            "&videoId={}",
-            percent_encode(format!("{}", self.video_id).as_bytes(), NON_ALPHANUMERIC).to_string()
-        )?;
-        write!(
-            f,
-            "&part={}",
-            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
-        )?;
-        if let Some(ref v) = self.on_behalf_of_content_owner {
-            write!(
-                f,
-                "&onBehalfOfContentOwner={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.on_behalf_of {
-            write!(
-                f,
-                "&onBehalfOf={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.id {
-            write!(
-                f,
-                "&id={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        Ok(())
-    }
-}
-
-/// Parameters for the `i18nRegions.list` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct I18nRegionsListParams {
-    /// General attributes applying to any API call
-    #[serde(flatten)]
-    pub youtube_params: Option<YoutubeParams>,
-    /// The *part* parameter specifies the i18nRegion resource properties that the API response will include. Set the parameter value to snippet.
-    #[serde(rename = "part")]
-    pub part: String,
-    #[serde(rename = "hl")]
-    pub hl: Option<String>,
-}
-
-impl std::fmt::Display for I18nRegionsListParams {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        write!(
-            f,
-            "&part={}",
-            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
-        )?;
-        if let Some(ref v) = self.hl {
-            write!(
-                f,
-                "&hl={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        Ok(())
-    }
-}
-
-/// Parameters for the `subscriptions.delete` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct SubscriptionsDeleteParams {
-    /// General attributes applying to any API call
-    #[serde(flatten)]
-    pub youtube_params: Option<YoutubeParams>,
-    #[serde(rename = "id")]
-    pub id: String,
-}
-
-impl std::fmt::Display for SubscriptionsDeleteParams {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        write!(
-            f,
-            "&id={}",
-            percent_encode(format!("{}", self.id).as_bytes(), NON_ALPHANUMERIC).to_string()
-        )?;
-        Ok(())
-    }
-}
-
-/// Parameters for the `subscriptions.list` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct SubscriptionsListParams {
-    /// General attributes applying to any API call
-    #[serde(flatten)]
-    pub youtube_params: Option<YoutubeParams>,
-    /// The *maxResults* parameter specifies the maximum number of items that should be returned in the result set.
-    #[serde(rename = "maxResults")]
-    pub max_results: Option<u32>,
-    /// Return the subscriptions of the given channel owner.
-    #[serde(rename = "channelId")]
-    pub channel_id: Option<String>,
-    /// The order of the returned subscriptions
-    #[serde(rename = "order")]
-    pub order: Option<SubscriptionsListOrder>,
-    /// Return the subscribers of the given channel owner.
-    #[serde(rename = "mySubscribers")]
-    pub my_subscribers: Option<bool>,
-    /// The *part* parameter specifies a comma-separated list of one or more subscription resource properties that the API response will include. If the parameter identifies a property that contains child properties, the child properties will be included in the response. For example, in a subscription resource, the snippet property contains other properties, such as a display title for the subscription. If you set *part=snippet*, the API response will also contain all of those nested properties.
-    #[serde(rename = "part")]
-    pub part: String,
-    /// The *pageToken* parameter identifies a specific page in the result set that should be returned. In an API response, the nextPageToken and prevPageToken properties identify other pages that could be retrieved.
-    #[serde(rename = "pageToken")]
-    pub page_token: Option<String>,
-    #[serde(rename = "myRecentSubscribers")]
-    pub my_recent_subscribers: Option<bool>,
-    /// Return the subscriptions with the given IDs for Stubby or Apiary.
-    #[serde(rename = "id")]
-    pub id: Option<String>,
-    /// *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwner* parameter indicates that the request's authorization credentials identify a YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and get access to all their video and channel data, without having to provide authentication credentials for each individual channel. The CMS account that the user authenticates with must be linked to the specified YouTube content owner.
-    #[serde(rename = "onBehalfOfContentOwner")]
-    pub on_behalf_of_content_owner: Option<String>,
-    /// Return the subscriptions to the subset of these channels that the authenticated user is subscribed to.
-    #[serde(rename = "forChannelId")]
-    pub for_channel_id: Option<String>,
-    /// Flag for returning the subscriptions of the authenticated user.
-    #[serde(rename = "mine")]
-    pub mine: Option<bool>,
-    /// This parameter can only be used in a properly authorized request. *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwnerChannel* parameter specifies the YouTube channel ID of the channel to which a video is being added. This parameter is required when a request specifies a value for the onBehalfOfContentOwner parameter, and it can only be used in conjunction with that parameter. In addition, the request must be authorized using a CMS account that is linked to the content owner that the onBehalfOfContentOwner parameter specifies. Finally, the channel that the onBehalfOfContentOwnerChannel parameter value specifies must be linked to the content owner that the onBehalfOfContentOwner parameter specifies. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and perform actions on behalf of the channel specified in the parameter value, without having to provide authentication credentials for each separate channel.
-    #[serde(rename = "onBehalfOfContentOwnerChannel")]
-    pub on_behalf_of_content_owner_channel: Option<String>,
-}
-
-impl std::fmt::Display for SubscriptionsListParams {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        write!(
-            f,
-            "&part={}",
-            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
-        )?;
-        if let Some(ref v) = self.max_results {
-            write!(
-                f,
-                "&maxResults={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.channel_id {
-            write!(
-                f,
-                "&channelId={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.order {
-            write!(
-                f,
-                "&order={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.my_subscribers {
-            write!(
-                f,
-                "&mySubscribers={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.page_token {
-            write!(
-                f,
-                "&pageToken={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.my_recent_subscribers {
-            write!(
-                f,
-                "&myRecentSubscribers={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.id {
-            write!(
-                f,
-                "&id={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.on_behalf_of_content_owner {
-            write!(
-                f,
-                "&onBehalfOfContentOwner={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.for_channel_id {
-            write!(
-                f,
-                "&forChannelId={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.mine {
-            write!(
-                f,
-                "&mine={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.on_behalf_of_content_owner_channel {
-            write!(
-                f,
-                "&onBehalfOfContentOwnerChannel={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        Ok(())
-    }
-}
-
-/// Parameters for the `subscriptions.insert` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct SubscriptionsInsertParams {
-    /// General attributes applying to any API call
-    #[serde(flatten)]
-    pub youtube_params: Option<YoutubeParams>,
-    /// The *part* parameter serves two purposes in this operation. It identifies the properties that the write operation will set as well as the properties that the API response will include.
-    #[serde(rename = "part")]
-    pub part: String,
-}
-
-impl std::fmt::Display for SubscriptionsInsertParams {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        write!(
-            f,
-            "&part={}",
-            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
-        )?;
-        Ok(())
-    }
-}
-
-/// Parameters for the `liveChatBans.delete` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct LiveChatBansDeleteParams {
-    /// General attributes applying to any API call
-    #[serde(flatten)]
-    pub youtube_params: Option<YoutubeParams>,
-    #[serde(rename = "id")]
-    pub id: String,
-}
-
-impl std::fmt::Display for LiveChatBansDeleteParams {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        write!(
-            f,
-            "&id={}",
-            percent_encode(format!("{}", self.id).as_bytes(), NON_ALPHANUMERIC).to_string()
-        )?;
-        Ok(())
-    }
-}
-
-/// Parameters for the `liveChatBans.insert` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct LiveChatBansInsertParams {
-    /// General attributes applying to any API call
-    #[serde(flatten)]
-    pub youtube_params: Option<YoutubeParams>,
-    /// The *part* parameter serves two purposes in this operation. It identifies the properties that the write operation will set as well as the properties that the API response returns. Set the parameter value to snippet.
-    #[serde(rename = "part")]
-    pub part: String,
-}
-
-impl std::fmt::Display for LiveChatBansInsertParams {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        write!(
-            f,
-            "&part={}",
-            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
-        )?;
-        Ok(())
-    }
-}
-
-/// Parameters for the `comments.update` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct CommentsUpdateParams {
-    /// General attributes applying to any API call
-    #[serde(flatten)]
-    pub youtube_params: Option<YoutubeParams>,
-    /// The *part* parameter identifies the properties that the API response will include. You must at least include the snippet part in the parameter value since that part contains all of the properties that the API request can update.
-    #[serde(rename = "part")]
-    pub part: String,
-}
-
-impl std::fmt::Display for CommentsUpdateParams {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        write!(
-            f,
-            "&part={}",
-            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
-        )?;
-        Ok(())
-    }
-}
-
-/// Parameters for the `comments.markAsSpam` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct CommentsMarkAsSpamParams {
-    /// General attributes applying to any API call
-    #[serde(flatten)]
-    pub youtube_params: Option<YoutubeParams>,
-    /// Flags the comments with the given IDs as spam in the caller's opinion.
-    #[serde(rename = "id")]
-    pub id: String,
-}
-
-impl std::fmt::Display for CommentsMarkAsSpamParams {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        write!(
-            f,
-            "&id={}",
-            percent_encode(format!("{}", self.id).as_bytes(), NON_ALPHANUMERIC).to_string()
-        )?;
-        Ok(())
-    }
-}
-
-/// Parameters for the `comments.setModerationStatus` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct CommentsSetModerationStatusParams {
-    /// General attributes applying to any API call
-    #[serde(flatten)]
-    pub youtube_params: Option<YoutubeParams>,
-    /// Modifies the moderation status of the comments with the given IDs
-    #[serde(rename = "id")]
-    pub id: String,
-    /// Specifies the requested moderation status. Note, comments can be in statuses, which are not available through this call. For example, this call does not allow to mark a comment as 'likely spam'. Valid values: MODERATION_STATUS_PUBLISHED, MODERATION_STATUS_HELD_FOR_REVIEW, MODERATION_STATUS_REJECTED.
-    #[serde(rename = "moderationStatus")]
-    pub moderation_status: CommentsSetModerationStatusModerationStatus,
-    /// If set to true the author of the comment gets added to the ban list. This means all future comments of the author will autmomatically be rejected. Only valid in combination with STATUS_REJECTED.
-    #[serde(rename = "banAuthor")]
-    pub ban_author: Option<bool>,
-}
-
-impl std::fmt::Display for CommentsSetModerationStatusParams {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        write!(
-            f,
-            "&id={}",
-            percent_encode(format!("{}", self.id).as_bytes(), NON_ALPHANUMERIC).to_string()
-        )?;
-        write!(
-            f,
-            "&moderationStatus={}",
-            percent_encode(
-                format!("{}", self.moderation_status).as_bytes(),
-                NON_ALPHANUMERIC
-            )
-            .to_string()
-        )?;
-        if let Some(ref v) = self.ban_author {
-            write!(
-                f,
-                "&banAuthor={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        Ok(())
-    }
-}
-
-/// Parameters for the `comments.insert` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct CommentsInsertParams {
-    /// General attributes applying to any API call
-    #[serde(flatten)]
-    pub youtube_params: Option<YoutubeParams>,
-    /// The *part* parameter identifies the properties that the API response will include. Set the parameter value to snippet. The snippet part has a quota cost of 2 units.
-    #[serde(rename = "part")]
-    pub part: String,
-}
-
-impl std::fmt::Display for CommentsInsertParams {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        write!(
-            f,
-            "&part={}",
-            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
-        )?;
-        Ok(())
-    }
-}
-
-/// Parameters for the `comments.delete` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct CommentsDeleteParams {
-    /// General attributes applying to any API call
-    #[serde(flatten)]
-    pub youtube_params: Option<YoutubeParams>,
-    #[serde(rename = "id")]
-    pub id: String,
-}
-
-impl std::fmt::Display for CommentsDeleteParams {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        write!(
-            f,
-            "&id={}",
-            percent_encode(format!("{}", self.id).as_bytes(), NON_ALPHANUMERIC).to_string()
-        )?;
-        Ok(())
-    }
-}
-
-/// Parameters for the `comments.list` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct CommentsListParams {
-    /// General attributes applying to any API call
-    #[serde(flatten)]
-    pub youtube_params: Option<YoutubeParams>,
-    /// The *pageToken* parameter identifies a specific page in the result set that should be returned. In an API response, the nextPageToken and prevPageToken properties identify other pages that could be retrieved.
-    #[serde(rename = "pageToken")]
-    pub page_token: Option<String>,
-    /// Returns replies to the specified comment. Note, currently YouTube features only one level of replies (ie replies to top level comments). However replies to replies may be supported in the future.
-    #[serde(rename = "parentId")]
-    pub parent_id: Option<String>,
-    /// The requested text format for the returned comments.
-    #[serde(rename = "textFormat")]
-    pub text_format: Option<CommentsListTextFormat>,
-    /// Returns the comments with the given IDs for One Platform.
-    #[serde(rename = "id")]
-    pub id: Option<String>,
-    /// The *maxResults* parameter specifies the maximum number of items that should be returned in the result set.
-    #[serde(rename = "maxResults")]
-    pub max_results: Option<u32>,
-    /// The *part* parameter specifies a comma-separated list of one or more comment resource properties that the API response will include.
-    #[serde(rename = "part")]
-    pub part: String,
-}
-
-impl std::fmt::Display for CommentsListParams {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        write!(
-            f,
-            "&part={}",
-            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
-        )?;
-        if let Some(ref v) = self.page_token {
-            write!(
-                f,
-                "&pageToken={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.parent_id {
-            write!(
-                f,
-                "&parentId={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.text_format {
-            write!(
-                f,
-                "&textFormat={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.id {
-            write!(
-                f,
-                "&id={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.max_results {
-            write!(
-                f,
-                "&maxResults={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        Ok(())
-    }
-}
-
 /// Parameters for the `thumbnails.set` method.
 #[derive(Serialize, Deserialize, Debug, Clone, Default)]
 pub struct ThumbnailsSetParams {
@@ -14573,6 +14537,445 @@
     }
 }
 
+/// Parameters for the `videoAbuseReportReasons.list` method.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct VideoAbuseReportReasonsListParams {
+    /// General attributes applying to any API call
+    #[serde(flatten)]
+    pub youtube_params: Option<YoutubeParams>,
+    #[serde(rename = "hl")]
+    pub hl: Option<String>,
+    /// The *part* parameter specifies the videoCategory resource parts that the API response will include. Supported values are id and snippet.
+    #[serde(rename = "part")]
+    pub part: String,
+}
+
+impl std::fmt::Display for VideoAbuseReportReasonsListParams {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        write!(
+            f,
+            "&part={}",
+            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
+        )?;
+        if let Some(ref v) = self.hl {
+            write!(
+                f,
+                "&hl={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        Ok(())
+    }
+}
+
+/// Parameters for the `videoCategories.list` method.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct VideoCategoriesListParams {
+    /// General attributes applying to any API call
+    #[serde(flatten)]
+    pub youtube_params: Option<YoutubeParams>,
+    #[serde(rename = "hl")]
+    pub hl: Option<String>,
+    /// Returns the video categories with the given IDs for Stubby or Apiary.
+    #[serde(rename = "id")]
+    pub id: Option<String>,
+    /// The *part* parameter specifies the videoCategory resource properties that the API response will include. Set the parameter value to snippet.
+    #[serde(rename = "part")]
+    pub part: String,
+    #[serde(rename = "regionCode")]
+    pub region_code: Option<String>,
+}
+
+impl std::fmt::Display for VideoCategoriesListParams {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        write!(
+            f,
+            "&part={}",
+            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
+        )?;
+        if let Some(ref v) = self.hl {
+            write!(
+                f,
+                "&hl={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.id {
+            write!(
+                f,
+                "&id={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.region_code {
+            write!(
+                f,
+                "&regionCode={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        Ok(())
+    }
+}
+
+/// Parameters for the `videos.delete` method.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct VideosDeleteParams {
+    /// General attributes applying to any API call
+    #[serde(flatten)]
+    pub youtube_params: Option<YoutubeParams>,
+    #[serde(rename = "id")]
+    pub id: String,
+    /// *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwner* parameter indicates that the request's authorization credentials identify a YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and get access to all their video and channel data, without having to provide authentication credentials for each individual channel. The actual CMS account that the user authenticates with must be linked to the specified YouTube content owner.
+    #[serde(rename = "onBehalfOfContentOwner")]
+    pub on_behalf_of_content_owner: Option<String>,
+}
+
+impl std::fmt::Display for VideosDeleteParams {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        write!(
+            f,
+            "&id={}",
+            percent_encode(format!("{}", self.id).as_bytes(), NON_ALPHANUMERIC).to_string()
+        )?;
+        if let Some(ref v) = self.on_behalf_of_content_owner {
+            write!(
+                f,
+                "&onBehalfOfContentOwner={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        Ok(())
+    }
+}
+
+/// Parameters for the `videos.getRating` method.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct VideosGetRatingParams {
+    /// General attributes applying to any API call
+    #[serde(flatten)]
+    pub youtube_params: Option<YoutubeParams>,
+    #[serde(rename = "id")]
+    pub id: String,
+    /// *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwner* parameter indicates that the request's authorization credentials identify a YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and get access to all their video and channel data, without having to provide authentication credentials for each individual channel. The CMS account that the user authenticates with must be linked to the specified YouTube content owner.
+    #[serde(rename = "onBehalfOfContentOwner")]
+    pub on_behalf_of_content_owner: Option<String>,
+}
+
+impl std::fmt::Display for VideosGetRatingParams {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        write!(
+            f,
+            "&id={}",
+            percent_encode(format!("{}", self.id).as_bytes(), NON_ALPHANUMERIC).to_string()
+        )?;
+        if let Some(ref v) = self.on_behalf_of_content_owner {
+            write!(
+                f,
+                "&onBehalfOfContentOwner={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        Ok(())
+    }
+}
+
+/// Parameters for the `videos.insert` method.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct VideosInsertParams {
+    /// General attributes applying to any API call
+    #[serde(flatten)]
+    pub youtube_params: Option<YoutubeParams>,
+    /// Should 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>,
+    /// *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwner* parameter indicates that the request's authorization credentials identify a YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners 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. 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 stabilize be applied to the upload.
+    #[serde(rename = "stabilize")]
+    pub stabilize: Option<bool>,
+}
+
+impl std::fmt::Display for VideosInsertParams {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        write!(
+            f,
+            "&part={}",
+            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
+        )?;
+        if let Some(ref v) = self.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()
+            )?;
+        }
+        if let Some(ref v) = self.on_behalf_of_content_owner {
+            write!(
+                f,
+                "&onBehalfOfContentOwner={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.on_behalf_of_content_owner_channel {
+            write!(
+                f,
+                "&onBehalfOfContentOwnerChannel={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.stabilize {
+            write!(
+                f,
+                "&stabilize={}",
+                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<VideosListChart>,
+    /// 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 with the given ids.
+    #[serde(rename = "id")]
+    pub id: Option<String>,
+    #[serde(rename = "locale")]
+    pub locale: Option<String>,
+    #[serde(rename = "maxHeight")]
+    pub max_height: Option<i32>,
+    /// The *maxResults* parameter specifies the maximum number of items that should be returned in the result set. *Note:* This parameter is supported for use in conjunction with the myRating and chart parameters, but it is not supported for use in conjunction with the id parameter.
+    #[serde(rename = "maxResults")]
+    pub max_results: Option<u32>,
+    /// Return the player with maximum height specified in
+    #[serde(rename = "maxWidth")]
+    pub max_width: Option<i32>,
+    /// Return videos liked/disliked by the authenticated user. Does not support RateType.RATED_TYPE_NONE.
+    #[serde(rename = "myRating")]
+    pub my_rating: Option<VideosListMyRating>,
+    /// *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwner* parameter indicates that the request's authorization credentials identify a YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners 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. *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>,
+    /// 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>,
+    /// 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.hl {
+            write!(
+                f,
+                "&hl={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.id {
+            write!(
+                f,
+                "&id={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.locale {
+            write!(
+                f,
+                "&locale={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.max_height {
+            write!(
+                f,
+                "&maxHeight={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.max_results {
+            write!(
+                f,
+                "&maxResults={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.max_width {
+            write!(
+                f,
+                "&maxWidth={}",
+                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.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_category_id {
+            write!(
+                f,
+                "&videoCategoryId={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        Ok(())
+    }
+}
+
+/// Parameters for the `videos.rate` method.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct VideosRateParams {
+    /// General attributes applying to any API call
+    #[serde(flatten)]
+    pub youtube_params: Option<YoutubeParams>,
+    #[serde(rename = "id")]
+    pub id: String,
+    #[serde(rename = "rating")]
+    pub rating: VideosRateRating,
+}
+
+impl std::fmt::Display for VideosRateParams {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        write!(
+            f,
+            "&id={}",
+            percent_encode(format!("{}", self.id).as_bytes(), NON_ALPHANUMERIC).to_string()
+        )?;
+        write!(
+            f,
+            "&rating={}",
+            percent_encode(format!("{}", self.rating).as_bytes(), NON_ALPHANUMERIC).to_string()
+        )?;
+        Ok(())
+    }
+}
+
+/// Parameters for the `videos.reportAbuse` method.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct VideosReportAbuseParams {
+    /// General attributes applying to any API call
+    #[serde(flatten)]
+    pub youtube_params: Option<YoutubeParams>,
+    /// *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwner* parameter indicates that the request's authorization credentials identify a YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and get access to all their video and channel data, without having to provide authentication credentials for each individual channel. The CMS account that the user authenticates with must be linked to the specified YouTube content owner.
+    #[serde(rename = "onBehalfOfContentOwner")]
+    pub on_behalf_of_content_owner: Option<String>,
+}
+
+impl std::fmt::Display for VideosReportAbuseParams {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        if let Some(ref v) = self.on_behalf_of_content_owner {
+            write!(
+                f,
+                "&onBehalfOfContentOwner={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        Ok(())
+    }
+}
+
+/// Parameters for the `videos.update` method.
+#[derive(Serialize, Deserialize, Debug, Clone, Default)]
+pub struct VideosUpdateParams {
+    /// General attributes applying to any API call
+    #[serde(flatten)]
+    pub youtube_params: Option<YoutubeParams>,
+    /// *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwner* parameter indicates that the request's authorization credentials identify a YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and get access to all their video and channel data, without having to provide authentication credentials for each individual channel. The actual CMS account that the user authenticates with must be linked to the specified YouTube content owner.
+    #[serde(rename = "onBehalfOfContentOwner")]
+    pub on_behalf_of_content_owner: Option<String>,
+    /// The *part* parameter serves two purposes in this operation. It identifies the properties that the write operation will set as well as the properties that the API response will include. Note that this method will override the existing values for all of the mutable properties that are contained in any parts that the parameter value specifies. For example, a video's privacy setting is contained in the status part. As such, if your request is updating a private video, and the request's part parameter value includes the status part, the video's privacy setting will be updated to whatever value the request body specifies. If the request body does not specify a value, the existing privacy setting will be removed and the video will revert to the default privacy setting. In addition, not all parts contain properties that can be set when inserting or updating a video. For example, the statistics object encapsulates statistics that YouTube calculates for a video and does not contain values that you can set or modify. If the parameter value specifies a part that does not contain mutable values, that part will still be included in the API response.
+    #[serde(rename = "part")]
+    pub part: String,
+}
+
+impl std::fmt::Display for VideosUpdateParams {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        write!(
+            f,
+            "&part={}",
+            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
+        )?;
+        if let Some(ref v) = self.on_behalf_of_content_owner {
+            write!(
+                f,
+                "&onBehalfOfContentOwner={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        Ok(())
+    }
+}
+
 /// Parameters for the `watermarks.set` method.
 #[derive(Serialize, Deserialize, Debug, Clone, Default)]
 pub struct WatermarksSetParams {
@@ -14635,419 +15038,40 @@
     }
 }
 
-/// 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.list` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct PlaylistsListParams {
-    /// General attributes applying to any API call
-    #[serde(flatten)]
-    pub youtube_params: Option<YoutubeParams>,
-    /// The *part* parameter specifies a comma-separated list of one or more playlist resource properties that the API response will include. If the parameter identifies a property that contains child properties, the child properties will be included in the response. For example, in a playlist resource, the snippet property contains properties like author, title, description, tags, and timeCreated. As such, if you set *part=snippet*, the API response will contain all of those properties.
-    #[serde(rename = "part")]
-    pub part: String,
-    /// Return the playlists owned by the authenticated user.
-    #[serde(rename = "mine")]
-    pub mine: Option<bool>,
-    /// Return the playlists owned by the specified channel ID.
-    #[serde(rename = "channelId")]
-    pub channel_id: Option<String>,
-    /// The *pageToken* parameter identifies a specific page in the result set that should be returned. In an API response, the nextPageToken and prevPageToken properties identify other pages that could be retrieved.
-    #[serde(rename = "pageToken")]
-    pub page_token: Option<String>,
-    /// Return the playlists with the given IDs for Stubby or Apiary.
-    #[serde(rename = "id")]
-    pub id: Option<String>,
-    /// Returen content in specified language
-    #[serde(rename = "hl")]
-    pub hl: Option<String>,
-    /// *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwner* parameter indicates that the request's authorization credentials identify a YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and get access to all their video and channel data, without having to provide authentication credentials for each individual channel. The CMS account that the user authenticates with must be linked to the specified YouTube content owner.
-    #[serde(rename = "onBehalfOfContentOwner")]
-    pub on_behalf_of_content_owner: Option<String>,
-    /// The *maxResults* parameter specifies the maximum number of items that should be returned in the result set.
-    #[serde(rename = "maxResults")]
-    pub max_results: Option<u32>,
-    /// This parameter can only be used in a properly authorized request. *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwnerChannel* parameter specifies the YouTube channel ID of the channel to which a video is being added. This parameter is required when a request specifies a value for the onBehalfOfContentOwner parameter, and it can only be used in conjunction with that parameter. In addition, the request must be authorized using a CMS account that is linked to the content owner that the onBehalfOfContentOwner parameter specifies. Finally, the channel that the onBehalfOfContentOwnerChannel parameter value specifies must be linked to the content owner that the onBehalfOfContentOwner parameter specifies. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and perform actions on behalf of the channel specified in the parameter value, without having to provide authentication credentials for each separate channel.
-    #[serde(rename = "onBehalfOfContentOwnerChannel")]
-    pub on_behalf_of_content_owner_channel: Option<String>,
-}
-
-impl std::fmt::Display for PlaylistsListParams {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        write!(
-            f,
-            "&part={}",
-            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
-        )?;
-        if let Some(ref v) = self.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.page_token {
-            write!(
-                f,
-                "&pageToken={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.id {
-            write!(
-                f,
-                "&id={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.hl {
-            write!(
-                f,
-                "&hl={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.on_behalf_of_content_owner {
-            write!(
-                f,
-                "&onBehalfOfContentOwner={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.max_results {
-            write!(
-                f,
-                "&maxResults={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.on_behalf_of_content_owner_channel {
-            write!(
-                f,
-                "&onBehalfOfContentOwnerChannel={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        Ok(())
-    }
-}
-
-/// Parameters for the `playlists.update` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct PlaylistsUpdateParams {
-    /// General attributes applying to any API call
-    #[serde(flatten)]
-    pub youtube_params: Option<YoutubeParams>,
-    /// The *part* parameter serves two purposes in this operation. It identifies the properties that the write operation will set as well as the properties that the API response will include. Note that this method will override the existing values for mutable properties that are contained in any parts that the request body specifies. For example, a playlist's description is contained in the snippet part, which must be included in the request body. If the request does not specify a value for the snippet.description property, the playlist's existing description will be deleted.
-    #[serde(rename = "part")]
-    pub part: String,
-    /// *Note:* This parameter is intended exclusively for YouTube content partners. The *onBehalfOfContentOwner* parameter indicates that the request's authorization credentials identify a YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and get access to all their video and channel data, without having to provide authentication credentials for each individual channel. The CMS account that the user authenticates with must be linked to the specified YouTube content owner.
-    #[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.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 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 `videoAbuseReportReasons.list` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct VideoAbuseReportReasonsListParams {
-    /// General attributes applying to any API call
-    #[serde(flatten)]
-    pub youtube_params: Option<YoutubeParams>,
-    /// The *part* parameter specifies the videoCategory resource parts that the API response will include. Supported values are id and snippet.
-    #[serde(rename = "part")]
-    pub part: String,
-    #[serde(rename = "hl")]
-    pub hl: Option<String>,
-}
-
-impl std::fmt::Display for VideoAbuseReportReasonsListParams {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        write!(
-            f,
-            "&part={}",
-            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
-        )?;
-        if let Some(ref v) = self.hl {
-            write!(
-                f,
-                "&hl={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        Ok(())
-    }
-}
-
-/// Parameters for the `commentThreads.list` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct CommentThreadsListParams {
-    /// General attributes applying to any API call
-    #[serde(flatten)]
-    pub youtube_params: Option<YoutubeParams>,
-    /// Returns the comment threads of the specified video.
-    #[serde(rename = "videoId")]
-    pub video_id: Option<String>,
-    /// Returns the comment threads with the given IDs for Stubby or Apiary.
-    #[serde(rename = "id")]
-    pub id: Option<String>,
-    /// The *maxResults* parameter specifies the maximum number of items that should be returned in the result set.
-    #[serde(rename = "maxResults")]
-    pub max_results: Option<u32>,
-    /// The *part* parameter specifies a comma-separated list of one or more commentThread resource properties that the API response will include.
-    #[serde(rename = "part")]
-    pub part: String,
-    /// The requested text format for the returned comments.
-    #[serde(rename = "textFormat")]
-    pub text_format: Option<CommentThreadsListTextFormat>,
-    /// Limits the returned comment threads to those with the specified moderation status. Not compatible with the 'id' filter. Valid values: published, heldForReview, likelySpam.
-    #[serde(rename = "moderationStatus")]
-    pub moderation_status: Option<CommentThreadsListModerationStatus>,
-    /// Returns the comment threads for all the channel comments (ie does not include comments left on videos).
-    #[serde(rename = "channelId")]
-    pub channel_id: Option<String>,
-    /// Returns the comment threads of all videos of the channel and the channel comments as well.
-    #[serde(rename = "allThreadsRelatedToChannelId")]
-    pub all_threads_related_to_channel_id: Option<String>,
-    #[serde(rename = "order")]
-    pub order: Option<CommentThreadsListOrder>,
-    /// The *pageToken* parameter identifies a specific page in the result set that should be returned. In an API response, the nextPageToken and prevPageToken properties identify other pages that could be retrieved.
-    #[serde(rename = "pageToken")]
-    pub page_token: Option<String>,
-    /// Limits the returned comment threads to those matching the specified key words. Not compatible with the 'id' filter.
-    #[serde(rename = "searchTerms")]
-    pub search_terms: Option<String>,
-}
-
-impl std::fmt::Display for CommentThreadsListParams {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        write!(
-            f,
-            "&part={}",
-            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
-        )?;
-        if let Some(ref v) = self.video_id {
-            write!(
-                f,
-                "&videoId={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.id {
-            write!(
-                f,
-                "&id={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.max_results {
-            write!(
-                f,
-                "&maxResults={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.text_format {
-            write!(
-                f,
-                "&textFormat={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.moderation_status {
-            write!(
-                f,
-                "&moderationStatus={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.channel_id {
-            write!(
-                f,
-                "&channelId={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.all_threads_related_to_channel_id {
-            write!(
-                f,
-                "&allThreadsRelatedToChannelId={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.order {
-            write!(
-                f,
-                "&order={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.page_token {
-            write!(
-                f,
-                "&pageToken={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.search_terms {
-            write!(
-                f,
-                "&searchTerms={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        Ok(())
-    }
-}
-
-/// Parameters for the `commentThreads.insert` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct CommentThreadsInsertParams {
-    /// General attributes applying to any API call
-    #[serde(flatten)]
-    pub youtube_params: Option<YoutubeParams>,
-    /// The *part* parameter identifies the properties that the API response will include. Set the parameter value to snippet. The snippet part has a quota cost of 2 units.
-    #[serde(rename = "part")]
-    pub part: String,
-}
-
-impl std::fmt::Display for CommentThreadsInsertParams {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        write!(
-            f,
-            "&part={}",
-            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
-        )?;
-        Ok(())
-    }
-}
-
-/// Parameters for the `commentThreads.update` method.
-#[derive(Serialize, Deserialize, Debug, Clone, Default)]
-pub struct CommentThreadsUpdateParams {
-    /// General attributes applying to any API call
-    #[serde(flatten)]
-    pub youtube_params: Option<YoutubeParams>,
-    /// The *part* parameter specifies a comma-separated list of commentThread resource properties that the API response will include. You must at least include the snippet part in the parameter value since that part contains all of the properties that the API request can update.
-    #[serde(rename = "part")]
-    pub part: String,
-}
-
-impl std::fmt::Display for CommentThreadsUpdateParams {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        write!(
-            f,
-            "&part={}",
-            percent_encode(format!("{}", self.part).as_bytes(), NON_ALPHANUMERIC).to_string()
-        )?;
-        Ok(())
-    }
-}
-
 #[derive(Serialize, Deserialize, Debug, Clone, Default)]
 pub struct YoutubeParams {
+    /// V1 error format.
+    #[serde(rename = "$.xgafv")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub dollar_xgafv: Option<YoutubeParamsdollar_xgafv>,
+    /// OAuth access token.
+    #[serde(rename = "access_token")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub access_token: Option<String>,
+    /// Data format for response.
+    #[serde(rename = "alt")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub alt: Option<YoutubeParamsAlt>,
+    /// JSONP
+    #[serde(rename = "callback")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub callback: 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>,
     /// API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token.
     #[serde(rename = "key")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub key: Option<String>,
-    /// JSONP
-    #[serde(rename = "callback")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub callback: Option<String>,
+    /// OAuth 2.0 token for the current user.
+    #[serde(rename = "oauth_token")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub oauth_token: Option<String>,
+    /// Returns response with indentations and line breaks.
+    #[serde(rename = "prettyPrint")]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub pretty_print: Option<bool>,
     /// Available to use for quota purposes for server-side applications. Can be any arbitrary string assigned to a user, but should not exceed 40 characters.
     #[serde(rename = "quotaUser")]
     #[serde(skip_serializing_if = "Option::is_none")]
@@ -15056,42 +15080,32 @@
     #[serde(rename = "uploadType")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub upload_type: Option<String>,
-    /// Selector specifying which fields to include in a partial response.
-    #[serde(rename = "fields")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub fields: Option<String>,
     /// Upload protocol for media (e.g. "raw", "multipart").
     #[serde(rename = "upload_protocol")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub upload_protocol: Option<String>,
-    /// OAuth access token.
-    #[serde(rename = "access_token")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub access_token: Option<String>,
-    /// Data format for response.
-    #[serde(rename = "alt")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub alt: Option<YoutubeParamsAlt>,
-    /// OAuth 2.0 token for the current user.
-    #[serde(rename = "oauth_token")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub oauth_token: Option<String>,
-    /// Returns response with indentations and line breaks.
-    #[serde(rename = "prettyPrint")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub pretty_print: Option<bool>,
-    /// V1 error format.
-    #[serde(rename = "$.xgafv")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub dollar_xgafv: Option<YoutubeParamsdollar_xgafv>,
 }
 
 impl std::fmt::Display for YoutubeParams {
     fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        if let Some(ref v) = self.key {
-            write!(
-                f,
-                "&key={}",
+        if let Some(ref v) = self.dollar_xgafv {
+            write!(
+                f,
+                "&$.xgafv={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.access_token {
+            write!(
+                f,
+                "&access_token={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.alt {
+            write!(
+                f,
+                "&alt={}",
                 percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
             )?;
         }
@@ -15102,6 +15116,34 @@
                 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.key {
+            write!(
+                f,
+                "&key={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.oauth_token {
+            write!(
+                f,
+                "&oauth_token={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
+        if let Some(ref v) = self.pretty_print {
+            write!(
+                f,
+                "&prettyPrint={}",
+                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
+            )?;
+        }
         if let Some(ref v) = self.quota_user {
             write!(
                 f,
@@ -15116,13 +15158,6 @@
                 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,
@@ -15130,47 +15165,12 @@
                 percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
             )?;
         }
-        if let Some(ref v) = self.access_token {
-            write!(
-                f,
-                "&access_token={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.alt {
-            write!(
-                f,
-                "&alt={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.oauth_token {
-            write!(
-                f,
-                "&oauth_token={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.pretty_print {
-            write!(
-                f,
-                "&prettyPrint={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        if let Some(ref v) = self.dollar_xgafv {
-            write!(
-                f,
-                "&$.xgafv={}",
-                percent_encode(format!("{}", v).as_bytes(), NON_ALPHANUMERIC).to_string()
-            )?;
-        }
-        Ok(())
-    }
-}
-
-/// The Youtube I18nLanguages service represents the I18nLanguages resource.
-pub struct I18nLanguagesService {
+        Ok(())
+    }
+}
+
+/// The Youtube AbuseReports service represents the AbuseReports resource.
+pub struct AbuseReportsService {
     client: TlsClient,
     authenticator: Box<dyn 'static + DerefAuth>,
     scopes: Vec<String>,
@@ -15179,12 +15179,114 @@
     root_url: String,
 }
 
-impl I18nLanguagesService {
-    /// Create a new I18nLanguagesService 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 `Arc`: `new(client.clone(), Arc::new(authenticator))`.
     /// This way, one authenticator can be shared among several services.
-    pub fn new<A: 'static + DerefAuth>(client: TlsClient, auth: A) -> I18nLanguagesService {
-        I18nLanguagesService {
+    pub fn new<A: 'static + DerefAuth>(client: TlsClient, auth: A) -> AbuseReportsService {
+        AbuseReportsService {
+            client: client,
+            authenticator: Box::new(auth),
+            scopes: vec![],
+            base_url: "https://youtube.googleapis.com/".into(),
+            root_url: "https://youtube.googleapis.com/".into(),
+        }
+    }
+
+    /// Provide the base URL of this API. The returned URL is guaranteed to end with a '/'.
+    fn base_url(&self) -> String {
+        if self.base_url.ends_with("/") {
+            return self.base_url.clone();
+        }
+        return self.base_url.clone() + "/";
+    }
+    /// Provide the root URL of this API. The returned URL is guaranteed to end with a '/'.
+    fn root_url(&self) -> String {
+        if self.root_url.ends_with("/") {
+            return self.root_url.clone();
+        }
+        return self.root_url.clone();
+    }
+    /// Returns appropriate URLs for relative and absolute paths.
+    fn format_path(&self, path: &str) -> String {
+        if path.starts_with("/") {
+            return self.root_url().trim_end_matches("/").to_string() + path;
+        } else {
+            return self.base_url() + path;
+        }
+    }
+
+    #[cfg(test)]
+    /// Override API URLs. `base` is the base path relative to which (relative) method paths are interpreted,
+    /// whereas `root` is the URL relative to which absolute paths are interpreted.
+    pub fn set_urls(&mut self, base: String, root: String) {
+        self.base_url = base;
+        self.root_url = root;
+    }
+
+    /// Explicitly select which scopes should be requested for authorization. Otherwise,
+    /// a possibly too large scope will be requested.
+    ///
+    /// It is most convenient to supply a vec or slice of YoutubeScopes enum values.
+    pub fn set_scopes<S: AsRef<str>, T: AsRef<[S]>>(&mut self, scopes: T) {
+        self.scopes = scopes
+            .as_ref()
+            .into_iter()
+            .map(|s| s.as_ref().to_string())
+            .collect();
+    }
+
+    /// Inserts a new resource into this collection.
+    pub async fn insert(
+        &self,
+        params: &AbuseReportsInsertParams,
+        req: &AbuseReport,
+    ) -> Result<AbuseReport> {
+        let rel_path = format!("youtube/v3/abuseReports",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[YoutubeScopes::YoutubeForceSsl.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref api_params) = &params.youtube_params {
+            url_params.push_str(&format!("{}", api_params));
+        }
+
+        let full_uri = path + &url_params;
+
+        let opt_request: Option<&EmptyRequest> = None;
+        let opt_request = Some(req);
+        do_request(&self.client, &full_uri, &headers, "POST", opt_request).await
+    }
+}
+
+/// The Youtube Activities service represents the Activities resource.
+pub struct ActivitiesService {
+    client: TlsClient,
+    authenticator: Box<dyn 'static + DerefAuth>,
+    scopes: Vec<String>,
+
+    base_url: String,
+    root_url: String,
+}
+
+impl ActivitiesService {
+    /// Create a new ActivitiesService object. The easiest way to call this is wrapping the Authenticator
+    /// into an `Arc`: `new(client.clone(), Arc::new(authenticator))`.
+    /// This way, one authenticator can be shared among several services.
+    pub fn new<A: 'static + DerefAuth>(client: TlsClient, auth: A) -> ActivitiesService {
+        ActivitiesService {
             client: client,
             authenticator: Box::new(auth),
             scopes: vec![],
@@ -15237,14 +15339,14 @@
     }
 
     /// Retrieves a list of resources, possibly filtered.
-    pub async fn list(&self, params: &I18nLanguagesListParams) -> Result<I18nLanguageListResponse> {
-        let rel_path = format!("youtube/v3/i18nLanguages",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
+    pub async fn list(&self, params: &ActivitiesListParams) -> Result<ActivityListResponse> {
+        let rel_path = format!("youtube/v3/activities",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[YoutubeScopes::YoutubeReadonly.as_ref().to_string()];
             tok = self.authenticator.token(scopes).await?;
         } else {
             tok = self.authenticator.token(&self.scopes).await?;
@@ -15266,8 +15368,8 @@
     }
 }
 
-/// The Youtube MembershipsLevels service represents the MembershipsLevels resource.
-pub struct MembershipsLevelsService {
+/// The Youtube Captions service represents the Captions resource.
+pub struct CaptionsService {
     client: TlsClient,
     authenticator: Box<dyn 'static + DerefAuth>,
     scopes: Vec<String>,
@@ -15276,114 +15378,12 @@
     root_url: String,
 }
 
-impl MembershipsLevelsService {
-    /// Create a new MembershipsLevelsService object. The easiest way to call this is wrapping the Authenticator
+impl CaptionsService {
+    /// Create a new CaptionsService object. The easiest way to call this is wrapping the Authenticator
     /// into an `Arc`: `new(client.clone(), Arc::new(authenticator))`.
     /// This way, one authenticator can be shared among several services.
-    pub fn new<A: 'static + DerefAuth>(client: TlsClient, auth: A) -> MembershipsLevelsService {
-        MembershipsLevelsService {
-            client: client,
-            authenticator: Box::new(auth),
-            scopes: vec![],
-            base_url: "https://youtube.googleapis.com/".into(),
-            root_url: "https://youtube.googleapis.com/".into(),
-        }
-    }
-
-    /// Provide the base URL of this API. The returned URL is guaranteed to end with a '/'.
-    fn base_url(&self) -> String {
-        if self.base_url.ends_with("/") {
-            return self.base_url.clone();
-        }
-        return self.base_url.clone() + "/";
-    }
-    /// Provide the root URL of this API. The returned URL is guaranteed to end with a '/'.
-    fn root_url(&self) -> String {
-        if self.root_url.ends_with("/") {
-            return self.root_url.clone();
-        }
-        return self.root_url.clone();
-    }
-    /// Returns appropriate URLs for relative and absolute paths.
-    fn format_path(&self, path: &str) -> String {
-        if path.starts_with("/") {
-            return self.root_url().trim_end_matches("/").to_string() + path;
-        } else {
-            return self.base_url() + path;
-        }
-    }
-
-    #[cfg(test)]
-    /// Override API URLs. `base` is the base path relative to which (relative) method paths are interpreted,
-    /// whereas `root` is the URL relative to which absolute paths are interpreted.
-    pub fn set_urls(&mut self, base: String, root: String) {
-        self.base_url = base;
-        self.root_url = root;
-    }
-
-    /// Explicitly select which scopes should be requested for authorization. Otherwise,
-    /// a possibly too large scope will be requested.
-    ///
-    /// It is most convenient to supply a vec or slice of YoutubeScopes enum values.
-    pub fn set_scopes<S: AsRef<str>, T: AsRef<[S]>>(&mut self, scopes: T) {
-        self.scopes = scopes
-            .as_ref()
-            .into_iter()
-            .map(|s| s.as_ref().to_string())
-            .collect();
-    }
-
-    /// Retrieves a list of all pricing levels offered by a creator to the fans.
-    pub async fn list(
-        &self,
-        params: &MembershipsLevelsListParams,
-    ) -> Result<MembershipsLevelListResponse> {
-        let rel_path = format!("youtube/v3/membershipsLevels",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::YoutubeChannelMembershipsCreator
-                .as_ref()
-                .to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.youtube_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-
-        let opt_request: Option<&EmptyRequest> = None;
-        do_request(&self.client, &full_uri, &headers, "GET", opt_request).await
-    }
-}
-
-/// The Youtube Channels service represents the Channels resource.
-pub struct ChannelsService {
-    client: TlsClient,
-    authenticator: Box<dyn 'static + DerefAuth>,
-    scopes: Vec<String>,
-
-    base_url: String,
-    root_url: String,
-}
-
-impl ChannelsService {
-    /// Create a new ChannelsService object. The easiest way to call this is wrapping the Authenticator
-    /// into an `Arc`: `new(client.clone(), Arc::new(authenticator))`.
-    /// This way, one authenticator can be shared among several services.
-    pub fn new<A: 'static + DerefAuth>(client: TlsClient, auth: A) -> ChannelsService {
-        ChannelsService {
+    pub fn new<A: 'static + DerefAuth>(client: TlsClient, auth: A) -> CaptionsService {
+        CaptionsService {
             client: client,
             authenticator: Box::new(auth),
             scopes: vec![],
@@ -15435,9 +15435,226 @@
             .collect();
     }
 
+    /// Deletes a resource.
+    pub async fn delete(&self, params: &CaptionsDeleteParams) -> Result<()> {
+        let rel_path = format!("youtube/v3/captions",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref api_params) = &params.youtube_params {
+            url_params.push_str(&format!("{}", api_params));
+        }
+
+        let full_uri = path + &url_params;
+
+        let opt_request: Option<&EmptyRequest> = None;
+        do_request(&self.client, &full_uri, &headers, "DELETE", opt_request).await
+    }
+
+    /// Downloads a caption track.
+    ///
+    /// This method potentially downloads data. See documentation of `Download`.
+    pub async fn download<'a>(
+        &'a self,
+        params: &CaptionsDownloadParams,
+    ) -> Result<Download<'a, EmptyRequest, ()>> {
+        let rel_path = format!(
+            "youtube/v3/captions/{id}",
+            id = percent_encode(format!("{}", params.id).as_bytes(), NON_ALPHANUMERIC)
+        );
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref api_params) = &params.youtube_params {
+            url_params.push_str(&format!("{}", api_params));
+        }
+
+        let full_uri = path + &url_params;
+        let opt_request: Option<&EmptyRequest> = None;
+
+        do_download(&self.client, &full_uri, headers, "GET".into(), opt_request).await
+    }
+
+    /// Inserts a new resource into this collection.
+    pub async fn insert(&self, params: &CaptionsInsertParams, req: &Caption) -> Result<Caption> {
+        let rel_path = format!("youtube/v3/captions",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref api_params) = &params.youtube_params {
+            url_params.push_str(&format!("{}", api_params));
+        }
+
+        let full_uri = path + &url_params;
+
+        let opt_request: Option<&EmptyRequest> = None;
+        let opt_request = Some(req);
+        do_request(&self.client, &full_uri, &headers, "POST", opt_request).await
+    }
+
+    /// Inserts a new resource into this collection.
+    ///
+    /// This method is a variant of `insert()`, taking data for upload. It performs a multipart upload.
+    pub async fn insert_upload(
+        &self,
+        params: &CaptionsInsertParams,
+        req: &Caption,
+        data: hyper::body::Bytes,
+    ) -> Result<Caption> {
+        let rel_path = format!("/upload/youtube/v3/captions",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?uploadType=multipart{params}", params = params);
+
+        if let Some(ref api_params) = &params.youtube_params {
+            url_params.push_str(&format!("{}", api_params));
+        }
+
+        let full_uri = path + &url_params;
+        let opt_request: Option<&EmptyRequest> = None;
+        let opt_request = Some(req);
+
+        do_upload_multipart(&self.client, &full_uri, &headers, "POST", opt_request, data).await
+    }
+
+    /// Inserts a new resource into this collection.
+    ///
+    /// This method is a variant of `insert()`, taking data for upload.
+    /// It returns a `ResumableUpload` upload manager which you can use to stream larger amounts
+    /// of data to the API. The result of this call will be returned by the `ResumableUpload` method
+    /// you choose for the upload.
+    pub async fn insert_resumable_upload<'client>(
+        &'client self,
+        params: &CaptionsInsertParams,
+        req: &Caption,
+    ) -> Result<ResumableUpload<'client, Caption>> {
+        let rel_path = format!("/resumable/upload/youtube/v3/captions",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?uploadType=resumable{params}", params = params);
+        if let Some(ref api_params) = &params.youtube_params {
+            url_params.push_str(&format!("{}", api_params));
+        }
+
+        let full_uri = path + &url_params;
+
+        let opt_request: Option<&EmptyRequest> = None;
+        let opt_request = Some(req);
+        let (_resp, headers): (EmptyResponse, hyper::HeaderMap) =
+            do_request_with_headers(&self.client, &full_uri, &headers, "POST", opt_request).await?;
+        if let Some(dest) = headers.get(hyper::header::LOCATION) {
+            use std::convert::TryFrom;
+            Ok(ResumableUpload::new(
+                hyper::Uri::try_from(dest.to_str()?)?,
+                &self.client,
+                5 * 1024 * 1024,
+            ))
+        } else {
+            Err(Error::from(ApiError::RedirectError(format!(
+                "Resumable upload response didn't contain Location: {:?}",
+                headers
+            )))
+            .context(format!("{:?}", headers)))?
+        }
+    }
+
+    /// Retrieves a list of resources, possibly filtered.
+    pub async fn list(&self, params: &CaptionsListParams) -> Result<CaptionListResponse> {
+        let rel_path = format!("youtube/v3/captions",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref api_params) = &params.youtube_params {
+            url_params.push_str(&format!("{}", api_params));
+        }
+
+        let full_uri = path + &url_params;
+
+        let opt_request: Option<&EmptyRequest> = None;
+        do_request(&self.client, &full_uri, &headers, "GET", opt_request).await
+    }
+
     /// Updates an existing resource.
-    pub async fn update(&self, params: &ChannelsUpdateParams, req: &Channel) -> Result<Channel> {
-        let rel_path = format!("youtube/v3/channels",);
+    pub async fn update(&self, params: &CaptionsUpdateParams, req: &Caption) -> Result<Caption> {
+        let rel_path = format!("youtube/v3/captions",);
         let path = self.format_path(rel_path.as_str());
 
         let mut headers = vec![];
@@ -15465,234 +15682,96 @@
         do_request(&self.client, &full_uri, &headers, "PUT", opt_request).await
     }
 
-    /// Retrieves a list of resources, possibly filtered.
-    pub async fn list(&self, params: &ChannelsListParams) -> Result<ChannelListResponse> {
-        let rel_path = format!("youtube/v3/channels",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::YoutubepartnerChannelAudit
-                .as_ref()
-                .to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.youtube_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-
-        let opt_request: Option<&EmptyRequest> = None;
-        do_request(&self.client, &full_uri, &headers, "GET", opt_request).await
-    }
-}
-
-/// The Youtube SuperChatEvents service represents the SuperChatEvents resource.
-pub struct SuperChatEventsService {
-    client: TlsClient,
-    authenticator: Box<dyn 'static + DerefAuth>,
-    scopes: Vec<String>,
-
-    base_url: String,
-    root_url: String,
-}
-
-impl SuperChatEventsService {
-    /// Create a new SuperChatEventsService object. The easiest way to call this is wrapping the Authenticator
-    /// into an `Arc`: `new(client.clone(), Arc::new(authenticator))`.
-    /// This way, one authenticator can be shared among several services.
-    pub fn new<A: 'static + DerefAuth>(client: TlsClient, auth: A) -> SuperChatEventsService {
-        SuperChatEventsService {
-            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.
+    /// Updates an existing resource.
     ///
-    /// 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(
+    /// This method is a variant of `update()`, taking data for upload. It performs a multipart upload.
+    pub async fn update_upload(
         &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 Members service represents the Members resource.
-pub struct MembersService {
-    client: TlsClient,
-    authenticator: Box<dyn 'static + DerefAuth>,
-    scopes: Vec<String>,
-
-    base_url: String,
-    root_url: String,
-}
-
-impl MembersService {
-    /// Create a new MembersService object. The easiest way to call this is wrapping the Authenticator
-    /// into an `Arc`: `new(client.clone(), Arc::new(authenticator))`.
-    /// This way, one authenticator can be shared among several services.
-    pub fn new<A: 'static + DerefAuth>(client: TlsClient, auth: A) -> MembersService {
-        MembersService {
-            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.
+        params: &CaptionsUpdateParams,
+        req: &Caption,
+        data: hyper::body::Bytes,
+    ) -> Result<Caption> {
+        let rel_path = format!("/upload/youtube/v3/captions",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?uploadType=multipart{params}", params = params);
+
+        if let Some(ref api_params) = &params.youtube_params {
+            url_params.push_str(&format!("{}", api_params));
+        }
+
+        let full_uri = path + &url_params;
+        let opt_request: Option<&EmptyRequest> = None;
+        let opt_request = Some(req);
+
+        do_upload_multipart(&self.client, &full_uri, &headers, "PUT", opt_request, data).await
+    }
+
+    /// Updates an existing resource.
     ///
-    /// It is most convenient to supply a vec or slice of YoutubeScopes enum values.
-    pub fn set_scopes<S: AsRef<str>, T: AsRef<[S]>>(&mut self, scopes: T) {
-        self.scopes = scopes
-            .as_ref()
-            .into_iter()
-            .map(|s| s.as_ref().to_string())
-            .collect();
-    }
-
-    /// Retrieves a list of members that match the request criteria for a channel.
-    pub async fn list(&self, params: &MembersListParams) -> Result<MemberListResponse> {
-        let rel_path = format!("youtube/v3/members",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::YoutubeChannelMembershipsCreator
-                .as_ref()
-                .to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.youtube_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-
-        let opt_request: Option<&EmptyRequest> = None;
-        do_request(&self.client, &full_uri, &headers, "GET", opt_request).await
+    /// This method is a variant of `update()`, taking data for upload.
+    /// It returns a `ResumableUpload` upload manager which you can use to stream larger amounts
+    /// of data to the API. The result of this call will be returned by the `ResumableUpload` method
+    /// you choose for the upload.
+    pub async fn update_resumable_upload<'client>(
+        &'client self,
+        params: &CaptionsUpdateParams,
+        req: &Caption,
+    ) -> Result<ResumableUpload<'client, Caption>> {
+        let rel_path = format!("/resumable/upload/youtube/v3/captions",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?uploadType=resumable{params}", params = params);
+        if let Some(ref api_params) = &params.youtube_params {
+            url_params.push_str(&format!("{}", api_params));
+        }
+
+        let full_uri = path + &url_params;
+
+        let opt_request: Option<&EmptyRequest> = None;
+        let opt_request = Some(req);
+        let (_resp, headers): (EmptyResponse, hyper::HeaderMap) =
+            do_request_with_headers(&self.client, &full_uri, &headers, "PUT", opt_request).await?;
+        if let Some(dest) = headers.get(hyper::header::LOCATION) {
+            use std::convert::TryFrom;
+            Ok(ResumableUpload::new(
+                hyper::Uri::try_from(dest.to_str()?)?,
+                &self.client,
+                5 * 1024 * 1024,
+            ))
+        } else {
+            Err(Error::from(ApiError::RedirectError(format!(
+                "Resumable upload response didn't contain Location: {:?}",
+                headers
+            )))
+            .context(format!("{:?}", headers)))?
+        }
     }
 }
 
@@ -15890,673 +15969,6 @@
     }
 }
 
-/// The Youtube PlaylistItems service represents the PlaylistItems resource.
-pub struct PlaylistItemsService {
-    client: TlsClient,
-    authenticator: Box<dyn 'static + DerefAuth>,
-    scopes: Vec<String>,
-
-    base_url: String,
-    root_url: String,
-}
-
-impl PlaylistItemsService {
-    /// Create a new PlaylistItemsService object. The easiest way to call this is wrapping the Authenticator
-    /// into an `Arc`: `new(client.clone(), Arc::new(authenticator))`.
-    /// This way, one authenticator can be shared among several services.
-    pub fn new<A: 'static + DerefAuth>(client: TlsClient, auth: A) -> PlaylistItemsService {
-        PlaylistItemsService {
-            client: client,
-            authenticator: Box::new(auth),
-            scopes: vec![],
-            base_url: "https://youtube.googleapis.com/".into(),
-            root_url: "https://youtube.googleapis.com/".into(),
-        }
-    }
-
-    /// Provide the base URL of this API. The returned URL is guaranteed to end with a '/'.
-    fn base_url(&self) -> String {
-        if self.base_url.ends_with("/") {
-            return self.base_url.clone();
-        }
-        return self.base_url.clone() + "/";
-    }
-    /// Provide the root URL of this API. The returned URL is guaranteed to end with a '/'.
-    fn root_url(&self) -> String {
-        if self.root_url.ends_with("/") {
-            return self.root_url.clone();
-        }
-        return self.root_url.clone();
-    }
-    /// Returns appropriate URLs for relative and absolute paths.
-    fn format_path(&self, path: &str) -> String {
-        if path.starts_with("/") {
-            return self.root_url().trim_end_matches("/").to_string() + path;
-        } else {
-            return self.base_url() + path;
-        }
-    }
-
-    #[cfg(test)]
-    /// Override API URLs. `base` is the base path relative to which (relative) method paths are interpreted,
-    /// whereas `root` is the URL relative to which absolute paths are interpreted.
-    pub fn set_urls(&mut self, base: String, root: String) {
-        self.base_url = base;
-        self.root_url = root;
-    }
-
-    /// Explicitly select which scopes should be requested for authorization. Otherwise,
-    /// a possibly too large scope will be requested.
-    ///
-    /// It is most convenient to supply a vec or slice of YoutubeScopes enum values.
-    pub fn set_scopes<S: AsRef<str>, T: AsRef<[S]>>(&mut self, scopes: T) {
-        self.scopes = scopes
-            .as_ref()
-            .into_iter()
-            .map(|s| s.as_ref().to_string())
-            .collect();
-    }
-
-    /// Updates an existing resource.
-    pub async fn update(
-        &self,
-        params: &PlaylistItemsUpdateParams,
-        req: &PlaylistItem,
-    ) -> Result<PlaylistItem> {
-        let rel_path = format!("youtube/v3/playlistItems",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.youtube_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-
-        let opt_request: Option<&EmptyRequest> = None;
-        let opt_request = Some(req);
-        do_request(&self.client, &full_uri, &headers, "PUT", opt_request).await
-    }
-
-    /// Deletes a resource.
-    pub async fn delete(&self, params: &PlaylistItemsDeleteParams) -> Result<()> {
-        let rel_path = format!("youtube/v3/playlistItems",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.youtube_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-
-        let opt_request: Option<&EmptyRequest> = None;
-        do_request(&self.client, &full_uri, &headers, "DELETE", opt_request).await
-    }
-
-    /// Inserts a new resource into this collection.
-    pub async fn insert(
-        &self,
-        params: &PlaylistItemsInsertParams,
-        req: &PlaylistItem,
-    ) -> Result<PlaylistItem> {
-        let rel_path = format!("youtube/v3/playlistItems",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.youtube_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-
-        let opt_request: Option<&EmptyRequest> = None;
-        let opt_request = Some(req);
-        do_request(&self.client, &full_uri, &headers, "POST", opt_request).await
-    }
-
-    /// Retrieves a list of resources, possibly filtered.
-    pub async fn list(&self, params: &PlaylistItemsListParams) -> Result<PlaylistItemListResponse> {
-        let rel_path = format!("youtube/v3/playlistItems",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.youtube_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-
-        let opt_request: Option<&EmptyRequest> = None;
-        do_request(&self.client, &full_uri, &headers, "GET", opt_request).await
-    }
-}
-
-/// The Youtube VideoCategories service represents the VideoCategories resource.
-pub struct VideoCategoriesService {
-    client: TlsClient,
-    authenticator: Box<dyn 'static + DerefAuth>,
-    scopes: Vec<String>,
-
-    base_url: String,
-    root_url: String,
-}
-
-impl VideoCategoriesService {
-    /// Create a new VideoCategoriesService object. The easiest way to call this is wrapping the Authenticator
-    /// into an `Arc`: `new(client.clone(), Arc::new(authenticator))`.
-    /// This way, one authenticator can be shared among several services.
-    pub fn new<A: 'static + DerefAuth>(client: TlsClient, auth: A) -> VideoCategoriesService {
-        VideoCategoriesService {
-            client: client,
-            authenticator: Box::new(auth),
-            scopes: vec![],
-            base_url: "https://youtube.googleapis.com/".into(),
-            root_url: "https://youtube.googleapis.com/".into(),
-        }
-    }
-
-    /// Provide the base URL of this API. The returned URL is guaranteed to end with a '/'.
-    fn base_url(&self) -> String {
-        if self.base_url.ends_with("/") {
-            return self.base_url.clone();
-        }
-        return self.base_url.clone() + "/";
-    }
-    /// Provide the root URL of this API. The returned URL is guaranteed to end with a '/'.
-    fn root_url(&self) -> String {
-        if self.root_url.ends_with("/") {
-            return self.root_url.clone();
-        }
-        return self.root_url.clone();
-    }
-    /// Returns appropriate URLs for relative and absolute paths.
-    fn format_path(&self, path: &str) -> String {
-        if path.starts_with("/") {
-            return self.root_url().trim_end_matches("/").to_string() + path;
-        } else {
-            return self.base_url() + path;
-        }
-    }
-
-    #[cfg(test)]
-    /// Override API URLs. `base` is the base path relative to which (relative) method paths are interpreted,
-    /// whereas `root` is the URL relative to which absolute paths are interpreted.
-    pub fn set_urls(&mut self, base: String, root: String) {
-        self.base_url = base;
-        self.root_url = root;
-    }
-
-    /// Explicitly select which scopes should be requested for authorization. Otherwise,
-    /// a possibly too large scope will be requested.
-    ///
-    /// It is most convenient to supply a vec or slice of YoutubeScopes enum values.
-    pub fn set_scopes<S: AsRef<str>, T: AsRef<[S]>>(&mut self, scopes: T) {
-        self.scopes = scopes
-            .as_ref()
-            .into_iter()
-            .map(|s| s.as_ref().to_string())
-            .collect();
-    }
-
-    /// Retrieves a list of resources, possibly filtered.
-    pub async fn list(
-        &self,
-        params: &VideoCategoriesListParams,
-    ) -> Result<VideoCategoryListResponse> {
-        let rel_path = format!("youtube/v3/videoCategories",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.youtube_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-
-        let opt_request: Option<&EmptyRequest> = None;
-        do_request(&self.client, &full_uri, &headers, "GET", opt_request).await
-    }
-}
-
-/// The Youtube Videos service represents the Videos resource.
-pub struct VideosService {
-    client: TlsClient,
-    authenticator: Box<dyn 'static + DerefAuth>,
-    scopes: Vec<String>,
-
-    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 `Arc`: `new(client.clone(), Arc::new(authenticator))`.
-    /// This way, one authenticator can be shared among several services.
-    pub fn new<A: 'static + DerefAuth>(client: TlsClient, auth: A) -> VideosService {
-        VideosService {
-            client: client,
-            authenticator: Box::new(auth),
-            scopes: vec![],
-            base_url: "https://youtube.googleapis.com/".into(),
-            root_url: "https://youtube.googleapis.com/".into(),
-        }
-    }
-
-    /// Provide the base URL of this API. The returned URL is guaranteed to end with a '/'.
-    fn base_url(&self) -> String {
-        if self.base_url.ends_with("/") {
-            return self.base_url.clone();
-        }
-        return self.base_url.clone() + "/";
-    }
-    /// Provide the root URL of this API. The returned URL is guaranteed to end with a '/'.
-    fn root_url(&self) -> String {
-        if self.root_url.ends_with("/") {
-            return self.root_url.clone();
-        }
-        return self.root_url.clone();
-    }
-    /// Returns appropriate URLs for relative and absolute paths.
-    fn format_path(&self, path: &str) -> String {
-        if path.starts_with("/") {
-            return self.root_url().trim_end_matches("/").to_string() + path;
-        } else {
-            return self.base_url() + path;
-        }
-    }
-
-    #[cfg(test)]
-    /// Override API URLs. `base` is the base path relative to which (relative) method paths are interpreted,
-    /// whereas `root` is the URL relative to which absolute paths are interpreted.
-    pub fn set_urls(&mut self, base: String, root: String) {
-        self.base_url = base;
-        self.root_url = root;
-    }
-
-    /// Explicitly select which scopes should be requested for authorization. Otherwise,
-    /// a possibly too large scope will be requested.
-    ///
-    /// It is most convenient to supply a vec or slice of YoutubeScopes enum values.
-    pub fn set_scopes<S: AsRef<str>, T: AsRef<[S]>>(&mut self, scopes: T) {
-        self.scopes = scopes
-            .as_ref()
-            .into_iter()
-            .map(|s| s.as_ref().to_string())
-            .collect();
-    }
-
-    /// Report abuse for a video.
-    pub async fn report_abuse(
-        &self,
-        params: &VideosReportAbuseParams,
-        req: &VideoAbuseReport,
-    ) -> Result<()> {
-        let rel_path = format!("youtube/v3/videos/reportAbuse",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.youtube_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-
-        let opt_request: Option<&EmptyRequest> = None;
-        let opt_request = Some(req);
-        do_request(&self.client, &full_uri, &headers, "POST", opt_request).await
-    }
-
-    /// Updates an existing resource.
-    pub async fn update(&self, params: &VideosUpdateParams, req: &Video) -> Result<Video> {
-        let rel_path = format!("youtube/v3/videos",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.youtube_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-
-        let opt_request: Option<&EmptyRequest> = None;
-        let opt_request = Some(req);
-        do_request(&self.client, &full_uri, &headers, "PUT", opt_request).await
-    }
-
-    /// Retrieves a list of resources, possibly filtered.
-    pub async fn list(&self, params: &VideosListParams) -> Result<VideoListResponse> {
-        let rel_path = format!("youtube/v3/videos",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.youtube_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-
-        let opt_request: Option<&EmptyRequest> = None;
-        do_request(&self.client, &full_uri, &headers, "GET", opt_request).await
-    }
-
-    /// Deletes a resource.
-    pub async fn delete(&self, params: &VideosDeleteParams) -> Result<()> {
-        let rel_path = format!("youtube/v3/videos",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.youtube_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-
-        let opt_request: Option<&EmptyRequest> = None;
-        do_request(&self.client, &full_uri, &headers, "DELETE", opt_request).await
-    }
-
-    /// Inserts a new resource into this collection.
-    pub async fn insert(&self, params: &VideosInsertParams, req: &Video) -> Result<Video> {
-        let rel_path = format!("youtube/v3/videos",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.youtube_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-
-        let opt_request: Option<&EmptyRequest> = None;
-        let opt_request = Some(req);
-        do_request(&self.client, &full_uri, &headers, "POST", opt_request).await
-    }
-
-    /// Inserts a new resource into this collection.
-    ///
-    /// This method is a variant of `insert()`, taking data for upload. It performs a multipart upload.
-    pub async fn insert_upload(
-        &self,
-        params: &VideosInsertParams,
-        req: &Video,
-        data: hyper::body::Bytes,
-    ) -> Result<Video> {
-        let rel_path = format!("/upload/youtube/v3/videos",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?uploadType=multipart{params}", params = params);
-
-        if let Some(ref api_params) = &params.youtube_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-        let opt_request: Option<&EmptyRequest> = None;
-        let opt_request = Some(req);
-
-        do_upload_multipart(&self.client, &full_uri, &headers, "POST", opt_request, data).await
-    }
-
-    /// Inserts a new resource into this collection.
-    ///
-    /// This method is a variant of `insert()`, taking data for upload.
-    /// It returns a `ResumableUpload` upload manager which you can use to stream larger amounts
-    /// of data to the API. The result of this call will be returned by the `ResumableUpload` method
-    /// you choose for the upload.
-    pub async fn insert_resumable_upload<'client>(
-        &'client self,
-        params: &VideosInsertParams,
-        req: &Video,
-    ) -> Result<ResumableUpload<'client, Video>> {
-        let rel_path = format!("/resumable/upload/youtube/v3/videos",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?uploadType=resumable{params}", params = params);
-        if let Some(ref api_params) = &params.youtube_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-
-        let opt_request: Option<&EmptyRequest> = None;
-        let opt_request = Some(req);
-        let (_resp, headers): (EmptyResponse, hyper::HeaderMap) =
-            do_request_with_headers(&self.client, &full_uri, &headers, "POST", opt_request).await?;
-        if let Some(dest) = headers.get(hyper::header::LOCATION) {
-            use std::convert::TryFrom;
-            Ok(ResumableUpload::new(
-                hyper::Uri::try_from(dest.to_str()?)?,
-                &self.client,
-                5 * 1024 * 1024,
-            ))
-        } else {
-            Err(Error::from(ApiError::RedirectError(format!(
-                "Resumable upload response didn't contain Location: {:?}",
-                headers
-            )))
-            .context(format!("{:?}", headers)))?
-        }
-    }
-
-    /// Retrieves the ratings that the authorized user gave to a list of specified videos.
-    pub async fn get_rating(
-        &self,
-        params: &VideosGetRatingParams,
-    ) -> Result<VideoRatingListResponse> {
-        let rel_path = format!("youtube/v3/videos/getRating",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.youtube_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-
-        let opt_request: Option<&EmptyRequest> = None;
-        do_request(&self.client, &full_uri, &headers, "GET", opt_request).await
-    }
-
-    /// Adds a like or dislike rating to a video or removes a rating from a video.
-    pub async fn rate(&self, params: &VideosRateParams) -> Result<()> {
-        let rel_path = format!("youtube/v3/videos/rate",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.youtube_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-
-        let opt_request: Option<&EmptyRequest> = None;
-        do_request(&self.client, &full_uri, &headers, "POST", opt_request).await
-    }
-}
-
 /// The Youtube ChannelSections service represents the ChannelSections resource.
 pub struct ChannelSectionsService {
     client: TlsClient,
@@ -16653,6 +16065,72 @@
         do_request(&self.client, &full_uri, &headers, "DELETE", opt_request).await
     }
 
+    /// Inserts a new resource into this collection.
+    pub async fn insert(
+        &self,
+        params: &ChannelSectionsInsertParams,
+        req: &ChannelSection,
+    ) -> Result<ChannelSection> {
+        let rel_path = format!("youtube/v3/channelSections",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref api_params) = &params.youtube_params {
+            url_params.push_str(&format!("{}", api_params));
+        }
+
+        let full_uri = path + &url_params;
+
+        let opt_request: Option<&EmptyRequest> = None;
+        let opt_request = Some(req);
+        do_request(&self.client, &full_uri, &headers, "POST", opt_request).await
+    }
+
+    /// Retrieves a list of resources, possibly filtered.
+    pub async fn list(
+        &self,
+        params: &ChannelSectionsListParams,
+    ) -> Result<ChannelSectionListResponse> {
+        let rel_path = format!("youtube/v3/channelSections",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref api_params) = &params.youtube_params {
+            url_params.push_str(&format!("{}", api_params));
+        }
+
+        let full_uri = path + &url_params;
+
+        let opt_request: Option<&EmptyRequest> = None;
+        do_request(&self.client, &full_uri, &headers, "GET", opt_request).await
+    }
+
     /// Updates an existing resource.
     pub async fn update(
         &self,
@@ -16686,13 +16164,622 @@
         let opt_request = Some(req);
         do_request(&self.client, &full_uri, &headers, "PUT", opt_request).await
     }
+}
+
+/// The Youtube Channels service represents the Channels resource.
+pub struct ChannelsService {
+    client: TlsClient,
+    authenticator: Box<dyn 'static + DerefAuth>,
+    scopes: Vec<String>,
+
+    base_url: String,
+    root_url: String,
+}
+
+impl ChannelsService {
+    /// Create a new ChannelsService object. The easiest way to call this is wrapping the Authenticator
+    /// into an `Arc`: `new(client.clone(), Arc::new(authenticator))`.
+    /// This way, one authenticator can be shared among several services.
+    pub fn new<A: 'static + DerefAuth>(client: TlsClient, auth: A) -> ChannelsService {
+        ChannelsService {
+            client: client,
+            authenticator: Box::new(auth),
+            scopes: vec![],
+            base_url: "https://youtube.googleapis.com/".into(),
+            root_url: "https://youtube.googleapis.com/".into(),
+        }
+    }
+
+    /// Provide the base URL of this API. The returned URL is guaranteed to end with a '/'.
+    fn base_url(&self) -> String {
+        if self.base_url.ends_with("/") {
+            return self.base_url.clone();
+        }
+        return self.base_url.clone() + "/";
+    }
+    /// Provide the root URL of this API. The returned URL is guaranteed to end with a '/'.
+    fn root_url(&self) -> String {
+        if self.root_url.ends_with("/") {
+            return self.root_url.clone();
+        }
+        return self.root_url.clone();
+    }
+    /// Returns appropriate URLs for relative and absolute paths.
+    fn format_path(&self, path: &str) -> String {
+        if path.starts_with("/") {
+            return self.root_url().trim_end_matches("/").to_string() + path;
+        } else {
+            return self.base_url() + path;
+        }
+    }
+
+    #[cfg(test)]
+    /// Override API URLs. `base` is the base path relative to which (relative) method paths are interpreted,
+    /// whereas `root` is the URL relative to which absolute paths are interpreted.
+    pub fn set_urls(&mut self, base: String, root: String) {
+        self.base_url = base;
+        self.root_url = root;
+    }
+
+    /// Explicitly select which scopes should be requested for authorization. Otherwise,
+    /// a possibly too large scope will be requested.
+    ///
+    /// It is most convenient to supply a vec or slice of YoutubeScopes enum values.
+    pub fn set_scopes<S: AsRef<str>, T: AsRef<[S]>>(&mut self, scopes: T) {
+        self.scopes = scopes
+            .as_ref()
+            .into_iter()
+            .map(|s| s.as_ref().to_string())
+            .collect();
+    }
+
+    /// Retrieves a list of resources, possibly filtered.
+    pub async fn list(&self, params: &ChannelsListParams) -> Result<ChannelListResponse> {
+        let rel_path = format!("youtube/v3/channels",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[YoutubeScopes::YoutubepartnerChannelAudit
+                .as_ref()
+                .to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref api_params) = &params.youtube_params {
+            url_params.push_str(&format!("{}", api_params));
+        }
+
+        let full_uri = path + &url_params;
+
+        let opt_request: Option<&EmptyRequest> = None;
+        do_request(&self.client, &full_uri, &headers, "GET", opt_request).await
+    }
+
+    /// Updates an existing resource.
+    pub async fn update(&self, params: &ChannelsUpdateParams, req: &Channel) -> Result<Channel> {
+        let rel_path = format!("youtube/v3/channels",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref api_params) = &params.youtube_params {
+            url_params.push_str(&format!("{}", api_params));
+        }
+
+        let full_uri = path + &url_params;
+
+        let opt_request: Option<&EmptyRequest> = None;
+        let opt_request = Some(req);
+        do_request(&self.client, &full_uri, &headers, "PUT", opt_request).await
+    }
+}
+
+/// The Youtube CommentThreads service represents the CommentThreads resource.
+pub struct CommentThreadsService {
+    client: TlsClient,
+    authenticator: Box<dyn 'static + DerefAuth>,
+    scopes: Vec<String>,
+
+    base_url: String,
+    root_url: String,
+}
+
+impl CommentThreadsService {
+    /// Create a new CommentThreadsService object. The easiest way to call this is wrapping the Authenticator
+    /// into an `Arc`: `new(client.clone(), Arc::new(authenticator))`.
+    /// This way, one authenticator can be shared among several services.
+    pub fn new<A: 'static + DerefAuth>(client: TlsClient, auth: A) -> CommentThreadsService {
+        CommentThreadsService {
+            client: client,
+            authenticator: Box::new(auth),
+            scopes: vec![],
+            base_url: "https://youtube.googleapis.com/".into(),
+            root_url: "https://youtube.googleapis.com/".into(),
+        }
+    }
+
+    /// Provide the base URL of this API. The returned URL is guaranteed to end with a '/'.
+    fn base_url(&self) -> String {
+        if self.base_url.ends_with("/") {
+            return self.base_url.clone();
+        }
+        return self.base_url.clone() + "/";
+    }
+    /// Provide the root URL of this API. The returned URL is guaranteed to end with a '/'.
+    fn root_url(&self) -> String {
+        if self.root_url.ends_with("/") {
+            return self.root_url.clone();
+        }
+        return self.root_url.clone();
+    }
+    /// Returns appropriate URLs for relative and absolute paths.
+    fn format_path(&self, path: &str) -> String {
+        if path.starts_with("/") {
+            return self.root_url().trim_end_matches("/").to_string() + path;
+        } else {
+            return self.base_url() + path;
+        }
+    }
+
+    #[cfg(test)]
+    /// Override API URLs. `base` is the base path relative to which (relative) method paths are interpreted,
+    /// whereas `root` is the URL relative to which absolute paths are interpreted.
+    pub fn set_urls(&mut self, base: String, root: String) {
+        self.base_url = base;
+        self.root_url = root;
+    }
+
+    /// Explicitly select which scopes should be requested for authorization. Otherwise,
+    /// a possibly too large scope will be requested.
+    ///
+    /// It is most convenient to supply a vec or slice of YoutubeScopes enum values.
+    pub fn set_scopes<S: AsRef<str>, T: AsRef<[S]>>(&mut self, scopes: T) {
+        self.scopes = scopes
+            .as_ref()
+            .into_iter()
+            .map(|s| s.as_ref().to_string())
+            .collect();
+    }
+
+    /// Inserts a new resource into this collection.
+    pub async fn insert(
+        &self,
+        params: &CommentThreadsInsertParams,
+        req: &CommentThread,
+    ) -> Result<CommentThread> {
+        let rel_path = format!("youtube/v3/commentThreads",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[YoutubeScopes::YoutubeForceSsl.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref api_params) = &params.youtube_params {
+            url_params.push_str(&format!("{}", api_params));
+        }
+
+        let full_uri = path + &url_params;
+
+        let opt_request: Option<&EmptyRequest> = None;
+        let opt_request = Some(req);
+        do_request(&self.client, &full_uri, &headers, "POST", opt_request).await
+    }
 
     /// Retrieves a list of resources, possibly filtered.
     pub async fn list(
         &self,
-        params: &ChannelSectionsListParams,
-    ) -> Result<ChannelSectionListResponse> {
-        let rel_path = format!("youtube/v3/channelSections",);
+        params: &CommentThreadsListParams,
+    ) -> Result<CommentThreadListResponse> {
+        let rel_path = format!("youtube/v3/commentThreads",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[YoutubeScopes::YoutubeForceSsl.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref api_params) = &params.youtube_params {
+            url_params.push_str(&format!("{}", api_params));
+        }
+
+        let full_uri = path + &url_params;
+
+        let opt_request: Option<&EmptyRequest> = None;
+        do_request(&self.client, &full_uri, &headers, "GET", opt_request).await
+    }
+
+    /// Updates an existing resource.
+    pub async fn update(
+        &self,
+        params: &CommentThreadsUpdateParams,
+        req: &CommentThread,
+    ) -> Result<CommentThread> {
+        let rel_path = format!("youtube/v3/commentThreads",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[YoutubeScopes::YoutubeForceSsl.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref api_params) = &params.youtube_params {
+            url_params.push_str(&format!("{}", api_params));
+        }
+
+        let full_uri = path + &url_params;
+
+        let opt_request: Option<&EmptyRequest> = None;
+        let opt_request = Some(req);
+        do_request(&self.client, &full_uri, &headers, "PUT", opt_request).await
+    }
+}
+
+/// The Youtube Comments service represents the Comments resource.
+pub struct CommentsService {
+    client: TlsClient,
+    authenticator: Box<dyn 'static + DerefAuth>,
+    scopes: Vec<String>,
+
+    base_url: String,
+    root_url: String,
+}
+
+impl CommentsService {
+    /// Create a new CommentsService object. The easiest way to call this is wrapping the Authenticator
+    /// into an `Arc`: `new(client.clone(), Arc::new(authenticator))`.
+    /// This way, one authenticator can be shared among several services.
+    pub fn new<A: 'static + DerefAuth>(client: TlsClient, auth: A) -> CommentsService {
+        CommentsService {
+            client: client,
+            authenticator: Box::new(auth),
+            scopes: vec![],
+            base_url: "https://youtube.googleapis.com/".into(),
+            root_url: "https://youtube.googleapis.com/".into(),
+        }
+    }
+
+    /// Provide the base URL of this API. The returned URL is guaranteed to end with a '/'.
+    fn base_url(&self) -> String {
+        if self.base_url.ends_with("/") {
+            return self.base_url.clone();
+        }
+        return self.base_url.clone() + "/";
+    }
+    /// Provide the root URL of this API. The returned URL is guaranteed to end with a '/'.
+    fn root_url(&self) -> String {
+        if self.root_url.ends_with("/") {
+            return self.root_url.clone();
+        }
+        return self.root_url.clone();
+    }
+    /// Returns appropriate URLs for relative and absolute paths.
+    fn format_path(&self, path: &str) -> String {
+        if path.starts_with("/") {
+            return self.root_url().trim_end_matches("/").to_string() + path;
+        } else {
+            return self.base_url() + path;
+        }
+    }
+
+    #[cfg(test)]
+    /// Override API URLs. `base` is the base path relative to which (relative) method paths are interpreted,
+    /// whereas `root` is the URL relative to which absolute paths are interpreted.
+    pub fn set_urls(&mut self, base: String, root: String) {
+        self.base_url = base;
+        self.root_url = root;
+    }
+
+    /// Explicitly select which scopes should be requested for authorization. Otherwise,
+    /// a possibly too large scope will be requested.
+    ///
+    /// It is most convenient to supply a vec or slice of YoutubeScopes enum values.
+    pub fn set_scopes<S: AsRef<str>, T: AsRef<[S]>>(&mut self, scopes: T) {
+        self.scopes = scopes
+            .as_ref()
+            .into_iter()
+            .map(|s| s.as_ref().to_string())
+            .collect();
+    }
+
+    /// Deletes a resource.
+    pub async fn delete(&self, params: &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(&self, params: &CommentsInsertParams, req: &Comment) -> Result<Comment> {
+        let rel_path = format!("youtube/v3/comments",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[YoutubeScopes::YoutubeForceSsl.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref api_params) = &params.youtube_params {
+            url_params.push_str(&format!("{}", api_params));
+        }
+
+        let full_uri = path + &url_params;
+
+        let opt_request: Option<&EmptyRequest> = None;
+        let opt_request = Some(req);
+        do_request(&self.client, &full_uri, &headers, "POST", opt_request).await
+    }
+
+    /// Retrieves a list of resources, possibly filtered.
+    pub async fn list(&self, params: &CommentsListParams) -> Result<CommentListResponse> {
+        let rel_path = format!("youtube/v3/comments",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[YoutubeScopes::YoutubeForceSsl.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref api_params) = &params.youtube_params {
+            url_params.push_str(&format!("{}", api_params));
+        }
+
+        let full_uri = path + &url_params;
+
+        let opt_request: Option<&EmptyRequest> = None;
+        do_request(&self.client, &full_uri, &headers, "GET", opt_request).await
+    }
+
+    /// Expresses the caller's opinion that one or more comments should be flagged as spam.
+    pub async fn mark_as_spam(&self, params: &CommentsMarkAsSpamParams) -> Result<()> {
+        let rel_path = format!("youtube/v3/comments/markAsSpam",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[YoutubeScopes::YoutubeForceSsl.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref api_params) = &params.youtube_params {
+            url_params.push_str(&format!("{}", api_params));
+        }
+
+        let full_uri = path + &url_params;
+
+        let opt_request: Option<&EmptyRequest> = None;
+        do_request(&self.client, &full_uri, &headers, "POST", opt_request).await
+    }
+
+    /// Sets the moderation status of one or more comments.
+    pub async fn set_moderation_status(
+        &self,
+        params: &CommentsSetModerationStatusParams,
+    ) -> Result<()> {
+        let rel_path = format!("youtube/v3/comments/setModerationStatus",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[YoutubeScopes::YoutubeForceSsl.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref api_params) = &params.youtube_params {
+            url_params.push_str(&format!("{}", api_params));
+        }
+
+        let full_uri = path + &url_params;
+
+        let opt_request: Option<&EmptyRequest> = None;
+        do_request(&self.client, &full_uri, &headers, "POST", opt_request).await
+    }
+
+    /// Updates an existing resource.
+    pub async fn update(&self, params: &CommentsUpdateParams, req: &Comment) -> Result<Comment> {
+        let rel_path = format!("youtube/v3/comments",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[YoutubeScopes::YoutubeForceSsl.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref api_params) = &params.youtube_params {
+            url_params.push_str(&format!("{}", api_params));
+        }
+
+        let full_uri = path + &url_params;
+
+        let opt_request: Option<&EmptyRequest> = None;
+        let opt_request = Some(req);
+        do_request(&self.client, &full_uri, &headers, "PUT", opt_request).await
+    }
+}
+
+/// The Youtube I18nLanguages service represents the I18nLanguages resource.
+pub struct I18nLanguagesService {
+    client: TlsClient,
+    authenticator: Box<dyn 'static + DerefAuth>,
+    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 `Arc`: `new(client.clone(), Arc::new(authenticator))`.
+    /// This way, one authenticator can be shared among several services.
+    pub fn new<A: 'static + DerefAuth>(client: TlsClient, auth: A) -> I18nLanguagesService {
+        I18nLanguagesService {
+            client: client,
+            authenticator: Box::new(auth),
+            scopes: vec![],
+            base_url: "https://youtube.googleapis.com/".into(),
+            root_url: "https://youtube.googleapis.com/".into(),
+        }
+    }
+
+    /// Provide the base URL of this API. The returned URL is guaranteed to end with a '/'.
+    fn base_url(&self) -> String {
+        if self.base_url.ends_with("/") {
+            return self.base_url.clone();
+        }
+        return self.base_url.clone() + "/";
+    }
+    /// Provide the root URL of this API. The returned URL is guaranteed to end with a '/'.
+    fn root_url(&self) -> String {
+        if self.root_url.ends_with("/") {
+            return self.root_url.clone();
+        }
+        return self.root_url.clone();
+    }
+    /// Returns appropriate URLs for relative and absolute paths.
+    fn format_path(&self, path: &str) -> String {
+        if path.starts_with("/") {
+            return self.root_url().trim_end_matches("/").to_string() + path;
+        } else {
+            return self.base_url() + path;
+        }
+    }
+
+    #[cfg(test)]
+    /// Override API URLs. `base` is the base path relative to which (relative) method paths are interpreted,
+    /// whereas `root` is the URL relative to which absolute paths are interpreted.
+    pub fn set_urls(&mut self, base: String, root: String) {
+        self.base_url = base;
+        self.root_url = root;
+    }
+
+    /// Explicitly select which scopes should be requested for authorization. Otherwise,
+    /// a possibly too large scope will be requested.
+    ///
+    /// It is most convenient to supply a vec or slice of YoutubeScopes enum values.
+    pub fn set_scopes<S: AsRef<str>, T: AsRef<[S]>>(&mut self, scopes: T) {
+        self.scopes = scopes
+            .as_ref()
+            .into_iter()
+            .map(|s| s.as_ref().to_string())
+            .collect();
+    }
+
+    /// Retrieves a list of resources, possibly filtered.
+    pub async fn list(&self, params: &I18nLanguagesListParams) -> Result<I18nLanguageListResponse> {
+        let rel_path = format!("youtube/v3/i18nLanguages",);
         let path = self.format_path(rel_path.as_str());
 
         let mut headers = vec![];
@@ -16718,14 +16805,78 @@
         let opt_request: Option<&EmptyRequest> = None;
         do_request(&self.client, &full_uri, &headers, "GET", opt_request).await
     }
-
-    /// Inserts a new resource into this collection.
-    pub async fn insert(
-        &self,
-        params: &ChannelSectionsInsertParams,
-        req: &ChannelSection,
-    ) -> Result<ChannelSection> {
-        let rel_path = format!("youtube/v3/channelSections",);
+}
+
+/// The Youtube I18nRegions service represents the I18nRegions resource.
+pub struct I18nRegionsService {
+    client: TlsClient,
+    authenticator: Box<dyn 'static + DerefAuth>,
+    scopes: Vec<String>,
+
+    base_url: String,
+    root_url: String,
+}
+
+impl I18nRegionsService {
+    /// Create a new I18nRegionsService object. The easiest way to call this is wrapping the Authenticator
+    /// into an `Arc`: `new(client.clone(), Arc::new(authenticator))`.
+    /// This way, one authenticator can be shared among several services.
+    pub fn new<A: 'static + DerefAuth>(client: TlsClient, auth: A) -> I18nRegionsService {
+        I18nRegionsService {
+            client: client,
+            authenticator: Box::new(auth),
+            scopes: vec![],
+            base_url: "https://youtube.googleapis.com/".into(),
+            root_url: "https://youtube.googleapis.com/".into(),
+        }
+    }
+
+    /// Provide the base URL of this API. The returned URL is guaranteed to end with a '/'.
+    fn base_url(&self) -> String {
+        if self.base_url.ends_with("/") {
+            return self.base_url.clone();
+        }
+        return self.base_url.clone() + "/";
+    }
+    /// Provide the root URL of this API. The returned URL is guaranteed to end with a '/'.
+    fn root_url(&self) -> String {
+        if self.root_url.ends_with("/") {
+            return self.root_url.clone();
+        }
+        return self.root_url.clone();
+    }
+    /// Returns appropriate URLs for relative and absolute paths.
+    fn format_path(&self, path: &str) -> String {
+        if path.starts_with("/") {
+            return self.root_url().trim_end_matches("/").to_string() + path;
+        } else {
+            return self.base_url() + path;
+        }
+    }
+
+    #[cfg(test)]
+    /// Override API URLs. `base` is the base path relative to which (relative) method paths are interpreted,
+    /// whereas `root` is the URL relative to which absolute paths are interpreted.
+    pub fn set_urls(&mut self, base: String, root: String) {
+        self.base_url = base;
+        self.root_url = root;
+    }
+
+    /// Explicitly select which scopes should be requested for authorization. Otherwise,
+    /// a possibly too large scope will be requested.
+    ///
+    /// It is most convenient to supply a vec or slice of YoutubeScopes enum values.
+    pub fn set_scopes<S: AsRef<str>, T: AsRef<[S]>>(&mut self, scopes: T) {
+        self.scopes = scopes
+            .as_ref()
+            .into_iter()
+            .map(|s| s.as_ref().to_string())
+            .collect();
+    }
+
+    /// Retrieves a list of resources, possibly filtered.
+    pub async fn list(&self, params: &I18nRegionsListParams) -> Result<I18nRegionListResponse> {
+        let rel_path = format!("youtube/v3/i18nRegions",);
         let path = self.format_path(rel_path.as_str());
 
         let mut headers = vec![];
@@ -16749,9 +16900,560 @@
         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 LiveBroadcasts service represents the LiveBroadcasts resource.
+pub struct LiveBroadcastsService {
+    client: TlsClient,
+    authenticator: Box<dyn 'static + DerefAuth>,
+    scopes: Vec<String>,
+
+    base_url: String,
+    root_url: String,
+}
+
+impl LiveBroadcastsService {
+    /// Create a new LiveBroadcastsService object. The easiest way to call this is wrapping the Authenticator
+    /// into an `Arc`: `new(client.clone(), Arc::new(authenticator))`.
+    /// This way, one authenticator can be shared among several services.
+    pub fn new<A: 'static + DerefAuth>(client: TlsClient, auth: A) -> LiveBroadcastsService {
+        LiveBroadcastsService {
+            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();
+    }
+
+    /// Bind a broadcast to a stream.
+    pub async fn bind(&self, params: &LiveBroadcastsBindParams) -> Result<LiveBroadcast> {
+        let rel_path = format!("youtube/v3/liveBroadcasts/bind",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[YoutubeScopes::YoutubeForceSsl.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref api_params) = &params.youtube_params {
+            url_params.push_str(&format!("{}", api_params));
+        }
+
+        let full_uri = path + &url_params;
+
+        let opt_request: Option<&EmptyRequest> = None;
+        do_request(&self.client, &full_uri, &headers, "POST", opt_request).await
+    }
+
+    /// Delete a given broadcast.
+    pub async fn delete(&self, params: &LiveBroadcastsDeleteParams) -> Result<()> {
+        let rel_path = format!("youtube/v3/liveBroadcasts",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[YoutubeScopes::YoutubeForceSsl.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref api_params) = &params.youtube_params {
+            url_params.push_str(&format!("{}", api_params));
+        }
+
+        let full_uri = path + &url_params;
+
+        let opt_request: Option<&EmptyRequest> = None;
+        do_request(&self.client, &full_uri, &headers, "DELETE", opt_request).await
+    }
+
+    /// Inserts a new stream for the authenticated user.
+    pub async fn insert(
+        &self,
+        params: &LiveBroadcastsInsertParams,
+        req: &LiveBroadcast,
+    ) -> Result<LiveBroadcast> {
+        let rel_path = format!("youtube/v3/liveBroadcasts",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[YoutubeScopes::YoutubeForceSsl.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref 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
     }
+
+    /// Retrieve the list of broadcasts associated with the given channel.
+    pub async fn list(
+        &self,
+        params: &LiveBroadcastsListParams,
+    ) -> Result<LiveBroadcastListResponse> {
+        let rel_path = format!("youtube/v3/liveBroadcasts",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[YoutubeScopes::YoutubeReadonly.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref api_params) = &params.youtube_params {
+            url_params.push_str(&format!("{}", api_params));
+        }
+
+        let full_uri = path + &url_params;
+
+        let opt_request: Option<&EmptyRequest> = None;
+        do_request(&self.client, &full_uri, &headers, "GET", opt_request).await
+    }
+
+    /// Transition a broadcast to a given status.
+    pub async fn transition(
+        &self,
+        params: &LiveBroadcastsTransitionParams,
+    ) -> Result<LiveBroadcast> {
+        let rel_path = format!("youtube/v3/liveBroadcasts/transition",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[YoutubeScopes::YoutubeForceSsl.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref api_params) = &params.youtube_params {
+            url_params.push_str(&format!("{}", api_params));
+        }
+
+        let full_uri = path + &url_params;
+
+        let opt_request: Option<&EmptyRequest> = None;
+        do_request(&self.client, &full_uri, &headers, "POST", opt_request).await
+    }
+
+    /// Updates an existing broadcast for the authenticated user.
+    pub async fn update(
+        &self,
+        params: &LiveBroadcastsUpdateParams,
+        req: &LiveBroadcast,
+    ) -> Result<LiveBroadcast> {
+        let rel_path = format!("youtube/v3/liveBroadcasts",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[YoutubeScopes::YoutubeForceSsl.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref api_params) = &params.youtube_params {
+            url_params.push_str(&format!("{}", api_params));
+        }
+
+        let full_uri = path + &url_params;
+
+        let opt_request: Option<&EmptyRequest> = None;
+        let opt_request = Some(req);
+        do_request(&self.client, &full_uri, &headers, "PUT", opt_request).await
+    }
+}
+
+/// The Youtube LiveChatBans service represents the LiveChatBans resource.
+pub struct LiveChatBansService {
+    client: TlsClient,
+    authenticator: Box<dyn 'static + DerefAuth>,
+    scopes: Vec<String>,
+
+    base_url: String,
+    root_url: String,
+}
+
+impl LiveChatBansService {
+    /// Create a new LiveChatBansService object. The easiest way to call this is wrapping the Authenticator
+    /// into an `Arc`: `new(client.clone(), Arc::new(authenticator))`.
+    /// This way, one authenticator can be shared among several services.
+    pub fn new<A: 'static + DerefAuth>(client: TlsClient, auth: A) -> LiveChatBansService {
+        LiveChatBansService {
+            client: client,
+            authenticator: Box::new(auth),
+            scopes: vec![],
+            base_url: "https://youtube.googleapis.com/".into(),
+            root_url: "https://youtube.googleapis.com/".into(),
+        }
+    }
+
+    /// Provide the base URL of this API. The returned URL is guaranteed to end with a '/'.
+    fn base_url(&self) -> String {
+        if self.base_url.ends_with("/") {
+            return self.base_url.clone();
+        }
+        return self.base_url.clone() + "/";
+    }
+    /// Provide the root URL of this API. The returned URL is guaranteed to end with a '/'.
+    fn root_url(&self) -> String {
+        if self.root_url.ends_with("/") {
+            return self.root_url.clone();
+        }
+        return self.root_url.clone();
+    }
+    /// Returns appropriate URLs for relative and absolute paths.
+    fn format_path(&self, path: &str) -> String {
+        if path.starts_with("/") {
+            return self.root_url().trim_end_matches("/").to_string() + path;
+        } else {
+            return self.base_url() + path;
+        }
+    }
+
+    #[cfg(test)]
+    /// Override API URLs. `base` is the base path relative to which (relative) method paths are interpreted,
+    /// whereas `root` is the URL relative to which absolute paths are interpreted.
+    pub fn set_urls(&mut self, base: String, root: String) {
+        self.base_url = base;
+        self.root_url = root;
+    }
+
+    /// Explicitly select which scopes should be requested for authorization. Otherwise,
+    /// a possibly too large scope will be requested.
+    ///
+    /// It is most convenient to supply a vec or slice of YoutubeScopes enum values.
+    pub fn set_scopes<S: AsRef<str>, T: AsRef<[S]>>(&mut self, scopes: T) {
+        self.scopes = scopes
+            .as_ref()
+            .into_iter()
+            .map(|s| s.as_ref().to_string())
+            .collect();
+    }
+
+    /// Deletes a chat ban.
+    pub async fn delete(&self, params: &LiveChatBansDeleteParams) -> Result<()> {
+        let rel_path = format!("youtube/v3/liveChat/bans",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[YoutubeScopes::YoutubeForceSsl.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref api_params) = &params.youtube_params {
+            url_params.push_str(&format!("{}", api_params));
+        }
+
+        let full_uri = path + &url_params;
+
+        let opt_request: Option<&EmptyRequest> = None;
+        do_request(&self.client, &full_uri, &headers, "DELETE", opt_request).await
+    }
+
+    /// Inserts a new resource into this collection.
+    pub async fn insert(
+        &self,
+        params: &LiveChatBansInsertParams,
+        req: &LiveChatBan,
+    ) -> Result<LiveChatBan> {
+        let rel_path = format!("youtube/v3/liveChat/bans",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[YoutubeScopes::YoutubeForceSsl.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref api_params) = &params.youtube_params {
+            url_params.push_str(&format!("{}", api_params));
+        }
+
+        let full_uri = path + &url_params;
+
+        let opt_request: Option<&EmptyRequest> = None;
+        let opt_request = Some(req);
+        do_request(&self.client, &full_uri, &headers, "POST", opt_request).await
+    }
+}
+
+/// The Youtube LiveChatMessages service represents the LiveChatMessages resource.
+pub struct LiveChatMessagesService {
+    client: TlsClient,
+    authenticator: Box<dyn 'static + DerefAuth>,
+    scopes: Vec<String>,
+
+    base_url: String,
+    root_url: String,
+}
+
+impl LiveChatMessagesService {
+    /// Create a new LiveChatMessagesService object. The easiest way to call this is wrapping the Authenticator
+    /// into an `Arc`: `new(client.clone(), Arc::new(authenticator))`.
+    /// This way, one authenticator can be shared among several services.
+    pub fn new<A: 'static + DerefAuth>(client: TlsClient, auth: A) -> LiveChatMessagesService {
+        LiveChatMessagesService {
+            client: client,
+            authenticator: Box::new(auth),
+            scopes: vec![],
+            base_url: "https://youtube.googleapis.com/".into(),
+            root_url: "https://youtube.googleapis.com/".into(),
+        }
+    }
+
+    /// Provide the base URL of this API. The returned URL is guaranteed to end with a '/'.
+    fn base_url(&self) -> String {
+        if self.base_url.ends_with("/") {
+            return self.base_url.clone();
+        }
+        return self.base_url.clone() + "/";
+    }
+    /// Provide the root URL of this API. The returned URL is guaranteed to end with a '/'.
+    fn root_url(&self) -> String {
+        if self.root_url.ends_with("/") {
+            return self.root_url.clone();
+        }
+        return self.root_url.clone();
+    }
+    /// Returns appropriate URLs for relative and absolute paths.
+    fn format_path(&self, path: &str) -> String {
+        if path.starts_with("/") {
+            return self.root_url().trim_end_matches("/").to_string() + path;
+        } else {
+            return self.base_url() + path;
+        }
+    }
+
+    #[cfg(test)]
+    /// Override API URLs. `base` is the base path relative to which (relative) method paths are interpreted,
+    /// whereas `root` is the URL relative to which absolute paths are interpreted.
+    pub fn set_urls(&mut self, base: String, root: String) {
+        self.base_url = base;
+        self.root_url = root;
+    }
+
+    /// Explicitly select which scopes should be requested for authorization. Otherwise,
+    /// a possibly too large scope will be requested.
+    ///
+    /// It is most convenient to supply a vec or slice of YoutubeScopes enum values.
+    pub fn set_scopes<S: AsRef<str>, T: AsRef<[S]>>(&mut self, scopes: T) {
+        self.scopes = scopes
+            .as_ref()
+            .into_iter()
+            .map(|s| s.as_ref().to_string())
+            .collect();
+    }
+
+    /// Deletes a chat message.
+    pub async fn delete(&self, params: &LiveChatMessagesDeleteParams) -> Result<()> {
+        let rel_path = format!("youtube/v3/liveChat/messages",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[YoutubeScopes::YoutubeForceSsl.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref api_params) = &params.youtube_params {
+            url_params.push_str(&format!("{}", api_params));
+        }
+
+        let full_uri = path + &url_params;
+
+        let opt_request: Option<&EmptyRequest> = None;
+        do_request(&self.client, &full_uri, &headers, "DELETE", opt_request).await
+    }
+
+    /// Inserts a new resource into this collection.
+    pub async fn insert(
+        &self,
+        params: &LiveChatMessagesInsertParams,
+        req: &LiveChatMessage,
+    ) -> Result<LiveChatMessage> {
+        let rel_path = format!("youtube/v3/liveChat/messages",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[YoutubeScopes::YoutubeForceSsl.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref api_params) = &params.youtube_params {
+            url_params.push_str(&format!("{}", api_params));
+        }
+
+        let full_uri = path + &url_params;
+
+        let opt_request: Option<&EmptyRequest> = None;
+        let opt_request = Some(req);
+        do_request(&self.client, &full_uri, &headers, "POST", opt_request).await
+    }
+
+    /// Retrieves a list of resources, possibly filtered.
+    pub async fn list(
+        &self,
+        params: &LiveChatMessagesListParams,
+    ) -> Result<LiveChatMessageListResponse> {
+        let rel_path = format!("youtube/v3/liveChat/messages",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[YoutubeScopes::YoutubeReadonly.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref api_params) = &params.youtube_params {
+            url_params.push_str(&format!("{}", api_params));
+        }
+
+        let full_uri = path + &url_params;
+
+        let opt_request: Option<&EmptyRequest> = None;
+        do_request(&self.client, &full_uri, &headers, "GET", opt_request).await
+    }
 }
 
 /// The Youtube LiveChatModerators service represents the LiveChatModerators resource.
@@ -16850,38 +17552,6 @@
         do_request(&self.client, &full_uri, &headers, "DELETE", opt_request).await
     }
 
-    /// Retrieves a list of resources, possibly filtered.
-    pub async fn list(
-        &self,
-        params: &LiveChatModeratorsListParams,
-    ) -> Result<LiveChatModeratorListResponse> {
-        let rel_path = format!("youtube/v3/liveChat/moderators",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::YoutubeReadonly.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.youtube_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-
-        let opt_request: Option<&EmptyRequest> = None;
-        do_request(&self.client, &full_uri, &headers, "GET", opt_request).await
-    }
-
     /// Inserts a new resource into this collection.
     pub async fn insert(
         &self,
@@ -16915,10 +17585,42 @@
         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 {
+
+    /// Retrieves a list of resources, possibly filtered.
+    pub async fn list(
+        &self,
+        params: &LiveChatModeratorsListParams,
+    ) -> Result<LiveChatModeratorListResponse> {
+        let rel_path = format!("youtube/v3/liveChat/moderators",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[YoutubeScopes::YoutubeReadonly.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref api_params) = &params.youtube_params {
+            url_params.push_str(&format!("{}", api_params));
+        }
+
+        let full_uri = path + &url_params;
+
+        let opt_request: Option<&EmptyRequest> = None;
+        do_request(&self.client, &full_uri, &headers, "GET", opt_request).await
+    }
+}
+
+/// The Youtube LiveStreams service represents the LiveStreams resource.
+pub struct LiveStreamsService {
     client: TlsClient,
     authenticator: Box<dyn 'static + DerefAuth>,
     scopes: Vec<String>,
@@ -16927,12 +17629,206 @@
     root_url: String,
 }
 
-impl LiveChatMessagesService {
-    /// Create a new LiveChatMessagesService object. The easiest way to call this is wrapping the Authenticator
+impl LiveStreamsService {
+    /// Create a new LiveStreamsService object. The easiest way to call this is wrapping the Authenticator
     /// into an `Arc`: `new(client.clone(), Arc::new(authenticator))`.
     /// This way, one authenticator can be shared among several services.
-    pub fn new<A: 'static + DerefAuth>(client: TlsClient, auth: A) -> LiveChatMessagesService {
-        LiveChatMessagesService {
+    pub fn new<A: 'static + DerefAuth>(client: TlsClient, auth: A) -> LiveStreamsService {
+        LiveStreamsService {
+            client: client,
+            authenticator: Box::new(auth),
+            scopes: vec![],
+            base_url: "https://youtube.googleapis.com/".into(),
+            root_url: "https://youtube.googleapis.com/".into(),
+        }
+    }
+
+    /// Provide the base URL of this API. The returned URL is guaranteed to end with a '/'.
+    fn base_url(&self) -> String {
+        if self.base_url.ends_with("/") {
+            return self.base_url.clone();
+        }
+        return self.base_url.clone() + "/";
+    }
+    /// Provide the root URL of this API. The returned URL is guaranteed to end with a '/'.
+    fn root_url(&self) -> String {
+        if self.root_url.ends_with("/") {
+            return self.root_url.clone();
+        }
+        return self.root_url.clone();
+    }
+    /// Returns appropriate URLs for relative and absolute paths.
+    fn format_path(&self, path: &str) -> String {
+        if path.starts_with("/") {
+            return self.root_url().trim_end_matches("/").to_string() + path;
+        } else {
+            return self.base_url() + path;
+        }
+    }
+
+    #[cfg(test)]
+    /// Override API URLs. `base` is the base path relative to which (relative) method paths are interpreted,
+    /// whereas `root` is the URL relative to which absolute paths are interpreted.
+    pub fn set_urls(&mut self, base: String, root: String) {
+        self.base_url = base;
+        self.root_url = root;
+    }
+
+    /// Explicitly select which scopes should be requested for authorization. Otherwise,
+    /// a possibly too large scope will be requested.
+    ///
+    /// It is most convenient to supply a vec or slice of YoutubeScopes enum values.
+    pub fn set_scopes<S: AsRef<str>, T: AsRef<[S]>>(&mut self, scopes: T) {
+        self.scopes = scopes
+            .as_ref()
+            .into_iter()
+            .map(|s| s.as_ref().to_string())
+            .collect();
+    }
+
+    /// Deletes an existing stream for the authenticated user.
+    pub async fn delete(&self, params: &LiveStreamsDeleteParams) -> Result<()> {
+        let rel_path = format!("youtube/v3/liveStreams",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[YoutubeScopes::YoutubeForceSsl.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref api_params) = &params.youtube_params {
+            url_params.push_str(&format!("{}", api_params));
+        }
+
+        let full_uri = path + &url_params;
+
+        let opt_request: Option<&EmptyRequest> = None;
+        do_request(&self.client, &full_uri, &headers, "DELETE", opt_request).await
+    }
+
+    /// Inserts a new stream for the authenticated user.
+    pub async fn insert(
+        &self,
+        params: &LiveStreamsInsertParams,
+        req: &LiveStream,
+    ) -> Result<LiveStream> {
+        let rel_path = format!("youtube/v3/liveStreams",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[YoutubeScopes::YoutubeForceSsl.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref api_params) = &params.youtube_params {
+            url_params.push_str(&format!("{}", api_params));
+        }
+
+        let full_uri = path + &url_params;
+
+        let opt_request: Option<&EmptyRequest> = None;
+        let opt_request = Some(req);
+        do_request(&self.client, &full_uri, &headers, "POST", opt_request).await
+    }
+
+    /// Retrieve the list of streams associated with the given channel. --
+    pub async fn list(&self, params: &LiveStreamsListParams) -> Result<LiveStreamListResponse> {
+        let rel_path = format!("youtube/v3/liveStreams",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[YoutubeScopes::YoutubeReadonly.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref api_params) = &params.youtube_params {
+            url_params.push_str(&format!("{}", api_params));
+        }
+
+        let full_uri = path + &url_params;
+
+        let opt_request: Option<&EmptyRequest> = None;
+        do_request(&self.client, &full_uri, &headers, "GET", opt_request).await
+    }
+
+    /// Updates an existing stream for the authenticated user.
+    pub async fn update(
+        &self,
+        params: &LiveStreamsUpdateParams,
+        req: &LiveStream,
+    ) -> Result<LiveStream> {
+        let rel_path = format!("youtube/v3/liveStreams",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[YoutubeScopes::YoutubeForceSsl.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref api_params) = &params.youtube_params {
+            url_params.push_str(&format!("{}", api_params));
+        }
+
+        let full_uri = path + &url_params;
+
+        let opt_request: Option<&EmptyRequest> = None;
+        let opt_request = Some(req);
+        do_request(&self.client, &full_uri, &headers, "PUT", opt_request).await
+    }
+}
+
+/// The Youtube Members service represents the Members resource.
+pub struct MembersService {
+    client: TlsClient,
+    authenticator: Box<dyn 'static + DerefAuth>,
+    scopes: Vec<String>,
+
+    base_url: String,
+    root_url: String,
+}
+
+impl MembersService {
+    /// Create a new MembersService object. The easiest way to call this is wrapping the Authenticator
+    /// into an `Arc`: `new(client.clone(), Arc::new(authenticator))`.
+    /// This way, one authenticator can be shared among several services.
+    pub fn new<A: 'static + DerefAuth>(client: TlsClient, auth: A) -> MembersService {
+        MembersService {
             client: client,
             authenticator: Box::new(auth),
             scopes: vec![],
@@ -16984,18 +17880,17 @@
             .collect();
     }
 
-    /// Retrieves a list of resources, possibly filtered.
-    pub async fn list(
-        &self,
-        params: &LiveChatMessagesListParams,
-    ) -> Result<LiveChatMessageListResponse> {
-        let rel_path = format!("youtube/v3/liveChat/messages",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::YoutubeReadonly.as_ref().to_string()];
+    /// Retrieves a list of members that match the request criteria for a channel.
+    pub async fn list(&self, params: &MembersListParams) -> Result<MemberListResponse> {
+        let rel_path = format!("youtube/v3/members",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[YoutubeScopes::YoutubeChannelMembershipsCreator
+                .as_ref()
+                .to_string()];
             tok = self.authenticator.token(scopes).await?;
         } else {
             tok = self.authenticator.token(&self.scopes).await?;
@@ -17015,73 +17910,10 @@
         let opt_request: Option<&EmptyRequest> = None;
         do_request(&self.client, &full_uri, &headers, "GET", opt_request).await
     }
-
-    /// Deletes a chat message.
-    pub async fn delete(&self, params: &LiveChatMessagesDeleteParams) -> Result<()> {
-        let rel_path = format!("youtube/v3/liveChat/messages",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::YoutubeForceSsl.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.youtube_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-
-        let opt_request: Option<&EmptyRequest> = None;
-        do_request(&self.client, &full_uri, &headers, "DELETE", opt_request).await
-    }
-
-    /// Inserts a new resource into this collection.
-    pub async fn insert(
-        &self,
-        params: &LiveChatMessagesInsertParams,
-        req: &LiveChatMessage,
-    ) -> Result<LiveChatMessage> {
-        let rel_path = format!("youtube/v3/liveChat/messages",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::YoutubeForceSsl.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.youtube_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-
-        let opt_request: Option<&EmptyRequest> = None;
-        let opt_request = Some(req);
-        do_request(&self.client, &full_uri, &headers, "POST", opt_request).await
-    }
-}
-
-/// The Youtube AbuseReports service represents the AbuseReports resource.
-pub struct AbuseReportsService {
+}
+
+/// The Youtube MembershipsLevels service represents the MembershipsLevels resource.
+pub struct MembershipsLevelsService {
     client: TlsClient,
     authenticator: Box<dyn 'static + DerefAuth>,
     scopes: Vec<String>,
@@ -17090,12 +17922,114 @@
     root_url: String,
 }
 
-impl AbuseReportsService {
-    /// Create a new AbuseReportsService object. The easiest way to call this is wrapping the Authenticator
+impl MembershipsLevelsService {
+    /// Create a new MembershipsLevelsService object. The easiest way to call this is wrapping the Authenticator
     /// into an `Arc`: `new(client.clone(), Arc::new(authenticator))`.
     /// This way, one authenticator can be shared among several services.
-    pub fn new<A: 'static + DerefAuth>(client: TlsClient, auth: A) -> AbuseReportsService {
-        AbuseReportsService {
+    pub fn new<A: 'static + DerefAuth>(client: TlsClient, auth: A) -> MembershipsLevelsService {
+        MembershipsLevelsService {
+            client: client,
+            authenticator: Box::new(auth),
+            scopes: vec![],
+            base_url: "https://youtube.googleapis.com/".into(),
+            root_url: "https://youtube.googleapis.com/".into(),
+        }
+    }
+
+    /// Provide the base URL of this API. The returned URL is guaranteed to end with a '/'.
+    fn base_url(&self) -> String {
+        if self.base_url.ends_with("/") {
+            return self.base_url.clone();
+        }
+        return self.base_url.clone() + "/";
+    }
+    /// Provide the root URL of this API. The returned URL is guaranteed to end with a '/'.
+    fn root_url(&self) -> String {
+        if self.root_url.ends_with("/") {
+            return self.root_url.clone();
+        }
+        return self.root_url.clone();
+    }
+    /// Returns appropriate URLs for relative and absolute paths.
+    fn format_path(&self, path: &str) -> String {
+        if path.starts_with("/") {
+            return self.root_url().trim_end_matches("/").to_string() + path;
+        } else {
+            return self.base_url() + path;
+        }
+    }
+
+    #[cfg(test)]
+    /// Override API URLs. `base` is the base path relative to which (relative) method paths are interpreted,
+    /// whereas `root` is the URL relative to which absolute paths are interpreted.
+    pub fn set_urls(&mut self, base: String, root: String) {
+        self.base_url = base;
+        self.root_url = root;
+    }
+
+    /// Explicitly select which scopes should be requested for authorization. Otherwise,
+    /// a possibly too large scope will be requested.
+    ///
+    /// It is most convenient to supply a vec or slice of YoutubeScopes enum values.
+    pub fn set_scopes<S: AsRef<str>, T: AsRef<[S]>>(&mut self, scopes: T) {
+        self.scopes = scopes
+            .as_ref()
+            .into_iter()
+            .map(|s| s.as_ref().to_string())
+            .collect();
+    }
+
+    /// Retrieves a list of all pricing levels offered by a creator to the fans.
+    pub async fn list(
+        &self,
+        params: &MembershipsLevelsListParams,
+    ) -> Result<MembershipsLevelListResponse> {
+        let rel_path = format!("youtube/v3/membershipsLevels",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[YoutubeScopes::YoutubeChannelMembershipsCreator
+                .as_ref()
+                .to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref api_params) = &params.youtube_params {
+            url_params.push_str(&format!("{}", api_params));
+        }
+
+        let full_uri = path + &url_params;
+
+        let opt_request: Option<&EmptyRequest> = None;
+        do_request(&self.client, &full_uri, &headers, "GET", opt_request).await
+    }
+}
+
+/// The Youtube PlaylistItems service represents the PlaylistItems resource.
+pub struct PlaylistItemsService {
+    client: TlsClient,
+    authenticator: Box<dyn 'static + DerefAuth>,
+    scopes: Vec<String>,
+
+    base_url: String,
+    root_url: String,
+}
+
+impl PlaylistItemsService {
+    /// Create a new PlaylistItemsService object. The easiest way to call this is wrapping the Authenticator
+    /// into an `Arc`: `new(client.clone(), Arc::new(authenticator))`.
+    /// This way, one authenticator can be shared among several services.
+    pub fn new<A: 'static + DerefAuth>(client: TlsClient, auth: A) -> PlaylistItemsService {
+        PlaylistItemsService {
             client: client,
             authenticator: Box::new(auth),
             scopes: vec![],
@@ -17147,19 +18081,48 @@
             .collect();
     }
 
+    /// Deletes a resource.
+    pub async fn delete(&self, params: &PlaylistItemsDeleteParams) -> Result<()> {
+        let rel_path = format!("youtube/v3/playlistItems",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref api_params) = &params.youtube_params {
+            url_params.push_str(&format!("{}", api_params));
+        }
+
+        let full_uri = path + &url_params;
+
+        let opt_request: Option<&EmptyRequest> = None;
+        do_request(&self.client, &full_uri, &headers, "DELETE", opt_request).await
+    }
+
     /// Inserts a new resource into this collection.
     pub async fn insert(
         &self,
-        params: &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()];
+        params: &PlaylistItemsInsertParams,
+        req: &PlaylistItem,
+    ) -> Result<PlaylistItem> {
+        let rel_path = format!("youtube/v3/playlistItems",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
             tok = self.authenticator.token(scopes).await?;
         } else {
             tok = self.authenticator.token(&self.scopes).await?;
@@ -17180,6 +18143,255 @@
         let opt_request = Some(req);
         do_request(&self.client, &full_uri, &headers, "POST", opt_request).await
     }
+
+    /// Retrieves a list of resources, possibly filtered.
+    pub async fn list(&self, params: &PlaylistItemsListParams) -> Result<PlaylistItemListResponse> {
+        let rel_path = format!("youtube/v3/playlistItems",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref api_params) = &params.youtube_params {
+            url_params.push_str(&format!("{}", api_params));
+        }
+
+        let full_uri = path + &url_params;
+
+        let opt_request: Option<&EmptyRequest> = None;
+        do_request(&self.client, &full_uri, &headers, "GET", opt_request).await
+    }
+
+    /// Updates an existing resource.
+    pub async fn update(
+        &self,
+        params: &PlaylistItemsUpdateParams,
+        req: &PlaylistItem,
+    ) -> Result<PlaylistItem> {
+        let rel_path = format!("youtube/v3/playlistItems",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref api_params) = &params.youtube_params {
+            url_params.push_str(&format!("{}", api_params));
+        }
+
+        let full_uri = path + &url_params;
+
+        let opt_request: Option<&EmptyRequest> = None;
+        let opt_request = Some(req);
+        do_request(&self.client, &full_uri, &headers, "PUT", opt_request).await
+    }
+}
+
+/// The Youtube Playlists service represents the Playlists resource.
+pub struct PlaylistsService {
+    client: TlsClient,
+    authenticator: Box<dyn 'static + DerefAuth>,
+    scopes: Vec<String>,
+
+    base_url: String,
+    root_url: String,
+}
+
+impl PlaylistsService {
+    /// Create a new PlaylistsService object. The easiest way to call this is wrapping the Authenticator
+    /// into an `Arc`: `new(client.clone(), Arc::new(authenticator))`.
+    /// This way, one authenticator can be shared among several services.
+    pub fn new<A: 'static + DerefAuth>(client: TlsClient, auth: A) -> PlaylistsService {
+        PlaylistsService {
+            client: client,
+            authenticator: Box::new(auth),
+            scopes: vec![],
+            base_url: "https://youtube.googleapis.com/".into(),
+            root_url: "https://youtube.googleapis.com/".into(),
+        }
+    }
+
+    /// Provide the base URL of this API. The returned URL is guaranteed to end with a '/'.
+    fn base_url(&self) -> String {
+        if self.base_url.ends_with("/") {
+            return self.base_url.clone();
+        }
+        return self.base_url.clone() + "/";
+    }
+    /// Provide the root URL of this API. The returned URL is guaranteed to end with a '/'.
+    fn root_url(&self) -> String {
+        if self.root_url.ends_with("/") {
+            return self.root_url.clone();
+        }
+        return self.root_url.clone();
+    }
+    /// Returns appropriate URLs for relative and absolute paths.
+    fn format_path(&self, path: &str) -> String {
+        if path.starts_with("/") {
+            return self.root_url().trim_end_matches("/").to_string() + path;
+        } else {
+            return self.base_url() + path;
+        }
+    }
+
+    #[cfg(test)]
+    /// Override API URLs. `base` is the base path relative to which (relative) method paths are interpreted,
+    /// whereas `root` is the URL relative to which absolute paths are interpreted.
+    pub fn set_urls(&mut self, base: String, root: String) {
+        self.base_url = base;
+        self.root_url = root;
+    }
+
+    /// Explicitly select which scopes should be requested for authorization. Otherwise,
+    /// a possibly too large scope will be requested.
+    ///
+    /// It is most convenient to supply a vec or slice of YoutubeScopes enum values.
+    pub fn set_scopes<S: AsRef<str>, T: AsRef<[S]>>(&mut self, scopes: T) {
+        self.scopes = scopes
+            .as_ref()
+            .into_iter()
+            .map(|s| s.as_ref().to_string())
+            .collect();
+    }
+
+    /// Deletes a resource.
+    pub async fn delete(&self, params: &PlaylistsDeleteParams) -> Result<()> {
+        let rel_path = format!("youtube/v3/playlists",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref api_params) = &params.youtube_params {
+            url_params.push_str(&format!("{}", api_params));
+        }
+
+        let full_uri = path + &url_params;
+
+        let opt_request: Option<&EmptyRequest> = None;
+        do_request(&self.client, &full_uri, &headers, "DELETE", opt_request).await
+    }
+
+    /// Inserts a new resource into this collection.
+    pub async fn insert(&self, params: &PlaylistsInsertParams, req: &Playlist) -> Result<Playlist> {
+        let rel_path = format!("youtube/v3/playlists",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref api_params) = &params.youtube_params {
+            url_params.push_str(&format!("{}", api_params));
+        }
+
+        let full_uri = path + &url_params;
+
+        let opt_request: Option<&EmptyRequest> = None;
+        let opt_request = Some(req);
+        do_request(&self.client, &full_uri, &headers, "POST", opt_request).await
+    }
+
+    /// Retrieves a list of resources, possibly filtered.
+    pub async fn list(&self, params: &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
+    }
+
+    /// Updates an existing resource.
+    pub async fn update(&self, params: &PlaylistsUpdateParams, req: &Playlist) -> Result<Playlist> {
+        let rel_path = format!("youtube/v3/playlists",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref api_params) = &params.youtube_params {
+            url_params.push_str(&format!("{}", api_params));
+        }
+
+        let full_uri = path + &url_params;
+
+        let opt_request: Option<&EmptyRequest> = None;
+        let opt_request = Some(req);
+        do_request(&self.client, &full_uri, &headers, "PUT", opt_request).await
+    }
 }
 
 /// The Youtube Search service represents the Search resource.
@@ -17279,6 +18491,266 @@
     }
 }
 
+/// The Youtube Subscriptions service represents the Subscriptions resource.
+pub struct SubscriptionsService {
+    client: TlsClient,
+    authenticator: Box<dyn 'static + DerefAuth>,
+    scopes: Vec<String>,
+
+    base_url: String,
+    root_url: String,
+}
+
+impl SubscriptionsService {
+    /// Create a new SubscriptionsService object. The easiest way to call this is wrapping the Authenticator
+    /// into an `Arc`: `new(client.clone(), Arc::new(authenticator))`.
+    /// This way, one authenticator can be shared among several services.
+    pub fn new<A: 'static + DerefAuth>(client: TlsClient, auth: A) -> SubscriptionsService {
+        SubscriptionsService {
+            client: client,
+            authenticator: Box::new(auth),
+            scopes: vec![],
+            base_url: "https://youtube.googleapis.com/".into(),
+            root_url: "https://youtube.googleapis.com/".into(),
+        }
+    }
+
+    /// Provide the base URL of this API. The returned URL is guaranteed to end with a '/'.
+    fn base_url(&self) -> String {
+        if self.base_url.ends_with("/") {
+            return self.base_url.clone();
+        }
+        return self.base_url.clone() + "/";
+    }
+    /// Provide the root URL of this API. The returned URL is guaranteed to end with a '/'.
+    fn root_url(&self) -> String {
+        if self.root_url.ends_with("/") {
+            return self.root_url.clone();
+        }
+        return self.root_url.clone();
+    }
+    /// Returns appropriate URLs for relative and absolute paths.
+    fn format_path(&self, path: &str) -> String {
+        if path.starts_with("/") {
+            return self.root_url().trim_end_matches("/").to_string() + path;
+        } else {
+            return self.base_url() + path;
+        }
+    }
+
+    #[cfg(test)]
+    /// Override API URLs. `base` is the base path relative to which (relative) method paths are interpreted,
+    /// whereas `root` is the URL relative to which absolute paths are interpreted.
+    pub fn set_urls(&mut self, base: String, root: String) {
+        self.base_url = base;
+        self.root_url = root;
+    }
+
+    /// Explicitly select which scopes should be requested for authorization. Otherwise,
+    /// a possibly too large scope will be requested.
+    ///
+    /// It is most convenient to supply a vec or slice of YoutubeScopes enum values.
+    pub fn set_scopes<S: AsRef<str>, T: AsRef<[S]>>(&mut self, scopes: T) {
+        self.scopes = scopes
+            .as_ref()
+            .into_iter()
+            .map(|s| s.as_ref().to_string())
+            .collect();
+    }
+
+    /// Deletes a resource.
+    pub async fn delete(&self, params: &SubscriptionsDeleteParams) -> Result<()> {
+        let rel_path = format!("youtube/v3/subscriptions",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref api_params) = &params.youtube_params {
+            url_params.push_str(&format!("{}", api_params));
+        }
+
+        let full_uri = path + &url_params;
+
+        let opt_request: Option<&EmptyRequest> = None;
+        do_request(&self.client, &full_uri, &headers, "DELETE", opt_request).await
+    }
+
+    /// Inserts a new resource into this collection.
+    pub async fn insert(
+        &self,
+        params: &SubscriptionsInsertParams,
+        req: &Subscription,
+    ) -> Result<Subscription> {
+        let rel_path = format!("youtube/v3/subscriptions",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref api_params) = &params.youtube_params {
+            url_params.push_str(&format!("{}", api_params));
+        }
+
+        let full_uri = path + &url_params;
+
+        let opt_request: Option<&EmptyRequest> = None;
+        let opt_request = Some(req);
+        do_request(&self.client, &full_uri, &headers, "POST", opt_request).await
+    }
+
+    /// Retrieves a list of resources, possibly filtered.
+    pub async fn list(&self, params: &SubscriptionsListParams) -> Result<SubscriptionListResponse> {
+        let rel_path = format!("youtube/v3/subscriptions",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref api_params) = &params.youtube_params {
+            url_params.push_str(&format!("{}", api_params));
+        }
+
+        let full_uri = path + &url_params;
+
+        let opt_request: Option<&EmptyRequest> = None;
+        do_request(&self.client, &full_uri, &headers, "GET", opt_request).await
+    }
+}
+
+/// The Youtube SuperChatEvents service represents the SuperChatEvents resource.
+pub struct SuperChatEventsService {
+    client: TlsClient,
+    authenticator: Box<dyn 'static + DerefAuth>,
+    scopes: Vec<String>,
+
+    base_url: String,
+    root_url: String,
+}
+
+impl SuperChatEventsService {
+    /// Create a new SuperChatEventsService object. The easiest way to call this is wrapping the Authenticator
+    /// into an `Arc`: `new(client.clone(), Arc::new(authenticator))`.
+    /// This way, one authenticator can be shared among several services.
+    pub fn new<A: 'static + DerefAuth>(client: TlsClient, auth: A) -> SuperChatEventsService {
+        SuperChatEventsService {
+            client: client,
+            authenticator: Box::new(auth),
+            scopes: vec![],
+            base_url: "https://youtube.googleapis.com/".into(),
+            root_url: "https://youtube.googleapis.com/".into(),
+        }
+    }
+
+    /// Provide the base URL of this API. The returned URL is guaranteed to end with a '/'.
+    fn base_url(&self) -> String {
+        if self.base_url.ends_with("/") {
+            return self.base_url.clone();
+        }
+        return self.base_url.clone() + "/";
+    }
+    /// Provide the root URL of this API. The returned URL is guaranteed to end with a '/'.
+    fn root_url(&self) -> String {
+        if self.root_url.ends_with("/") {
+            return self.root_url.clone();
+        }
+        return self.root_url.clone();
+    }
+    /// Returns appropriate URLs for relative and absolute paths.
+    fn format_path(&self, path: &str) -> String {
+        if path.starts_with("/") {
+            return self.root_url().trim_end_matches("/").to_string() + path;
+        } else {
+            return self.base_url() + path;
+        }
+    }
+
+    #[cfg(test)]
+    /// Override API URLs. `base` is the base path relative to which (relative) method paths are interpreted,
+    /// whereas `root` is the URL relative to which absolute paths are interpreted.
+    pub fn set_urls(&mut self, base: String, root: String) {
+        self.base_url = base;
+        self.root_url = root;
+    }
+
+    /// Explicitly select which scopes should be requested for authorization. Otherwise,
+    /// a possibly too large scope will be requested.
+    ///
+    /// It is most convenient to supply a vec or slice of YoutubeScopes enum values.
+    pub fn set_scopes<S: AsRef<str>, T: AsRef<[S]>>(&mut self, scopes: T) {
+        self.scopes = scopes
+            .as_ref()
+            .into_iter()
+            .map(|s| s.as_ref().to_string())
+            .collect();
+    }
+
+    /// Retrieves a list of resources, possibly filtered.
+    pub async fn list(
+        &self,
+        params: &SuperChatEventsListParams,
+    ) -> Result<SuperChatEventListResponse> {
+        let rel_path = format!("youtube/v3/superChatEvents",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[YoutubeScopes::YoutubeReadonly.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref api_params) = &params.youtube_params {
+            url_params.push_str(&format!("{}", api_params));
+        }
+
+        let full_uri = path + &url_params;
+
+        let opt_request: Option<&EmptyRequest> = None;
+        do_request(&self.client, &full_uri, &headers, "GET", opt_request).await
+    }
+}
+
 /// The Youtube Tests service represents the Tests resource.
 pub struct TestsService {
     client: TlsClient,
@@ -17527,1597 +18999,6 @@
     }
 }
 
-/// The Youtube LiveStreams service represents the LiveStreams resource.
-pub struct LiveStreamsService {
-    client: TlsClient,
-    authenticator: Box<dyn 'static + DerefAuth>,
-    scopes: Vec<String>,
-
-    base_url: String,
-    root_url: String,
-}
-
-impl LiveStreamsService {
-    /// Create a new LiveStreamsService object. The easiest way to call this is wrapping the Authenticator
-    /// into an `Arc`: `new(client.clone(), Arc::new(authenticator))`.
-    /// This way, one authenticator can be shared among several services.
-    pub fn new<A: 'static + DerefAuth>(client: TlsClient, auth: A) -> LiveStreamsService {
-        LiveStreamsService {
-            client: client,
-            authenticator: Box::new(auth),
-            scopes: vec![],
-            base_url: "https://youtube.googleapis.com/".into(),
-            root_url: "https://youtube.googleapis.com/".into(),
-        }
-    }
-
-    /// Provide the base URL of this API. The returned URL is guaranteed to end with a '/'.
-    fn base_url(&self) -> String {
-        if self.base_url.ends_with("/") {
-            return self.base_url.clone();
-        }
-        return self.base_url.clone() + "/";
-    }
-    /// Provide the root URL of this API. The returned URL is guaranteed to end with a '/'.
-    fn root_url(&self) -> String {
-        if self.root_url.ends_with("/") {
-            return self.root_url.clone();
-        }
-        return self.root_url.clone();
-    }
-    /// Returns appropriate URLs for relative and absolute paths.
-    fn format_path(&self, path: &str) -> String {
-        if path.starts_with("/") {
-            return self.root_url().trim_end_matches("/").to_string() + path;
-        } else {
-            return self.base_url() + path;
-        }
-    }
-
-    #[cfg(test)]
-    /// Override API URLs. `base` is the base path relative to which (relative) method paths are interpreted,
-    /// whereas `root` is the URL relative to which absolute paths are interpreted.
-    pub fn set_urls(&mut self, base: String, root: String) {
-        self.base_url = base;
-        self.root_url = root;
-    }
-
-    /// Explicitly select which scopes should be requested for authorization. Otherwise,
-    /// a possibly too large scope will be requested.
-    ///
-    /// It is most convenient to supply a vec or slice of YoutubeScopes enum values.
-    pub fn set_scopes<S: AsRef<str>, T: AsRef<[S]>>(&mut self, scopes: T) {
-        self.scopes = scopes
-            .as_ref()
-            .into_iter()
-            .map(|s| s.as_ref().to_string())
-            .collect();
-    }
-
-    /// Retrieve the list of streams associated with the given channel. --
-    pub async fn list(&self, params: &LiveStreamsListParams) -> Result<LiveStreamListResponse> {
-        let rel_path = format!("youtube/v3/liveStreams",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::YoutubeReadonly.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.youtube_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-
-        let opt_request: Option<&EmptyRequest> = None;
-        do_request(&self.client, &full_uri, &headers, "GET", opt_request).await
-    }
-
-    /// Updates an existing stream for the authenticated user.
-    pub async fn update(
-        &self,
-        params: &LiveStreamsUpdateParams,
-        req: &LiveStream,
-    ) -> Result<LiveStream> {
-        let rel_path = format!("youtube/v3/liveStreams",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::YoutubeForceSsl.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.youtube_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-
-        let opt_request: Option<&EmptyRequest> = None;
-        let opt_request = Some(req);
-        do_request(&self.client, &full_uri, &headers, "PUT", opt_request).await
-    }
-
-    /// Deletes an existing stream for the authenticated user.
-    pub async fn delete(&self, params: &LiveStreamsDeleteParams) -> Result<()> {
-        let rel_path = format!("youtube/v3/liveStreams",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::YoutubeForceSsl.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.youtube_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-
-        let opt_request: Option<&EmptyRequest> = None;
-        do_request(&self.client, &full_uri, &headers, "DELETE", opt_request).await
-    }
-
-    /// Inserts a new stream for the authenticated user.
-    pub async fn insert(
-        &self,
-        params: &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
-    }
-}
-
-/// The Youtube Activities service represents the Activities resource.
-pub struct ActivitiesService {
-    client: TlsClient,
-    authenticator: Box<dyn 'static + DerefAuth>,
-    scopes: Vec<String>,
-
-    base_url: String,
-    root_url: String,
-}
-
-impl ActivitiesService {
-    /// Create a new ActivitiesService object. The easiest way to call this is wrapping the Authenticator
-    /// into an `Arc`: `new(client.clone(), Arc::new(authenticator))`.
-    /// This way, one authenticator can be shared among several services.
-    pub fn new<A: 'static + DerefAuth>(client: TlsClient, auth: A) -> ActivitiesService {
-        ActivitiesService {
-            client: client,
-            authenticator: Box::new(auth),
-            scopes: vec![],
-            base_url: "https://youtube.googleapis.com/".into(),
-            root_url: "https://youtube.googleapis.com/".into(),
-        }
-    }
-
-    /// Provide the base URL of this API. The returned URL is guaranteed to end with a '/'.
-    fn base_url(&self) -> String {
-        if self.base_url.ends_with("/") {
-            return self.base_url.clone();
-        }
-        return self.base_url.clone() + "/";
-    }
-    /// Provide the root URL of this API. The returned URL is guaranteed to end with a '/'.
-    fn root_url(&self) -> String {
-        if self.root_url.ends_with("/") {
-            return self.root_url.clone();
-        }
-        return self.root_url.clone();
-    }
-    /// Returns appropriate URLs for relative and absolute paths.
-    fn format_path(&self, path: &str) -> String {
-        if path.starts_with("/") {
-            return self.root_url().trim_end_matches("/").to_string() + path;
-        } else {
-            return self.base_url() + path;
-        }
-    }
-
-    #[cfg(test)]
-    /// Override API URLs. `base` is the base path relative to which (relative) method paths are interpreted,
-    /// whereas `root` is the URL relative to which absolute paths are interpreted.
-    pub fn set_urls(&mut self, base: String, root: String) {
-        self.base_url = base;
-        self.root_url = root;
-    }
-
-    /// Explicitly select which scopes should be requested for authorization. Otherwise,
-    /// a possibly too large scope will be requested.
-    ///
-    /// It is most convenient to supply a vec or slice of YoutubeScopes enum values.
-    pub fn set_scopes<S: AsRef<str>, T: AsRef<[S]>>(&mut self, scopes: T) {
-        self.scopes = scopes
-            .as_ref()
-            .into_iter()
-            .map(|s| s.as_ref().to_string())
-            .collect();
-    }
-
-    /// Retrieves a list of resources, possibly filtered.
-    pub async fn list(&self, params: &ActivitiesListParams) -> Result<ActivityListResponse> {
-        let rel_path = format!("youtube/v3/activities",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::YoutubeReadonly.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.youtube_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-
-        let opt_request: Option<&EmptyRequest> = None;
-        do_request(&self.client, &full_uri, &headers, "GET", opt_request).await
-    }
-}
-
-/// The Youtube LiveBroadcasts service represents the LiveBroadcasts resource.
-pub struct LiveBroadcastsService {
-    client: TlsClient,
-    authenticator: Box<dyn 'static + DerefAuth>,
-    scopes: Vec<String>,
-
-    base_url: String,
-    root_url: String,
-}
-
-impl LiveBroadcastsService {
-    /// Create a new LiveBroadcastsService object. The easiest way to call this is wrapping the Authenticator
-    /// into an `Arc`: `new(client.clone(), Arc::new(authenticator))`.
-    /// This way, one authenticator can be shared among several services.
-    pub fn new<A: 'static + DerefAuth>(client: TlsClient, auth: A) -> LiveBroadcastsService {
-        LiveBroadcastsService {
-            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();
-    }
-
-    /// Delete a given broadcast.
-    pub async fn delete(&self, params: &LiveBroadcastsDeleteParams) -> Result<()> {
-        let rel_path = format!("youtube/v3/liveBroadcasts",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::YoutubeForceSsl.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.youtube_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-
-        let opt_request: Option<&EmptyRequest> = None;
-        do_request(&self.client, &full_uri, &headers, "DELETE", opt_request).await
-    }
-
-    /// Transition a broadcast to a given status.
-    pub async fn transition(
-        &self,
-        params: &LiveBroadcastsTransitionParams,
-    ) -> Result<LiveBroadcast> {
-        let rel_path = format!("youtube/v3/liveBroadcasts/transition",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::YoutubeForceSsl.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.youtube_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-
-        let opt_request: Option<&EmptyRequest> = None;
-        do_request(&self.client, &full_uri, &headers, "POST", opt_request).await
-    }
-
-    /// Retrieve the list of broadcasts associated with the given channel.
-    pub async fn list(
-        &self,
-        params: &LiveBroadcastsListParams,
-    ) -> Result<LiveBroadcastListResponse> {
-        let rel_path = format!("youtube/v3/liveBroadcasts",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::YoutubeReadonly.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.youtube_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-
-        let opt_request: Option<&EmptyRequest> = None;
-        do_request(&self.client, &full_uri, &headers, "GET", opt_request).await
-    }
-
-    /// Bind a broadcast to a stream.
-    pub async fn bind(&self, params: &LiveBroadcastsBindParams) -> Result<LiveBroadcast> {
-        let rel_path = format!("youtube/v3/liveBroadcasts/bind",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::YoutubeForceSsl.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.youtube_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-
-        let opt_request: Option<&EmptyRequest> = None;
-        do_request(&self.client, &full_uri, &headers, "POST", opt_request).await
-    }
-
-    /// Inserts a new stream for the authenticated user.
-    pub async fn insert(
-        &self,
-        params: &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
-    }
-
-    /// Updates an existing broadcast for the authenticated user.
-    pub async fn update(
-        &self,
-        params: &LiveBroadcastsUpdateParams,
-        req: &LiveBroadcast,
-    ) -> Result<LiveBroadcast> {
-        let rel_path = format!("youtube/v3/liveBroadcasts",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::YoutubeForceSsl.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.youtube_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-
-        let opt_request: Option<&EmptyRequest> = None;
-        let opt_request = Some(req);
-        do_request(&self.client, &full_uri, &headers, "PUT", opt_request).await
-    }
-}
-
-/// The Youtube Captions service represents the Captions resource.
-pub struct CaptionsService {
-    client: TlsClient,
-    authenticator: Box<dyn 'static + DerefAuth>,
-    scopes: Vec<String>,
-
-    base_url: String,
-    root_url: String,
-}
-
-impl CaptionsService {
-    /// Create a new CaptionsService object. The easiest way to call this is wrapping the Authenticator
-    /// into an `Arc`: `new(client.clone(), Arc::new(authenticator))`.
-    /// This way, one authenticator can be shared among several services.
-    pub fn new<A: 'static + DerefAuth>(client: TlsClient, auth: A) -> CaptionsService {
-        CaptionsService {
-            client: client,
-            authenticator: Box::new(auth),
-            scopes: vec![],
-            base_url: "https://youtube.googleapis.com/".into(),
-            root_url: "https://youtube.googleapis.com/".into(),
-        }
-    }
-
-    /// Provide the base URL of this API. The returned URL is guaranteed to end with a '/'.
-    fn base_url(&self) -> String {
-        if self.base_url.ends_with("/") {
-            return self.base_url.clone();
-        }
-        return self.base_url.clone() + "/";
-    }
-    /// Provide the root URL of this API. The returned URL is guaranteed to end with a '/'.
-    fn root_url(&self) -> String {
-        if self.root_url.ends_with("/") {
-            return self.root_url.clone();
-        }
-        return self.root_url.clone();
-    }
-    /// Returns appropriate URLs for relative and absolute paths.
-    fn format_path(&self, path: &str) -> String {
-        if path.starts_with("/") {
-            return self.root_url().trim_end_matches("/").to_string() + path;
-        } else {
-            return self.base_url() + path;
-        }
-    }
-
-    #[cfg(test)]
-    /// Override API URLs. `base` is the base path relative to which (relative) method paths are interpreted,
-    /// whereas `root` is the URL relative to which absolute paths are interpreted.
-    pub fn set_urls(&mut self, base: String, root: String) {
-        self.base_url = base;
-        self.root_url = root;
-    }
-
-    /// Explicitly select which scopes should be requested for authorization. Otherwise,
-    /// a possibly too large scope will be requested.
-    ///
-    /// It is most convenient to supply a vec or slice of YoutubeScopes enum values.
-    pub fn set_scopes<S: AsRef<str>, T: AsRef<[S]>>(&mut self, scopes: T) {
-        self.scopes = scopes
-            .as_ref()
-            .into_iter()
-            .map(|s| s.as_ref().to_string())
-            .collect();
-    }
-
-    /// Deletes a resource.
-    pub async fn delete(&self, params: &CaptionsDeleteParams) -> Result<()> {
-        let rel_path = format!("youtube/v3/captions",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.youtube_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-
-        let opt_request: Option<&EmptyRequest> = None;
-        do_request(&self.client, &full_uri, &headers, "DELETE", opt_request).await
-    }
-
-    /// Updates an existing resource.
-    pub async fn update(&self, params: &CaptionsUpdateParams, req: &Caption) -> Result<Caption> {
-        let rel_path = format!("youtube/v3/captions",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.youtube_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-
-        let opt_request: Option<&EmptyRequest> = None;
-        let opt_request = Some(req);
-        do_request(&self.client, &full_uri, &headers, "PUT", opt_request).await
-    }
-
-    /// Updates an existing resource.
-    ///
-    /// This method is a variant of `update()`, taking data for upload. It performs a multipart upload.
-    pub async fn update_upload(
-        &self,
-        params: &CaptionsUpdateParams,
-        req: &Caption,
-        data: hyper::body::Bytes,
-    ) -> Result<Caption> {
-        let rel_path = format!("/upload/youtube/v3/captions",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?uploadType=multipart{params}", params = params);
-
-        if let Some(ref api_params) = &params.youtube_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-        let opt_request: Option<&EmptyRequest> = None;
-        let opt_request = Some(req);
-
-        do_upload_multipart(&self.client, &full_uri, &headers, "PUT", opt_request, data).await
-    }
-
-    /// Updates an existing resource.
-    ///
-    /// This method is a variant of `update()`, taking data for upload.
-    /// It returns a `ResumableUpload` upload manager which you can use to stream larger amounts
-    /// of data to the API. The result of this call will be returned by the `ResumableUpload` method
-    /// you choose for the upload.
-    pub async fn update_resumable_upload<'client>(
-        &'client self,
-        params: &CaptionsUpdateParams,
-        req: &Caption,
-    ) -> Result<ResumableUpload<'client, Caption>> {
-        let rel_path = format!("/resumable/upload/youtube/v3/captions",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?uploadType=resumable{params}", params = params);
-        if let Some(ref api_params) = &params.youtube_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-
-        let opt_request: Option<&EmptyRequest> = None;
-        let opt_request = Some(req);
-        let (_resp, headers): (EmptyResponse, hyper::HeaderMap) =
-            do_request_with_headers(&self.client, &full_uri, &headers, "PUT", opt_request).await?;
-        if let Some(dest) = headers.get(hyper::header::LOCATION) {
-            use std::convert::TryFrom;
-            Ok(ResumableUpload::new(
-                hyper::Uri::try_from(dest.to_str()?)?,
-                &self.client,
-                5 * 1024 * 1024,
-            ))
-        } else {
-            Err(Error::from(ApiError::RedirectError(format!(
-                "Resumable upload response didn't contain Location: {:?}",
-                headers
-            )))
-            .context(format!("{:?}", headers)))?
-        }
-    }
-
-    /// Inserts a new resource into this collection.
-    pub async fn insert(&self, params: &CaptionsInsertParams, req: &Caption) -> Result<Caption> {
-        let rel_path = format!("youtube/v3/captions",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.youtube_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-
-        let opt_request: Option<&EmptyRequest> = None;
-        let opt_request = Some(req);
-        do_request(&self.client, &full_uri, &headers, "POST", opt_request).await
-    }
-
-    /// Inserts a new resource into this collection.
-    ///
-    /// This method is a variant of `insert()`, taking data for upload. It performs a multipart upload.
-    pub async fn insert_upload(
-        &self,
-        params: &CaptionsInsertParams,
-        req: &Caption,
-        data: hyper::body::Bytes,
-    ) -> Result<Caption> {
-        let rel_path = format!("/upload/youtube/v3/captions",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?uploadType=multipart{params}", params = params);
-
-        if let Some(ref api_params) = &params.youtube_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-        let opt_request: Option<&EmptyRequest> = None;
-        let opt_request = Some(req);
-
-        do_upload_multipart(&self.client, &full_uri, &headers, "POST", opt_request, data).await
-    }
-
-    /// Inserts a new resource into this collection.
-    ///
-    /// This method is a variant of `insert()`, taking data for upload.
-    /// It returns a `ResumableUpload` upload manager which you can use to stream larger amounts
-    /// of data to the API. The result of this call will be returned by the `ResumableUpload` method
-    /// you choose for the upload.
-    pub async fn insert_resumable_upload<'client>(
-        &'client self,
-        params: &CaptionsInsertParams,
-        req: &Caption,
-    ) -> Result<ResumableUpload<'client, Caption>> {
-        let rel_path = format!("/resumable/upload/youtube/v3/captions",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?uploadType=resumable{params}", params = params);
-        if let Some(ref api_params) = &params.youtube_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-
-        let opt_request: Option<&EmptyRequest> = None;
-        let opt_request = Some(req);
-        let (_resp, headers): (EmptyResponse, hyper::HeaderMap) =
-            do_request_with_headers(&self.client, &full_uri, &headers, "POST", opt_request).await?;
-        if let Some(dest) = headers.get(hyper::header::LOCATION) {
-            use std::convert::TryFrom;
-            Ok(ResumableUpload::new(
-                hyper::Uri::try_from(dest.to_str()?)?,
-                &self.client,
-                5 * 1024 * 1024,
-            ))
-        } else {
-            Err(Error::from(ApiError::RedirectError(format!(
-                "Resumable upload response didn't contain Location: {:?}",
-                headers
-            )))
-            .context(format!("{:?}", headers)))?
-        }
-    }
-
-    /// Downloads a caption track.
-    ///
-    /// This method potentially downloads data. See documentation of `Download`.
-    pub async fn download<'a>(
-        &'a self,
-        params: &CaptionsDownloadParams,
-    ) -> Result<Download<'a, EmptyRequest, ()>> {
-        let rel_path = format!(
-            "youtube/v3/captions/{id}",
-            id = percent_encode(format!("{}", params.id).as_bytes(), NON_ALPHANUMERIC)
-        );
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.youtube_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-        let opt_request: Option<&EmptyRequest> = None;
-
-        do_download(&self.client, &full_uri, headers, "GET".into(), opt_request).await
-    }
-
-    /// Retrieves a list of resources, possibly filtered.
-    pub async fn list(&self, params: &CaptionsListParams) -> Result<CaptionListResponse> {
-        let rel_path = format!("youtube/v3/captions",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.youtube_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-
-        let opt_request: Option<&EmptyRequest> = None;
-        do_request(&self.client, &full_uri, &headers, "GET", opt_request).await
-    }
-}
-
-/// The Youtube I18nRegions service represents the I18nRegions resource.
-pub struct I18nRegionsService {
-    client: TlsClient,
-    authenticator: Box<dyn 'static + DerefAuth>,
-    scopes: Vec<String>,
-
-    base_url: String,
-    root_url: String,
-}
-
-impl I18nRegionsService {
-    /// Create a new I18nRegionsService object. The easiest way to call this is wrapping the Authenticator
-    /// into an `Arc`: `new(client.clone(), Arc::new(authenticator))`.
-    /// This way, one authenticator can be shared among several services.
-    pub fn new<A: 'static + DerefAuth>(client: TlsClient, auth: A) -> I18nRegionsService {
-        I18nRegionsService {
-            client: client,
-            authenticator: Box::new(auth),
-            scopes: vec![],
-            base_url: "https://youtube.googleapis.com/".into(),
-            root_url: "https://youtube.googleapis.com/".into(),
-        }
-    }
-
-    /// Provide the base URL of this API. The returned URL is guaranteed to end with a '/'.
-    fn base_url(&self) -> String {
-        if self.base_url.ends_with("/") {
-            return self.base_url.clone();
-        }
-        return self.base_url.clone() + "/";
-    }
-    /// Provide the root URL of this API. The returned URL is guaranteed to end with a '/'.
-    fn root_url(&self) -> String {
-        if self.root_url.ends_with("/") {
-            return self.root_url.clone();
-        }
-        return self.root_url.clone();
-    }
-    /// Returns appropriate URLs for relative and absolute paths.
-    fn format_path(&self, path: &str) -> String {
-        if path.starts_with("/") {
-            return self.root_url().trim_end_matches("/").to_string() + path;
-        } else {
-            return self.base_url() + path;
-        }
-    }
-
-    #[cfg(test)]
-    /// Override API URLs. `base` is the base path relative to which (relative) method paths are interpreted,
-    /// whereas `root` is the URL relative to which absolute paths are interpreted.
-    pub fn set_urls(&mut self, base: String, root: String) {
-        self.base_url = base;
-        self.root_url = root;
-    }
-
-    /// Explicitly select which scopes should be requested for authorization. Otherwise,
-    /// a possibly too large scope will be requested.
-    ///
-    /// It is most convenient to supply a vec or slice of YoutubeScopes enum values.
-    pub fn set_scopes<S: AsRef<str>, T: AsRef<[S]>>(&mut self, scopes: T) {
-        self.scopes = scopes
-            .as_ref()
-            .into_iter()
-            .map(|s| s.as_ref().to_string())
-            .collect();
-    }
-
-    /// Retrieves a list of resources, possibly filtered.
-    pub async fn list(&self, params: &I18nRegionsListParams) -> Result<I18nRegionListResponse> {
-        let rel_path = format!("youtube/v3/i18nRegions",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.youtube_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-
-        let opt_request: Option<&EmptyRequest> = None;
-        do_request(&self.client, &full_uri, &headers, "GET", opt_request).await
-    }
-}
-
-/// The Youtube Subscriptions service represents the Subscriptions resource.
-pub struct SubscriptionsService {
-    client: TlsClient,
-    authenticator: Box<dyn 'static + DerefAuth>,
-    scopes: Vec<String>,
-
-    base_url: String,
-    root_url: String,
-}
-
-impl SubscriptionsService {
-    /// Create a new SubscriptionsService object. The easiest way to call this is wrapping the Authenticator
-    /// into an `Arc`: `new(client.clone(), Arc::new(authenticator))`.
-    /// This way, one authenticator can be shared among several services.
-    pub fn new<A: 'static + DerefAuth>(client: TlsClient, auth: A) -> SubscriptionsService {
-        SubscriptionsService {
-            client: client,
-            authenticator: Box::new(auth),
-            scopes: vec![],
-            base_url: "https://youtube.googleapis.com/".into(),
-            root_url: "https://youtube.googleapis.com/".into(),
-        }
-    }
-
-    /// Provide the base URL of this API. The returned URL is guaranteed to end with a '/'.
-    fn base_url(&self) -> String {
-        if self.base_url.ends_with("/") {
-            return self.base_url.clone();
-        }
-        return self.base_url.clone() + "/";
-    }
-    /// Provide the root URL of this API. The returned URL is guaranteed to end with a '/'.
-    fn root_url(&self) -> String {
-        if self.root_url.ends_with("/") {
-            return self.root_url.clone();
-        }
-        return self.root_url.clone();
-    }
-    /// Returns appropriate URLs for relative and absolute paths.
-    fn format_path(&self, path: &str) -> String {
-        if path.starts_with("/") {
-            return self.root_url().trim_end_matches("/").to_string() + path;
-        } else {
-            return self.base_url() + path;
-        }
-    }
-
-    #[cfg(test)]
-    /// Override API URLs. `base` is the base path relative to which (relative) method paths are interpreted,
-    /// whereas `root` is the URL relative to which absolute paths are interpreted.
-    pub fn set_urls(&mut self, base: String, root: String) {
-        self.base_url = base;
-        self.root_url = root;
-    }
-
-    /// Explicitly select which scopes should be requested for authorization. Otherwise,
-    /// a possibly too large scope will be requested.
-    ///
-    /// It is most convenient to supply a vec or slice of YoutubeScopes enum values.
-    pub fn set_scopes<S: AsRef<str>, T: AsRef<[S]>>(&mut self, scopes: T) {
-        self.scopes = scopes
-            .as_ref()
-            .into_iter()
-            .map(|s| s.as_ref().to_string())
-            .collect();
-    }
-
-    /// Deletes a resource.
-    pub async fn delete(&self, params: &SubscriptionsDeleteParams) -> Result<()> {
-        let rel_path = format!("youtube/v3/subscriptions",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.youtube_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-
-        let opt_request: Option<&EmptyRequest> = None;
-        do_request(&self.client, &full_uri, &headers, "DELETE", opt_request).await
-    }
-
-    /// Retrieves a list of resources, possibly filtered.
-    pub async fn list(&self, params: &SubscriptionsListParams) -> Result<SubscriptionListResponse> {
-        let rel_path = format!("youtube/v3/subscriptions",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.youtube_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-
-        let opt_request: Option<&EmptyRequest> = None;
-        do_request(&self.client, &full_uri, &headers, "GET", opt_request).await
-    }
-
-    /// Inserts a new resource into this collection.
-    pub async fn insert(
-        &self,
-        params: &SubscriptionsInsertParams,
-        req: &Subscription,
-    ) -> Result<Subscription> {
-        let rel_path = format!("youtube/v3/subscriptions",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.youtube_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-
-        let opt_request: Option<&EmptyRequest> = None;
-        let opt_request = Some(req);
-        do_request(&self.client, &full_uri, &headers, "POST", opt_request).await
-    }
-}
-
-/// The Youtube LiveChatBans service represents the LiveChatBans resource.
-pub struct LiveChatBansService {
-    client: TlsClient,
-    authenticator: Box<dyn 'static + DerefAuth>,
-    scopes: Vec<String>,
-
-    base_url: String,
-    root_url: String,
-}
-
-impl LiveChatBansService {
-    /// Create a new LiveChatBansService object. The easiest way to call this is wrapping the Authenticator
-    /// into an `Arc`: `new(client.clone(), Arc::new(authenticator))`.
-    /// This way, one authenticator can be shared among several services.
-    pub fn new<A: 'static + DerefAuth>(client: TlsClient, auth: A) -> LiveChatBansService {
-        LiveChatBansService {
-            client: client,
-            authenticator: Box::new(auth),
-            scopes: vec![],
-            base_url: "https://youtube.googleapis.com/".into(),
-            root_url: "https://youtube.googleapis.com/".into(),
-        }
-    }
-
-    /// Provide the base URL of this API. The returned URL is guaranteed to end with a '/'.
-    fn base_url(&self) -> String {
-        if self.base_url.ends_with("/") {
-            return self.base_url.clone();
-        }
-        return self.base_url.clone() + "/";
-    }
-    /// Provide the root URL of this API. The returned URL is guaranteed to end with a '/'.
-    fn root_url(&self) -> String {
-        if self.root_url.ends_with("/") {
-            return self.root_url.clone();
-        }
-        return self.root_url.clone();
-    }
-    /// Returns appropriate URLs for relative and absolute paths.
-    fn format_path(&self, path: &str) -> String {
-        if path.starts_with("/") {
-            return self.root_url().trim_end_matches("/").to_string() + path;
-        } else {
-            return self.base_url() + path;
-        }
-    }
-
-    #[cfg(test)]
-    /// Override API URLs. `base` is the base path relative to which (relative) method paths are interpreted,
-    /// whereas `root` is the URL relative to which absolute paths are interpreted.
-    pub fn set_urls(&mut self, base: String, root: String) {
-        self.base_url = base;
-        self.root_url = root;
-    }
-
-    /// Explicitly select which scopes should be requested for authorization. Otherwise,
-    /// a possibly too large scope will be requested.
-    ///
-    /// It is most convenient to supply a vec or slice of YoutubeScopes enum values.
-    pub fn set_scopes<S: AsRef<str>, T: AsRef<[S]>>(&mut self, scopes: T) {
-        self.scopes = scopes
-            .as_ref()
-            .into_iter()
-            .map(|s| s.as_ref().to_string())
-            .collect();
-    }
-
-    /// Deletes a chat ban.
-    pub async fn delete(&self, params: &LiveChatBansDeleteParams) -> Result<()> {
-        let rel_path = format!("youtube/v3/liveChat/bans",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::YoutubeForceSsl.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.youtube_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-
-        let opt_request: Option<&EmptyRequest> = None;
-        do_request(&self.client, &full_uri, &headers, "DELETE", opt_request).await
-    }
-
-    /// Inserts a new resource into this collection.
-    pub async fn insert(
-        &self,
-        params: &LiveChatBansInsertParams,
-        req: &LiveChatBan,
-    ) -> Result<LiveChatBan> {
-        let rel_path = format!("youtube/v3/liveChat/bans",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::YoutubeForceSsl.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.youtube_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-
-        let opt_request: Option<&EmptyRequest> = None;
-        let opt_request = Some(req);
-        do_request(&self.client, &full_uri, &headers, "POST", opt_request).await
-    }
-}
-
-/// The Youtube Comments service represents the Comments resource.
-pub struct CommentsService {
-    client: TlsClient,
-    authenticator: Box<dyn 'static + DerefAuth>,
-    scopes: Vec<String>,
-
-    base_url: String,
-    root_url: String,
-}
-
-impl CommentsService {
-    /// Create a new CommentsService object. The easiest way to call this is wrapping the Authenticator
-    /// into an `Arc`: `new(client.clone(), Arc::new(authenticator))`.
-    /// This way, one authenticator can be shared among several services.
-    pub fn new<A: 'static + DerefAuth>(client: TlsClient, auth: A) -> CommentsService {
-        CommentsService {
-            client: client,
-            authenticator: Box::new(auth),
-            scopes: vec![],
-            base_url: "https://youtube.googleapis.com/".into(),
-            root_url: "https://youtube.googleapis.com/".into(),
-        }
-    }
-
-    /// Provide the base URL of this API. The returned URL is guaranteed to end with a '/'.
-    fn base_url(&self) -> String {
-        if self.base_url.ends_with("/") {
-            return self.base_url.clone();
-        }
-        return self.base_url.clone() + "/";
-    }
-    /// Provide the root URL of this API. The returned URL is guaranteed to end with a '/'.
-    fn root_url(&self) -> String {
-        if self.root_url.ends_with("/") {
-            return self.root_url.clone();
-        }
-        return self.root_url.clone();
-    }
-    /// Returns appropriate URLs for relative and absolute paths.
-    fn format_path(&self, path: &str) -> String {
-        if path.starts_with("/") {
-            return self.root_url().trim_end_matches("/").to_string() + path;
-        } else {
-            return self.base_url() + path;
-        }
-    }
-
-    #[cfg(test)]
-    /// Override API URLs. `base` is the base path relative to which (relative) method paths are interpreted,
-    /// whereas `root` is the URL relative to which absolute paths are interpreted.
-    pub fn set_urls(&mut self, base: String, root: String) {
-        self.base_url = base;
-        self.root_url = root;
-    }
-
-    /// Explicitly select which scopes should be requested for authorization. Otherwise,
-    /// a possibly too large scope will be requested.
-    ///
-    /// It is most convenient to supply a vec or slice of YoutubeScopes enum values.
-    pub fn set_scopes<S: AsRef<str>, T: AsRef<[S]>>(&mut self, scopes: T) {
-        self.scopes = scopes
-            .as_ref()
-            .into_iter()
-            .map(|s| s.as_ref().to_string())
-            .collect();
-    }
-
-    /// Updates an existing resource.
-    pub async fn update(&self, params: &CommentsUpdateParams, req: &Comment) -> Result<Comment> {
-        let rel_path = format!("youtube/v3/comments",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::YoutubeForceSsl.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.youtube_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-
-        let opt_request: Option<&EmptyRequest> = None;
-        let opt_request = Some(req);
-        do_request(&self.client, &full_uri, &headers, "PUT", opt_request).await
-    }
-
-    /// Expresses the caller's opinion that one or more comments should be flagged as spam.
-    pub async fn mark_as_spam(&self, params: &CommentsMarkAsSpamParams) -> Result<()> {
-        let rel_path = format!("youtube/v3/comments/markAsSpam",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::YoutubeForceSsl.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.youtube_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-
-        let opt_request: Option<&EmptyRequest> = None;
-        do_request(&self.client, &full_uri, &headers, "POST", opt_request).await
-    }
-
-    /// Sets the moderation status of one or more comments.
-    pub async fn set_moderation_status(
-        &self,
-        params: &CommentsSetModerationStatusParams,
-    ) -> Result<()> {
-        let rel_path = format!("youtube/v3/comments/setModerationStatus",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::YoutubeForceSsl.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.youtube_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-
-        let opt_request: Option<&EmptyRequest> = None;
-        do_request(&self.client, &full_uri, &headers, "POST", opt_request).await
-    }
-
-    /// Inserts a new resource into this collection.
-    pub async fn insert(&self, params: &CommentsInsertParams, req: &Comment) -> Result<Comment> {
-        let rel_path = format!("youtube/v3/comments",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::YoutubeForceSsl.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.youtube_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-
-        let opt_request: Option<&EmptyRequest> = None;
-        let opt_request = Some(req);
-        do_request(&self.client, &full_uri, &headers, "POST", opt_request).await
-    }
-
-    /// Deletes a resource.
-    pub async fn delete(&self, params: &CommentsDeleteParams) -> Result<()> {
-        let rel_path = format!("youtube/v3/comments",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::YoutubeForceSsl.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.youtube_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-
-        let opt_request: Option<&EmptyRequest> = None;
-        do_request(&self.client, &full_uri, &headers, "DELETE", opt_request).await
-    }
-
-    /// Retrieves a list of resources, possibly filtered.
-    pub async fn list(&self, params: &CommentsListParams) -> Result<CommentListResponse> {
-        let rel_path = format!("youtube/v3/comments",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::YoutubeForceSsl.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.youtube_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-
-        let opt_request: Option<&EmptyRequest> = None;
-        do_request(&self.client, &full_uri, &headers, "GET", opt_request).await
-    }
-}
-
 /// The Youtube Thumbnails service represents the Thumbnails resource.
 pub struct ThumbnailsService {
     client: TlsClient,
@@ -19303,6 +19184,582 @@
     }
 }
 
+/// The Youtube VideoAbuseReportReasons service represents the VideoAbuseReportReasons resource.
+pub struct VideoAbuseReportReasonsService {
+    client: TlsClient,
+    authenticator: Box<dyn 'static + DerefAuth>,
+    scopes: Vec<String>,
+
+    base_url: String,
+    root_url: String,
+}
+
+impl VideoAbuseReportReasonsService {
+    /// Create a new VideoAbuseReportReasonsService object. The easiest way to call this is wrapping the Authenticator
+    /// into an `Arc`: `new(client.clone(), Arc::new(authenticator))`.
+    /// This way, one authenticator can be shared among several services.
+    pub fn new<A: 'static + DerefAuth>(
+        client: TlsClient,
+        auth: A,
+    ) -> VideoAbuseReportReasonsService {
+        VideoAbuseReportReasonsService {
+            client: client,
+            authenticator: Box::new(auth),
+            scopes: vec![],
+            base_url: "https://youtube.googleapis.com/".into(),
+            root_url: "https://youtube.googleapis.com/".into(),
+        }
+    }
+
+    /// Provide the base URL of this API. The returned URL is guaranteed to end with a '/'.
+    fn base_url(&self) -> String {
+        if self.base_url.ends_with("/") {
+            return self.base_url.clone();
+        }
+        return self.base_url.clone() + "/";
+    }
+    /// Provide the root URL of this API. The returned URL is guaranteed to end with a '/'.
+    fn root_url(&self) -> String {
+        if self.root_url.ends_with("/") {
+            return self.root_url.clone();
+        }
+        return self.root_url.clone();
+    }
+    /// Returns appropriate URLs for relative and absolute paths.
+    fn format_path(&self, path: &str) -> String {
+        if path.starts_with("/") {
+            return self.root_url().trim_end_matches("/").to_string() + path;
+        } else {
+            return self.base_url() + path;
+        }
+    }
+
+    #[cfg(test)]
+    /// Override API URLs. `base` is the base path relative to which (relative) method paths are interpreted,
+    /// whereas `root` is the URL relative to which absolute paths are interpreted.
+    pub fn set_urls(&mut self, base: String, root: String) {
+        self.base_url = base;
+        self.root_url = root;
+    }
+
+    /// Explicitly select which scopes should be requested for authorization. Otherwise,
+    /// a possibly too large scope will be requested.
+    ///
+    /// It is most convenient to supply a vec or slice of YoutubeScopes enum values.
+    pub fn set_scopes<S: AsRef<str>, T: AsRef<[S]>>(&mut self, scopes: T) {
+        self.scopes = scopes
+            .as_ref()
+            .into_iter()
+            .map(|s| s.as_ref().to_string())
+            .collect();
+    }
+
+    /// Retrieves a list of resources, possibly filtered.
+    pub async fn list(
+        &self,
+        params: &VideoAbuseReportReasonsListParams,
+    ) -> Result<VideoAbuseReportReasonListResponse> {
+        let rel_path = format!("youtube/v3/videoAbuseReportReasons",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[YoutubeScopes::YoutubeReadonly.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref api_params) = &params.youtube_params {
+            url_params.push_str(&format!("{}", api_params));
+        }
+
+        let full_uri = path + &url_params;
+
+        let opt_request: Option<&EmptyRequest> = None;
+        do_request(&self.client, &full_uri, &headers, "GET", opt_request).await
+    }
+}
+
+/// The Youtube VideoCategories service represents the VideoCategories resource.
+pub struct VideoCategoriesService {
+    client: TlsClient,
+    authenticator: Box<dyn 'static + DerefAuth>,
+    scopes: Vec<String>,
+
+    base_url: String,
+    root_url: String,
+}
+
+impl VideoCategoriesService {
+    /// Create a new VideoCategoriesService object. The easiest way to call this is wrapping the Authenticator
+    /// into an `Arc`: `new(client.clone(), Arc::new(authenticator))`.
+    /// This way, one authenticator can be shared among several services.
+    pub fn new<A: 'static + DerefAuth>(client: TlsClient, auth: A) -> VideoCategoriesService {
+        VideoCategoriesService {
+            client: client,
+            authenticator: Box::new(auth),
+            scopes: vec![],
+            base_url: "https://youtube.googleapis.com/".into(),
+            root_url: "https://youtube.googleapis.com/".into(),
+        }
+    }
+
+    /// Provide the base URL of this API. The returned URL is guaranteed to end with a '/'.
+    fn base_url(&self) -> String {
+        if self.base_url.ends_with("/") {
+            return self.base_url.clone();
+        }
+        return self.base_url.clone() + "/";
+    }
+    /// Provide the root URL of this API. The returned URL is guaranteed to end with a '/'.
+    fn root_url(&self) -> String {
+        if self.root_url.ends_with("/") {
+            return self.root_url.clone();
+        }
+        return self.root_url.clone();
+    }
+    /// Returns appropriate URLs for relative and absolute paths.
+    fn format_path(&self, path: &str) -> String {
+        if path.starts_with("/") {
+            return self.root_url().trim_end_matches("/").to_string() + path;
+        } else {
+            return self.base_url() + path;
+        }
+    }
+
+    #[cfg(test)]
+    /// Override API URLs. `base` is the base path relative to which (relative) method paths are interpreted,
+    /// whereas `root` is the URL relative to which absolute paths are interpreted.
+    pub fn set_urls(&mut self, base: String, root: String) {
+        self.base_url = base;
+        self.root_url = root;
+    }
+
+    /// Explicitly select which scopes should be requested for authorization. Otherwise,
+    /// a possibly too large scope will be requested.
+    ///
+    /// It is most convenient to supply a vec or slice of YoutubeScopes enum values.
+    pub fn set_scopes<S: AsRef<str>, T: AsRef<[S]>>(&mut self, scopes: T) {
+        self.scopes = scopes
+            .as_ref()
+            .into_iter()
+            .map(|s| s.as_ref().to_string())
+            .collect();
+    }
+
+    /// Retrieves a list of resources, possibly filtered.
+    pub async fn list(
+        &self,
+        params: &VideoCategoriesListParams,
+    ) -> Result<VideoCategoryListResponse> {
+        let rel_path = format!("youtube/v3/videoCategories",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref api_params) = &params.youtube_params {
+            url_params.push_str(&format!("{}", api_params));
+        }
+
+        let full_uri = path + &url_params;
+
+        let opt_request: Option<&EmptyRequest> = None;
+        do_request(&self.client, &full_uri, &headers, "GET", opt_request).await
+    }
+}
+
+/// The Youtube Videos service represents the Videos resource.
+pub struct VideosService {
+    client: TlsClient,
+    authenticator: Box<dyn 'static + DerefAuth>,
+    scopes: Vec<String>,
+
+    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 `Arc`: `new(client.clone(), Arc::new(authenticator))`.
+    /// This way, one authenticator can be shared among several services.
+    pub fn new<A: 'static + DerefAuth>(client: TlsClient, auth: A) -> 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(&self, params: &VideosDeleteParams) -> Result<()> {
+        let rel_path = format!("youtube/v3/videos",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref api_params) = &params.youtube_params {
+            url_params.push_str(&format!("{}", api_params));
+        }
+
+        let full_uri = path + &url_params;
+
+        let opt_request: Option<&EmptyRequest> = None;
+        do_request(&self.client, &full_uri, &headers, "DELETE", opt_request).await
+    }
+
+    /// Retrieves the ratings that the authorized user gave to a list of specified videos.
+    pub async fn get_rating(
+        &self,
+        params: &VideosGetRatingParams,
+    ) -> Result<VideoRatingListResponse> {
+        let rel_path = format!("youtube/v3/videos/getRating",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref api_params) = &params.youtube_params {
+            url_params.push_str(&format!("{}", api_params));
+        }
+
+        let full_uri = path + &url_params;
+
+        let opt_request: Option<&EmptyRequest> = None;
+        do_request(&self.client, &full_uri, &headers, "GET", opt_request).await
+    }
+
+    /// Inserts a new resource into this collection.
+    pub async fn insert(&self, params: &VideosInsertParams, req: &Video) -> Result<Video> {
+        let rel_path = format!("youtube/v3/videos",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref api_params) = &params.youtube_params {
+            url_params.push_str(&format!("{}", api_params));
+        }
+
+        let full_uri = path + &url_params;
+
+        let opt_request: Option<&EmptyRequest> = None;
+        let opt_request = Some(req);
+        do_request(&self.client, &full_uri, &headers, "POST", opt_request).await
+    }
+
+    /// Inserts a new resource into this collection.
+    ///
+    /// This method is a variant of `insert()`, taking data for upload. It performs a multipart upload.
+    pub async fn insert_upload(
+        &self,
+        params: &VideosInsertParams,
+        req: &Video,
+        data: hyper::body::Bytes,
+    ) -> Result<Video> {
+        let rel_path = format!("/upload/youtube/v3/videos",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?uploadType=multipart{params}", params = params);
+
+        if let Some(ref api_params) = &params.youtube_params {
+            url_params.push_str(&format!("{}", api_params));
+        }
+
+        let full_uri = path + &url_params;
+        let opt_request: Option<&EmptyRequest> = None;
+        let opt_request = Some(req);
+
+        do_upload_multipart(&self.client, &full_uri, &headers, "POST", opt_request, data).await
+    }
+
+    /// Inserts a new resource into this collection.
+    ///
+    /// This method is a variant of `insert()`, taking data for upload.
+    /// It returns a `ResumableUpload` upload manager which you can use to stream larger amounts
+    /// of data to the API. The result of this call will be returned by the `ResumableUpload` method
+    /// you choose for the upload.
+    pub async fn insert_resumable_upload<'client>(
+        &'client self,
+        params: &VideosInsertParams,
+        req: &Video,
+    ) -> Result<ResumableUpload<'client, Video>> {
+        let rel_path = format!("/resumable/upload/youtube/v3/videos",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?uploadType=resumable{params}", params = params);
+        if let Some(ref api_params) = &params.youtube_params {
+            url_params.push_str(&format!("{}", api_params));
+        }
+
+        let full_uri = path + &url_params;
+
+        let opt_request: Option<&EmptyRequest> = None;
+        let opt_request = Some(req);
+        let (_resp, headers): (EmptyResponse, hyper::HeaderMap) =
+            do_request_with_headers(&self.client, &full_uri, &headers, "POST", opt_request).await?;
+        if let Some(dest) = headers.get(hyper::header::LOCATION) {
+            use std::convert::TryFrom;
+            Ok(ResumableUpload::new(
+                hyper::Uri::try_from(dest.to_str()?)?,
+                &self.client,
+                5 * 1024 * 1024,
+            ))
+        } else {
+            Err(Error::from(ApiError::RedirectError(format!(
+                "Resumable upload response didn't contain Location: {:?}",
+                headers
+            )))
+            .context(format!("{:?}", headers)))?
+        }
+    }
+
+    /// Retrieves a list of resources, possibly filtered.
+    pub async fn list(&self, params: &VideosListParams) -> Result<VideoListResponse> {
+        let rel_path = format!("youtube/v3/videos",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref api_params) = &params.youtube_params {
+            url_params.push_str(&format!("{}", api_params));
+        }
+
+        let full_uri = path + &url_params;
+
+        let opt_request: Option<&EmptyRequest> = None;
+        do_request(&self.client, &full_uri, &headers, "GET", opt_request).await
+    }
+
+    /// Adds a like or dislike rating to a video or removes a rating from a video.
+    pub async fn rate(&self, params: &VideosRateParams) -> Result<()> {
+        let rel_path = format!("youtube/v3/videos/rate",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref api_params) = &params.youtube_params {
+            url_params.push_str(&format!("{}", api_params));
+        }
+
+        let full_uri = path + &url_params;
+
+        let opt_request: Option<&EmptyRequest> = None;
+        do_request(&self.client, &full_uri, &headers, "POST", opt_request).await
+    }
+
+    /// Report abuse for a video.
+    pub async fn report_abuse(
+        &self,
+        params: &VideosReportAbuseParams,
+        req: &VideoAbuseReport,
+    ) -> Result<()> {
+        let rel_path = format!("youtube/v3/videos/reportAbuse",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref api_params) = &params.youtube_params {
+            url_params.push_str(&format!("{}", api_params));
+        }
+
+        let full_uri = path + &url_params;
+
+        let opt_request: Option<&EmptyRequest> = None;
+        let opt_request = Some(req);
+        do_request(&self.client, &full_uri, &headers, "POST", opt_request).await
+    }
+
+    /// Updates an existing resource.
+    pub async fn update(&self, params: &VideosUpdateParams, req: &Video) -> Result<Video> {
+        let rel_path = format!("youtube/v3/videos",);
+        let path = self.format_path(rel_path.as_str());
+
+        let mut headers = vec![];
+        let tok;
+        if self.scopes.is_empty() {
+            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
+            tok = self.authenticator.token(scopes).await?;
+        } else {
+            tok = self.authenticator.token(&self.scopes).await?;
+        }
+        headers.push((
+            hyper::header::AUTHORIZATION,
+            format!("Bearer {token}", token = tok.as_str()),
+        ));
+
+        let mut url_params = format!("?{params}", params = params);
+        if let Some(ref api_params) = &params.youtube_params {
+            url_params.push_str(&format!("{}", api_params));
+        }
+
+        let full_uri = path + &url_params;
+
+        let opt_request: Option<&EmptyRequest> = None;
+        let opt_request = Some(req);
+        do_request(&self.client, &full_uri, &headers, "PUT", opt_request).await
+    }
+}
+
 /// The Youtube Watermarks service represents the Watermarks resource.
 pub struct WatermarksService {
     client: TlsClient,
@@ -19521,460 +19978,3 @@
         do_request(&self.client, &full_uri, &headers, "POST", opt_request).await
     }
 }
-
-/// The Youtube Playlists service represents the Playlists resource.
-pub struct PlaylistsService {
-    client: TlsClient,
-    authenticator: Box<dyn 'static + DerefAuth>,
-    scopes: Vec<String>,
-
-    base_url: String,
-    root_url: String,
-}
-
-impl PlaylistsService {
-    /// Create a new PlaylistsService object. The easiest way to call this is wrapping the Authenticator
-    /// into an `Arc`: `new(client.clone(), Arc::new(authenticator))`.
-    /// This way, one authenticator can be shared among several services.
-    pub fn new<A: 'static + DerefAuth>(client: TlsClient, auth: A) -> PlaylistsService {
-        PlaylistsService {
-            client: client,
-            authenticator: Box::new(auth),
-            scopes: vec![],
-            base_url: "https://youtube.googleapis.com/".into(),
-            root_url: "https://youtube.googleapis.com/".into(),
-        }
-    }
-
-    /// Provide the base URL of this API. The returned URL is guaranteed to end with a '/'.
-    fn base_url(&self) -> String {
-        if self.base_url.ends_with("/") {
-            return self.base_url.clone();
-        }
-        return self.base_url.clone() + "/";
-    }
-    /// Provide the root URL of this API. The returned URL is guaranteed to end with a '/'.
-    fn root_url(&self) -> String {
-        if self.root_url.ends_with("/") {
-            return self.root_url.clone();
-        }
-        return self.root_url.clone();
-    }
-    /// Returns appropriate URLs for relative and absolute paths.
-    fn format_path(&self, path: &str) -> String {
-        if path.starts_with("/") {
-            return self.root_url().trim_end_matches("/").to_string() + path;
-        } else {
-            return self.base_url() + path;
-        }
-    }
-
-    #[cfg(test)]
-    /// Override API URLs. `base` is the base path relative to which (relative) method paths are interpreted,
-    /// whereas `root` is the URL relative to which absolute paths are interpreted.
-    pub fn set_urls(&mut self, base: String, root: String) {
-        self.base_url = base;
-        self.root_url = root;
-    }
-
-    /// Explicitly select which scopes should be requested for authorization. Otherwise,
-    /// a possibly too large scope will be requested.
-    ///
-    /// It is most convenient to supply a vec or slice of YoutubeScopes enum values.
-    pub fn set_scopes<S: AsRef<str>, T: AsRef<[S]>>(&mut self, scopes: T) {
-        self.scopes = scopes
-            .as_ref()
-            .into_iter()
-            .map(|s| s.as_ref().to_string())
-            .collect();
-    }
-
-    /// Inserts a new resource into this collection.
-    pub async fn insert(&self, params: &PlaylistsInsertParams, req: &Playlist) -> Result<Playlist> {
-        let rel_path = format!("youtube/v3/playlists",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.youtube_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-
-        let opt_request: Option<&EmptyRequest> = None;
-        let opt_request = Some(req);
-        do_request(&self.client, &full_uri, &headers, "POST", opt_request).await
-    }
-
-    /// Retrieves a list of resources, possibly filtered.
-    pub async fn list(&self, params: &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
-    }
-
-    /// Updates an existing resource.
-    pub async fn update(&self, params: &PlaylistsUpdateParams, req: &Playlist) -> Result<Playlist> {
-        let rel_path = format!("youtube/v3/playlists",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.youtube_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-
-        let opt_request: Option<&EmptyRequest> = None;
-        let opt_request = Some(req);
-        do_request(&self.client, &full_uri, &headers, "PUT", opt_request).await
-    }
-
-    /// Deletes a resource.
-    pub async fn delete(&self, params: &PlaylistsDeleteParams) -> Result<()> {
-        let rel_path = format!("youtube/v3/playlists",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::Youtubepartner.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.youtube_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-
-        let opt_request: Option<&EmptyRequest> = None;
-        do_request(&self.client, &full_uri, &headers, "DELETE", opt_request).await
-    }
-}
-
-/// The Youtube VideoAbuseReportReasons service represents the VideoAbuseReportReasons resource.
-pub struct VideoAbuseReportReasonsService {
-    client: TlsClient,
-    authenticator: Box<dyn 'static + DerefAuth>,
-    scopes: Vec<String>,
-
-    base_url: String,
-    root_url: String,
-}
-
-impl VideoAbuseReportReasonsService {
-    /// Create a new VideoAbuseReportReasonsService object. The easiest way to call this is wrapping the Authenticator
-    /// into an `Arc`: `new(client.clone(), Arc::new(authenticator))`.
-    /// This way, one authenticator can be shared among several services.
-    pub fn new<A: 'static + DerefAuth>(
-        client: TlsClient,
-        auth: A,
-    ) -> VideoAbuseReportReasonsService {
-        VideoAbuseReportReasonsService {
-            client: client,
-            authenticator: Box::new(auth),
-            scopes: vec![],
-            base_url: "https://youtube.googleapis.com/".into(),
-            root_url: "https://youtube.googleapis.com/".into(),
-        }
-    }
-
-    /// Provide the base URL of this API. The returned URL is guaranteed to end with a '/'.
-    fn base_url(&self) -> String {
-        if self.base_url.ends_with("/") {
-            return self.base_url.clone();
-        }
-        return self.base_url.clone() + "/";
-    }
-    /// Provide the root URL of this API. The returned URL is guaranteed to end with a '/'.
-    fn root_url(&self) -> String {
-        if self.root_url.ends_with("/") {
-            return self.root_url.clone();
-        }
-        return self.root_url.clone();
-    }
-    /// Returns appropriate URLs for relative and absolute paths.
-    fn format_path(&self, path: &str) -> String {
-        if path.starts_with("/") {
-            return self.root_url().trim_end_matches("/").to_string() + path;
-        } else {
-            return self.base_url() + path;
-        }
-    }
-
-    #[cfg(test)]
-    /// Override API URLs. `base` is the base path relative to which (relative) method paths are interpreted,
-    /// whereas `root` is the URL relative to which absolute paths are interpreted.
-    pub fn set_urls(&mut self, base: String, root: String) {
-        self.base_url = base;
-        self.root_url = root;
-    }
-
-    /// Explicitly select which scopes should be requested for authorization. Otherwise,
-    /// a possibly too large scope will be requested.
-    ///
-    /// It is most convenient to supply a vec or slice of YoutubeScopes enum values.
-    pub fn set_scopes<S: AsRef<str>, T: AsRef<[S]>>(&mut self, scopes: T) {
-        self.scopes = scopes
-            .as_ref()
-            .into_iter()
-            .map(|s| s.as_ref().to_string())
-            .collect();
-    }
-
-    /// Retrieves a list of resources, possibly filtered.
-    pub async fn list(
-        &self,
-        params: &VideoAbuseReportReasonsListParams,
-    ) -> Result<VideoAbuseReportReasonListResponse> {
-        let rel_path = format!("youtube/v3/videoAbuseReportReasons",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::YoutubeReadonly.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.youtube_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-
-        let opt_request: Option<&EmptyRequest> = None;
-        do_request(&self.client, &full_uri, &headers, "GET", opt_request).await
-    }
-}
-
-/// The Youtube CommentThreads service represents the CommentThreads resource.
-pub struct CommentThreadsService {
-    client: TlsClient,
-    authenticator: Box<dyn 'static + DerefAuth>,
-    scopes: Vec<String>,
-
-    base_url: String,
-    root_url: String,
-}
-
-impl CommentThreadsService {
-    /// Create a new CommentThreadsService object. The easiest way to call this is wrapping the Authenticator
-    /// into an `Arc`: `new(client.clone(), Arc::new(authenticator))`.
-    /// This way, one authenticator can be shared among several services.
-    pub fn new<A: 'static + DerefAuth>(client: TlsClient, auth: A) -> CommentThreadsService {
-        CommentThreadsService {
-            client: client,
-            authenticator: Box::new(auth),
-            scopes: vec![],
-            base_url: "https://youtube.googleapis.com/".into(),
-            root_url: "https://youtube.googleapis.com/".into(),
-        }
-    }
-
-    /// Provide the base URL of this API. The returned URL is guaranteed to end with a '/'.
-    fn base_url(&self) -> String {
-        if self.base_url.ends_with("/") {
-            return self.base_url.clone();
-        }
-        return self.base_url.clone() + "/";
-    }
-    /// Provide the root URL of this API. The returned URL is guaranteed to end with a '/'.
-    fn root_url(&self) -> String {
-        if self.root_url.ends_with("/") {
-            return self.root_url.clone();
-        }
-        return self.root_url.clone();
-    }
-    /// Returns appropriate URLs for relative and absolute paths.
-    fn format_path(&self, path: &str) -> String {
-        if path.starts_with("/") {
-            return self.root_url().trim_end_matches("/").to_string() + path;
-        } else {
-            return self.base_url() + path;
-        }
-    }
-
-    #[cfg(test)]
-    /// Override API URLs. `base` is the base path relative to which (relative) method paths are interpreted,
-    /// whereas `root` is the URL relative to which absolute paths are interpreted.
-    pub fn set_urls(&mut self, base: String, root: String) {
-        self.base_url = base;
-        self.root_url = root;
-    }
-
-    /// Explicitly select which scopes should be requested for authorization. Otherwise,
-    /// a possibly too large scope will be requested.
-    ///
-    /// It is most convenient to supply a vec or slice of YoutubeScopes enum values.
-    pub fn set_scopes<S: AsRef<str>, T: AsRef<[S]>>(&mut self, scopes: T) {
-        self.scopes = scopes
-            .as_ref()
-            .into_iter()
-            .map(|s| s.as_ref().to_string())
-            .collect();
-    }
-
-    /// Retrieves a list of resources, possibly filtered.
-    pub async fn list(
-        &self,
-        params: &CommentThreadsListParams,
-    ) -> Result<CommentThreadListResponse> {
-        let rel_path = format!("youtube/v3/commentThreads",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::YoutubeForceSsl.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.youtube_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-
-        let opt_request: Option<&EmptyRequest> = None;
-        do_request(&self.client, &full_uri, &headers, "GET", opt_request).await
-    }
-
-    /// Inserts a new resource into this collection.
-    pub async fn insert(
-        &self,
-        params: &CommentThreadsInsertParams,
-        req: &CommentThread,
-    ) -> Result<CommentThread> {
-        let rel_path = format!("youtube/v3/commentThreads",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::YoutubeForceSsl.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.youtube_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-
-        let opt_request: Option<&EmptyRequest> = None;
-        let opt_request = Some(req);
-        do_request(&self.client, &full_uri, &headers, "POST", opt_request).await
-    }
-
-    /// Updates an existing resource.
-    pub async fn update(
-        &self,
-        params: &CommentThreadsUpdateParams,
-        req: &CommentThread,
-    ) -> Result<CommentThread> {
-        let rel_path = format!("youtube/v3/commentThreads",);
-        let path = self.format_path(rel_path.as_str());
-
-        let mut headers = vec![];
-        let tok;
-        if self.scopes.is_empty() {
-            let scopes = &[YoutubeScopes::YoutubeForceSsl.as_ref().to_string()];
-            tok = self.authenticator.token(scopes).await?;
-        } else {
-            tok = self.authenticator.token(&self.scopes).await?;
-        }
-        headers.push((
-            hyper::header::AUTHORIZATION,
-            format!("Bearer {token}", token = tok.as_str()),
-        ));
-
-        let mut url_params = format!("?{params}", params = params);
-        if let Some(ref api_params) = &params.youtube_params {
-            url_params.push_str(&format!("{}", api_params));
-        }
-
-        let full_uri = path + &url_params;
-
-        let opt_request: Option<&EmptyRequest> = None;
-        let opt_request = Some(req);
-        do_request(&self.client, &full_uri, &headers, "PUT", opt_request).await
-    }
-}