pub mod channel; pub mod player; pub mod playlist; pub mod playlist_music; pub use channel::Channel; pub use player::Player; pub use playlist::Playlist; pub use playlist_music::PlaylistMusic; use serde::Deserialize; use serde_with::{serde_as, DefaultOnError, VecSkipError}; use crate::serializer::text::TextLink; #[derive(Clone, Debug, Deserialize)] #[serde(rename_all = "camelCase")] pub struct ContentRenderer { pub content: T, } #[derive(Clone, Debug, Deserialize)] #[serde(rename_all = "camelCase")] pub struct ContentsRenderer { #[serde(alias = "tabs")] pub contents: Vec, } #[derive(Clone, Debug, Deserialize)] #[serde(rename_all = "camelCase")] pub struct ThumbnailsWrap { pub thumbnail: Thumbnails, } #[derive(Default, Clone, Debug, Deserialize)] #[serde(rename_all = "camelCase")] pub struct Thumbnails { pub thumbnails: Vec, } #[derive(Clone, Debug, Deserialize)] #[serde(rename_all = "camelCase")] pub struct Thumbnail { pub url: String, pub width: u32, pub height: u32, } #[serde_as] #[derive(Clone, Debug, Deserialize)] #[serde(rename_all = "camelCase")] pub enum VideoListItem { #[serde(alias = "playlistVideoRenderer")] GridVideoRenderer { #[serde(flatten)] video: T, }, #[serde(rename_all = "camelCase")] ContinuationItemRenderer { continuation_endpoint: ContinuationEndpoint, }, } #[derive(Clone, Debug, Deserialize)] #[serde(rename_all = "camelCase")] pub struct ContinuationEndpoint { pub continuation_command: ContinuationCommand, } #[derive(Clone, Debug, Deserialize)] #[serde(rename_all = "camelCase")] pub struct ContinuationCommand { pub token: String, } // YouTube Music #[serde_as] #[derive(Clone, Debug, Deserialize)] #[serde(rename_all = "camelCase")] pub struct MusicItem { pub thumbnail: MusicThumbnailRenderer, #[serde(default)] #[serde_as(deserialize_as = "DefaultOnError")] pub playlist_item_data: Option, #[serde(default)] #[serde_as(as = "VecSkipError<_>")] pub flex_columns: Vec, #[serde(default)] #[serde_as(as = "VecSkipError<_>")] pub fixed_columns: Vec, } #[derive(Clone, Debug, Deserialize)] #[serde(rename_all = "camelCase")] pub struct MusicThumbnailRenderer { #[serde(alias = "croppedSquareThumbnailRenderer")] pub music_thumbnail_renderer: ThumbnailsWrap, } #[derive(Clone, Debug, Deserialize)] #[serde(rename_all = "camelCase")] pub struct PlaylistItemData { pub video_id: String, } #[serde_as] #[derive(Clone, Debug, Deserialize)] #[serde(rename_all = "camelCase")] pub struct MusicContentsRenderer { pub contents: Vec, #[serde_as(as = "Option>")] pub continuations: Option>, } #[derive(Clone, Debug, Deserialize)] pub struct MusicColumn { #[serde( rename = "musicResponsiveListItemFlexColumnRenderer", alias = "musicResponsiveListItemFixedColumnRenderer" )] pub renderer: MusicColumnRenderer, } #[serde_as] #[derive(Clone, Debug, Deserialize)] pub struct MusicColumnRenderer { #[serde_as(as = "crate::serializer::text::TextLinks")] pub text: Vec, } #[derive(Clone, Debug, Deserialize)] #[serde(rename_all = "camelCase")] pub struct MusicContinuation { pub next_continuation_data: MusicContinuationData, } #[derive(Clone, Debug, Deserialize)] #[serde(rename_all = "camelCase")] pub struct MusicContinuationData { pub continuation: String, }