use serde::Deserialize; use serde_with::serde_as; use serde_with::VecSkipError; use super::TimeOverlay; use super::{ContentRenderer, ContentsRenderer, Thumbnails, VideoListItem}; use crate::serializer::text::Text; #[derive(Clone, Debug, Deserialize)] #[serde(rename_all = "camelCase")] pub struct Channel { pub contents: Contents, } #[derive(Clone, Debug, Deserialize)] #[serde(rename_all = "camelCase")] pub struct Contents { pub two_column_browse_results_renderer: TabsRenderer, } #[serde_as] #[derive(Clone, Debug, Deserialize)] #[serde(rename_all = "camelCase")] pub struct TabsRenderer { #[serde_as(as = "VecSkipError<_>")] pub tabs: Vec, } #[derive(Clone, Debug, Deserialize)] #[serde(rename_all = "camelCase")] pub struct TabRendererWrap { pub tab_renderer: ContentRenderer, } #[derive(Clone, Debug, Deserialize)] #[serde(rename_all = "camelCase")] pub struct SectionListRendererWrap { pub section_list_renderer: ContentsRenderer, } #[derive(Clone, Debug, Deserialize)] #[serde(rename_all = "camelCase")] pub struct ItemSectionRendererWrap { pub item_section_renderer: ContentsRenderer, } #[derive(Clone, Debug, Deserialize)] #[serde(rename_all = "camelCase")] pub struct GridRendererWrap { pub grid_renderer: GridRenderer, } #[serde_as] #[derive(Clone, Debug, Deserialize)] #[serde(rename_all = "camelCase")] pub struct GridRenderer { #[serde_as(as = "VecSkipError<_>")] pub items: Vec>, } #[serde_as] #[derive(Clone, Debug, Deserialize)] #[serde(rename_all = "camelCase")] pub struct ChannelVideo { pub video_id: String, pub thumbnail: Thumbnails, #[serde_as(as = "Text")] pub title: String, #[serde_as(as = "Option")] pub published_time_text: Option, #[serde_as(as = "Text")] pub view_count_text: String, #[serde_as(as = "VecSkipError<_>")] pub thumbnail_overlays: Vec, }