use serde::Deserialize; use serde_with::serde_as; use serde_with::VecSkipError; use crate::serializer::text::Text; use super::MusicThumbnailRenderer; use super::{ ContentRenderer, ContentsRenderer, MusicContentsRenderer, MusicContinuation, MusicItem, }; #[derive(Debug, Deserialize)] #[serde(rename_all = "camelCase")] pub(crate) struct PlaylistMusic { pub contents: Contents, pub header: Header, } #[derive(Debug, Deserialize)] #[serde(rename_all = "camelCase")] pub(crate) struct Contents { pub single_column_browse_results_renderer: ContentsRenderer, } #[derive(Debug, Deserialize)] #[serde(rename_all = "camelCase")] pub(crate) struct Tab { pub tab_renderer: ContentRenderer, } #[derive(Debug, Deserialize)] #[serde(rename_all = "camelCase")] pub(crate) struct SectionList { /// Includes a continuation token for fetching recommendations pub section_list_renderer: MusicContentsRenderer, } #[derive(Debug, Deserialize)] #[serde(rename_all = "camelCase")] pub(crate) struct ItemSection { #[serde(alias = "musicPlaylistShelfRenderer")] pub music_shelf_renderer: MusicShelf, } #[serde_as] #[derive(Debug, Deserialize)] #[serde(rename_all = "camelCase")] pub(crate) struct MusicShelf { /// Playlist ID (only for playlists) pub playlist_id: Option, #[serde_as(as = "VecSkipError<_>")] pub contents: Vec, /// Continuation token for fetching more (>100) playlist items #[serde_as(as = "Option>")] pub continuations: Option>, } #[derive(Debug, Deserialize)] #[serde(rename_all = "camelCase")] pub(crate) struct PlaylistMusicItem { pub music_responsive_list_item_renderer: MusicItem, } #[derive(Debug, Deserialize)] #[serde(rename_all = "camelCase")] pub(crate) struct Header { pub music_detail_header_renderer: HeaderRenderer, } #[serde_as] #[derive(Debug, Deserialize)] #[serde(rename_all = "camelCase")] pub(crate) struct HeaderRenderer { #[serde_as(as = "crate::serializer::text::Text")] pub title: String, /// Content type + Channel/Artist + Year. /// Missing on artist_tracks view. /// /// `"Playlist", " • ", <"Best Music">, " • ", "2022"` /// /// `"Album", " • ", <"Helene Fischer">, " • ", "2021"` pub subtitle: Option, /// Playlist description. May contain hashtags which are /// displayed as search links on the YouTube website. #[serde_as(as = "Option")] pub description: Option, /// Playlist thumbnail / album cover. /// Missing on artist_tracks view. pub thumbnail: Option, /// Number of tracks + playtime. /// Missing on artist_tracks view. /// /// `"64 songs", " • ", "3 hours, 40 minutes"` pub second_subtitle: Option, }