// // MPPositive_JsonArtist.swift // MusicPlayer // // Created by Mr.Zhou on 2024/5/15. // import UIKit ///艺术家结构 struct JsonArtist: Codable { ///头部结构(艺术家照片,订阅,解说) let header:Header? ///艺术家内容结构 let contents:Contents? enum CodingKeys: String, CodingKey { case header = "header" case contents = "contents" } init(from decoder: Decoder) throws { let values = try decoder.container(keyedBy: CodingKeys.self) header = try values.decodeIfPresent(Header.self, forKey: .header) contents = try values.decodeIfPresent(Contents.self, forKey: .contents) } struct Header: Codable { let musicImmersiveHeaderRenderer:MusicImmersiveHeaderRenderer? enum CodingKeys: String, CodingKey { case musicImmersiveHeaderRenderer = "musicImmersiveHeaderRenderer" } init(from decoder: Decoder) throws { let values = try decoder.container(keyedBy: CodingKeys.self) musicImmersiveHeaderRenderer = try values.decodeIfPresent(MusicImmersiveHeaderRenderer.self, forKey: .musicImmersiveHeaderRenderer) } struct MusicImmersiveHeaderRenderer: Codable { ///艺术家名字 let title:Title? ///艺术家当前订阅总数 let subscriptionButton:SubscriptionButton? ///艺术家介绍 let description:Description? ///艺术家大头照 let thumbnail:Thumbnail? enum CodingKeys: String, CodingKey { case title = "title" case subscriptionButton = "subscriptionButton" case description = "description" case thumbnail = "thumbnail" } init(from decoder: Decoder) throws { let values = try decoder.container(keyedBy: CodingKeys.self) title = try values.decodeIfPresent(Title.self, forKey: .title) subscriptionButton = try values.decodeIfPresent(SubscriptionButton.self, forKey: .subscriptionButton) description = try values.decodeIfPresent(Description.self, forKey: .description) thumbnail = try values.decodeIfPresent(Thumbnail.self, forKey: .thumbnail) } struct Title: Codable { let runs:[Run]? enum CodingKeys: String, CodingKey { case runs = "runs" } init(from decoder: Decoder) throws { let values = try decoder.container(keyedBy: CodingKeys.self) runs = try values.decodeIfPresent([Run].self, forKey: .runs) } struct Run: Codable { let text:String? enum CodingKeys: String, CodingKey { case text = "text" } init(from decoder: Decoder) throws { let values = try decoder.container(keyedBy: CodingKeys.self) text = try values.decodeIfPresent(String.self, forKey: .text) } } } struct SubscriptionButton: Codable { let subscribeButtonRenderer:SubscribeButtonRenderer? enum CodingKeys: String, CodingKey { case subscribeButtonRenderer = "subscribeButtonRenderer" } init(from decoder: Decoder) throws { let values = try decoder.container(keyedBy: CodingKeys.self) subscribeButtonRenderer = try values.decodeIfPresent(SubscribeButtonRenderer.self, forKey: .subscribeButtonRenderer) } struct SubscribeButtonRenderer: Codable { ///订阅数文本 let subscriberCountText:SubscriberCountText? ///已订阅文本 let subscribedButtonText:SubscribedButtonText? enum CodingKeys: String, CodingKey { case subscriberCountText = "subscriberCountText" case subscribedButtonText = "subscribedButtonText" } init(from decoder: Decoder) throws { let values = try decoder.container(keyedBy: CodingKeys.self) subscriberCountText = try values.decodeIfPresent(SubscriberCountText.self, forKey: .subscriberCountText) subscribedButtonText = try values.decodeIfPresent(SubscribedButtonText.self, forKey: .subscribedButtonText) } struct SubscriberCountText: Codable { let runs:[Run]? enum CodingKeys: String, CodingKey { case runs = "runs" } init(from decoder: Decoder) throws { let values = try decoder.container(keyedBy: CodingKeys.self) runs = try values.decodeIfPresent([Run].self, forKey: .runs) } struct Run: Codable { let text:String? enum CodingKeys: String, CodingKey { case text = "text" } init(from decoder: Decoder) throws { let values = try decoder.container(keyedBy: CodingKeys.self) text = try values.decodeIfPresent(String.self, forKey: .text) } } } struct SubscribedButtonText: Codable { let runs:[Run]? enum CodingKeys: String, CodingKey { case runs = "runs" } init(from decoder: Decoder) throws { let values = try decoder.container(keyedBy: CodingKeys.self) runs = try values.decodeIfPresent([Run].self, forKey: .runs) } struct Run: Codable { let text:String? enum CodingKeys: String, CodingKey { case text = "text" } init(from decoder: Decoder) throws { let values = try decoder.container(keyedBy: CodingKeys.self) text = try values.decodeIfPresent(String.self, forKey: .text) } } } } } struct Description:Codable { let runs:[Run]? enum CodingKeys: String, CodingKey { case runs = "runs" } init(from decoder: Decoder) throws { let values = try decoder.container(keyedBy: CodingKeys.self) runs = try values.decodeIfPresent([Run].self, forKey: .runs) } struct Run: Codable { let text:String? enum CodingKeys: String, CodingKey { case text = "text" } init(from decoder: Decoder) throws { let values = try decoder.container(keyedBy: CodingKeys.self) text = try values.decodeIfPresent(String.self, forKey: .text) } } } struct Thumbnail: Codable { let musicThumbnailRenderer:MusicThumbnailRenderer? enum CodingKeys: String, CodingKey { case musicThumbnailRenderer = "musicThumbnailRenderer" } init(from decoder: Decoder) throws { let values = try decoder.container(keyedBy: CodingKeys.self) musicThumbnailRenderer = try values.decodeIfPresent(MusicThumbnailRenderer.self, forKey: .musicThumbnailRenderer) } struct MusicThumbnailRenderer: Codable { let thumbnail:Thumbnail? enum CodingKeys: String, CodingKey { case thumbnail = "thumbnail" } init(from decoder: Decoder) throws { let values = try decoder.container(keyedBy: CodingKeys.self) thumbnail = try values.decodeIfPresent(Thumbnail.self, forKey: .thumbnail) } struct Thumbnail: Codable { let thumbnails:[Thumbnails]? enum CodingKeys: String, CodingKey { case thumbnails = "thumbnails" } init(from decoder: Decoder) throws { let values = try decoder.container(keyedBy: CodingKeys.self) thumbnails = try values.decodeIfPresent([Thumbnails].self, forKey: .thumbnails) } struct Thumbnails: Codable { let url:String? enum CodingKeys: String, CodingKey { case url = "url" } init(from decoder: Decoder) throws { let values = try decoder.container(keyedBy: CodingKeys.self) url = try values.decodeIfPresent(String.self, forKey: .url) } } } } } } } struct Contents: Codable { let singleColumnBrowseResultsRenderer:SingleColumnBrowseResultsRenderer? enum CodingKeys: String, CodingKey { case singleColumnBrowseResultsRenderer = "singleColumnBrowseResultsRenderer" } init(from decoder: Decoder) throws { let values = try decoder.container(keyedBy: CodingKeys.self) singleColumnBrowseResultsRenderer = try values.decodeIfPresent(SingleColumnBrowseResultsRenderer.self, forKey: .singleColumnBrowseResultsRenderer) } struct SingleColumnBrowseResultsRenderer: Codable { let tabs:[Tab]? enum CodingKeys: String, CodingKey { case tabs = "tabs" } init(from decoder: Decoder) throws { let values = try decoder.container(keyedBy: CodingKeys.self) tabs = try values.decodeIfPresent([Tab].self, forKey: .tabs) } struct Tab: Codable { let tabRenderer:TabRenderer? enum CodingKeys: String, CodingKey { case tabRenderer = "tabRenderer" } init(from decoder: Decoder) throws { let values = try decoder.container(keyedBy: CodingKeys.self) tabRenderer = try values.decodeIfPresent(TabRenderer.self, forKey: .tabRenderer) } struct TabRenderer: Codable { let content:Content? enum CodingKeys: String, CodingKey { case content = "content" } init(from decoder: Decoder) throws { let values = try decoder.container(keyedBy: CodingKeys.self) content = try values.decodeIfPresent(Content.self, forKey: .content) } struct Content: Codable { let sectionListRenderer:SectionListRenderer? enum CodingKeys: String, CodingKey { case sectionListRenderer = "sectionListRenderer" } init(from decoder: Decoder) throws { let values = try decoder.container(keyedBy: CodingKeys.self) sectionListRenderer = try values.decodeIfPresent(SectionListRenderer.self, forKey: .sectionListRenderer) } struct SectionListRenderer: Codable { ///各种模块组 let contents:[Content]? enum CodingKeys: String, CodingKey { case contents = "contents" } init(from decoder: Decoder) throws { let values = try decoder.container(keyedBy: CodingKeys.self) contents = try values.decodeIfPresent([Content].self, forKey: .contents) } struct Content: Codable { ///首选模块组 let musicShelfRenderer:MusicShelfRenderer? ///其他模块组 let musicCarouselShelfRenderer:MusicCarouselShelfRenderer? enum CodingKeys: String, CodingKey { case musicShelfRenderer = "musicShelfRenderer" case musicCarouselShelfRenderer = "musicCarouselShelfRenderer" } init(from decoder: Decoder) throws { let values = try decoder.container(keyedBy: CodingKeys.self) musicShelfRenderer = try values.decodeIfPresent(MusicShelfRenderer.self, forKey: .musicShelfRenderer) musicCarouselShelfRenderer = try values.decodeIfPresent(MusicCarouselShelfRenderer.self, forKey: .musicCarouselShelfRenderer) } struct MusicShelfRenderer: Codable { ///模块组标题信息 let title:Title? ///模块组内容组 let contents:[Content]? enum CodingKeys: String, CodingKey { case title = "title" case contents = "contents" } init(from decoder: Decoder) throws { let values = try decoder.container(keyedBy: CodingKeys.self) title = try values.decodeIfPresent(Title.self, forKey: .title) contents = try values.decodeIfPresent([Content].self, forKey: .contents) } struct Title: Codable { let runs:[Run]? enum CodingKeys: String, CodingKey { case runs = "runs" } init(from decoder: Decoder) throws { let values = try decoder.container(keyedBy: CodingKeys.self) runs = try values.decodeIfPresent([Run].self, forKey: .runs) } struct Run: Codable { ///模块标题 let text:String? ///模块事件值 let navigationEndpoint:NavigationEndpoint? enum CodingKeys: String, CodingKey { case text = "text" case navigationEndpoint = "navigationEndpoint" } init(from decoder: Decoder) throws { let values = try decoder.container(keyedBy: CodingKeys.self) text = try values.decodeIfPresent(String.self, forKey: .text) navigationEndpoint = try values.decodeIfPresent(NavigationEndpoint.self, forKey: .navigationEndpoint) } struct NavigationEndpoint: Codable { let browseEndpoint:BrowseEndpoint? enum CodingKeys: String, CodingKey { case browseEndpoint = "browseEndpoint" } init(from decoder: Decoder) throws { let values = try decoder.container(keyedBy: CodingKeys.self) browseEndpoint = try values.decodeIfPresent(BrowseEndpoint.self, forKey: .browseEndpoint) } struct BrowseEndpoint: Codable { ///事件Id let browseId: String? ///事件参数 let params: String? enum CodingKeys: String, CodingKey { case browseId = "browseId" case params = "params" } init(from decoder: Decoder) throws { let values = try decoder.container(keyedBy: CodingKeys.self) browseId = try values.decodeIfPresent(String.self, forKey: .browseId) params = try values.decodeIfPresent(String.self, forKey: .params) } } } } } struct Content: Codable { ///内容信息 let musicResponsiveListItemRenderer:RootMusicResponsiveListItemRenderer? enum CodingKeys: String, CodingKey { case musicResponsiveListItemRenderer = "musicResponsiveListItemRenderer" } init(from decoder: Decoder) throws { let values = try decoder.container(keyedBy: CodingKeys.self) musicResponsiveListItemRenderer = try values.decodeIfPresent(RootMusicResponsiveListItemRenderer.self, forKey: .musicResponsiveListItemRenderer) } // struct MusicResponsiveListItemRenderer: Codable { // ///封面 // let thumbnail:Thumbnail? // ///文本内容(第0位是标题,其他拼成副标题) // let flexColumns:[FlexColumn]? // ///单曲/视频ID(playlistItemData存在说明这条数据单曲/视频) // let playlistItemData:PlaylistItemData? // ///专辑/歌单ID(navigationEndpoint存在说明这条数据是专辑/歌单) // let navigationEndpoint:NavigationEndpoint? // enum CodingKeys: String, CodingKey { // case thumbnail = "thumbnail" // case flexColumns = "flexColumns" // case playlistItemData = "playlistItemData" // case navigationEndpoint = "navigationEndpoint" // } // init(from decoder: Decoder) throws { // let values = try decoder.container(keyedBy: CodingKeys.self) // thumbnail = try values.decodeIfPresent(Thumbnail.self, forKey: .thumbnail) // flexColumns = try values.decodeIfPresent([FlexColumn].self, forKey: .flexColumns) // playlistItemData = try values.decodeIfPresent(PlaylistItemData.self, forKey: .playlistItemData) // navigationEndpoint = try values.decodeIfPresent(NavigationEndpoint.self, forKey: .navigationEndpoint) // } // struct Thumbnail: Codable { // let musicThumbnailRenderer:MusicThumbnailRenderer? // enum CodingKeys: String, CodingKey { // case musicThumbnailRenderer = "musicThumbnailRenderer" // } // init(from decoder: Decoder) throws { // let values = try decoder.container(keyedBy: CodingKeys.self) // musicThumbnailRenderer = try values.decodeIfPresent(MusicThumbnailRenderer.self, forKey: .musicThumbnailRenderer) // } // struct MusicThumbnailRenderer: Codable { // let thumbnail:Thumbnail? // enum CodingKeys: String, CodingKey { // case thumbnail = "thumbnail" // } // init(from decoder: Decoder) throws { // let values = try decoder.container(keyedBy: CodingKeys.self) // thumbnail = try values.decodeIfPresent(Thumbnail.self, forKey: .thumbnail) // } // struct Thumbnail: Codable { // let thumbnails:[Thumbnails]? // enum CodingKeys: String, CodingKey { // case thumbnails = "thumbnails" // } // init(from decoder: Decoder) throws { // let values = try decoder.container(keyedBy: CodingKeys.self) // thumbnails = try values.decodeIfPresent([Thumbnails].self, forKey: .thumbnails) // } // struct Thumbnails: Codable { // let url:String? // enum CodingKeys: String, CodingKey { // case url = "url" // } // init(from decoder: Decoder) throws { // let values = try decoder.container(keyedBy: CodingKeys.self) // url = try values.decodeIfPresent(String.self, forKey: .url) // } // } // } // } // } // struct FlexColumn: Codable { // let musicResponsiveListItemFlexColumnRenderer:MusicResponsiveListItemFlexColumnRenderer? // enum CodingKeys: String, CodingKey { // case musicResponsiveListItemFlexColumnRenderer = "musicResponsiveListItemFlexColumnRenderer" // } // init(from decoder: Decoder) throws { // let values = try decoder.container(keyedBy: CodingKeys.self) // musicResponsiveListItemFlexColumnRenderer = try values.decodeIfPresent(MusicResponsiveListItemFlexColumnRenderer.self, forKey: .musicResponsiveListItemFlexColumnRenderer) // } // struct MusicResponsiveListItemFlexColumnRenderer: Codable { // let text:Text? // enum CodingKeys: String, CodingKey { // case text = "text" // } // init(from decoder: Decoder) throws { // let values = try decoder.container(keyedBy: CodingKeys.self) // text = try values.decodeIfPresent(Text.self, forKey: .text) // } // struct Text: Codable { // let runs:[Run]? // enum CodingKeys: String, CodingKey { // case runs = "runs" // } // init(from decoder: Decoder) throws { // let values = try decoder.container(keyedBy: CodingKeys.self) // runs = try values.decodeIfPresent([Run].self, forKey: .runs) // } // struct Run: Codable { // ///标题文本 // let text:String? // let navigationEndpoint:NavigationEndpoint? // enum CodingKeys: String, CodingKey { // case text = "text" // case navigationEndpoint = "navigationEndpoint" // } // init(from decoder: Decoder) throws { // let values = try decoder.container(keyedBy: CodingKeys.self) // text = try values.decodeIfPresent(String.self, forKey: .text) // navigationEndpoint = try values.decodeIfPresent(NavigationEndpoint.self, forKey: .navigationEndpoint) // } // struct NavigationEndpoint: Codable { // let watchEndpoint:WatchEndpoint? // enum CodingKeys: String, CodingKey { // case watchEndpoint = "watchEndpoint" // } // init(from decoder: Decoder) throws { // let values = try decoder.container(keyedBy: CodingKeys.self) // watchEndpoint = try values.decodeIfPresent(WatchEndpoint.self, forKey: .watchEndpoint) // } // struct WatchEndpoint: Codable { // let playlistId:String? // enum CodingKeys: String, CodingKey { // case playlistId = "playlistId" // } // init(from decoder: Decoder) throws { // let values = try decoder.container(keyedBy: CodingKeys.self) // playlistId = try values.decodeIfPresent(String.self, forKey: .playlistId) // } // } // } // } // } // } // } // struct PlaylistItemData: Codable { // let videoId:String? // enum CodingKeys: String, CodingKey { // case videoId = "videoId" // } // init(from decoder: Decoder) throws { // let values = try decoder.container(keyedBy: CodingKeys.self) // videoId = try values.decodeIfPresent(String.self, forKey: .videoId) // } // } // struct NavigationEndpoint: Codable { // let browseEndpoint:BrowseEndpoint? // enum CodingKeys: String, CodingKey { // case browseEndpoint = "browseEndpoint" // } // init(from decoder: Decoder) throws { // let values = try decoder.container(keyedBy: CodingKeys.self) // browseEndpoint = try values.decodeIfPresent(BrowseEndpoint.self, forKey: .browseEndpoint) // } // struct BrowseEndpoint: Codable { // let browseId:String? // let browseEndpointContextSupportedConfigs:BrowseEndpointContextSupportedConfigs? // enum CodingKeys: String, CodingKey { // case browseId = "browseId" // case browseEndpointContextSupportedConfigs = "browseEndpointContextSupportedConfigs" // } // init(from decoder: Decoder) throws { // let values = try decoder.container(keyedBy: CodingKeys.self) // browseId = try values.decodeIfPresent(String.self, forKey: .browseId) // browseEndpointContextSupportedConfigs = try values.decodeIfPresent(BrowseEndpointContextSupportedConfigs.self, forKey: .browseEndpointContextSupportedConfigs) // } // struct BrowseEndpointContextSupportedConfigs: Codable { // let browseEndpointContextMusicConfig:BrowseEndpointContextMusicConfig? // enum CodingKeys: String, CodingKey { // case browseEndpointContextMusicConfig = "browseEndpointContextMusicConfig" // } // init(from decoder: Decoder) throws { // let values = try decoder.container(keyedBy: CodingKeys.self) // browseEndpointContextMusicConfig = try values.decodeIfPresent(BrowseEndpointContextMusicConfig.self, forKey: .browseEndpointContextMusicConfig) // } // struct BrowseEndpointContextMusicConfig: Codable { // let pageType:String? // enum CodingKeys: String, CodingKey { // case pageType = "pageType" // } // init(from decoder: Decoder) throws { // let values = try decoder.container(keyedBy: CodingKeys.self) // pageType = try values.decodeIfPresent(String.self, forKey: .pageType) // } // } // } // } // } // } } } struct MusicCarouselShelfRenderer: Codable { ///模块标题信息 let header:Header? ///模块内容组 let contents:[Content]? enum CodingKeys: String, CodingKey { case header = "header" case contents = "contents" } init(from decoder: Decoder) throws { let values = try decoder.container(keyedBy: CodingKeys.self) header = try values.decodeIfPresent(Header.self, forKey: .header) contents = try values.decodeIfPresent([Content].self, forKey: .contents) } struct Header: Codable { let musicCarouselShelfBasicHeaderRenderer:MusicCarouselShelfBasicHeaderRenderer? enum CodingKeys: String, CodingKey { case musicCarouselShelfBasicHeaderRenderer = "musicCarouselShelfBasicHeaderRenderer" } init(from decoder: Decoder) throws { let values = try decoder.container(keyedBy: CodingKeys.self) musicCarouselShelfBasicHeaderRenderer = try values.decodeIfPresent(MusicCarouselShelfBasicHeaderRenderer.self, forKey: .musicCarouselShelfBasicHeaderRenderer) } struct MusicCarouselShelfBasicHeaderRenderer: Codable { let title:Title? enum CodingKeys: String, CodingKey { case title = "title" } init(from decoder: Decoder) throws { let values = try decoder.container(keyedBy: CodingKeys.self) title = try values.decodeIfPresent(Title.self, forKey: .title) } struct Title: Codable { let runs:[Run]? enum CodingKeys: String, CodingKey { case runs = "runs" } init(from decoder: Decoder) throws { let values = try decoder.container(keyedBy: CodingKeys.self) runs = try values.decodeIfPresent([Run].self, forKey: .runs) } struct Run: Codable { ///模块标题 let text:String? ///模块事件值 let navigationEndpoint:NavigationEndpoint? enum CodingKeys: String, CodingKey { case text = "text" case navigationEndpoint = "navigationEndpoint" } init(from decoder: Decoder) throws { let values = try decoder.container(keyedBy: CodingKeys.self) text = try values.decodeIfPresent(String.self, forKey: .text) navigationEndpoint = try values.decodeIfPresent(NavigationEndpoint.self, forKey: .navigationEndpoint) } struct NavigationEndpoint: Codable { let browseEndpoint:BrowseEndpoint? enum CodingKeys: String, CodingKey { case browseEndpoint = "browseEndpoint" } init(from decoder: Decoder) throws { let values = try decoder.container(keyedBy: CodingKeys.self) browseEndpoint = try values.decodeIfPresent(BrowseEndpoint.self, forKey: .browseEndpoint) } struct BrowseEndpoint: Codable { ///事件Id let browseId: String? ///事件参数 let params: String? enum CodingKeys: String, CodingKey { case browseId = "browseId" case params = "params" } init(from decoder: Decoder) throws { let values = try decoder.container(keyedBy: CodingKeys.self) browseId = try values.decodeIfPresent(String.self, forKey: .browseId) params = try values.decodeIfPresent(String.self, forKey: .params) } } } } } } } struct Content: Codable { let musicTwoRowItemRenderer:RootMusicTwoRowItemRenderer? enum CodingKeys: String, CodingKey { case musicTwoRowItemRenderer = "musicTwoRowItemRenderer" } init(from decoder: Decoder) throws { let values = try decoder.container(keyedBy: CodingKeys.self) musicTwoRowItemRenderer = try values.decodeIfPresent(RootMusicTwoRowItemRenderer.self, forKey: .musicTwoRowItemRenderer) } // struct MusicTwoRowItemRenderer: Codable { // ///内容预览图片 // let thumbnailRenderer:ThumbnailRenderer? // ///内容标题 // let title:Title? // ///内容副标题 // let subtitle:Subtitle? // ///内容iD和编码 // let navigationEndpoint:NavigationEndpoint? // enum CodingKeys: String, CodingKey { // case thumbnailRenderer = "thumbnailRenderer" // case title = "title" // case subtitle = "subtitle" // case navigationEndpoint = "navigationEndpoint" // } // init(from decoder: Decoder) throws { // let values = try decoder.container(keyedBy: CodingKeys.self) // thumbnailRenderer = try values.decodeIfPresent(ThumbnailRenderer.self, forKey: .thumbnailRenderer) // title = try values.decodeIfPresent(Title.self, forKey: .title) // subtitle = try values.decodeIfPresent(Subtitle.self, forKey: .subtitle) // navigationEndpoint = try values.decodeIfPresent(NavigationEndpoint.self, forKey: .navigationEndpoint) // } // struct ThumbnailRenderer: Codable { // let musicThumbnailRenderer:MusicThumbnailRenderer? // enum CodingKeys: String, CodingKey { // case musicThumbnailRenderer = "musicThumbnailRenderer" // } // init(from decoder: Decoder) throws { // let values = try decoder.container(keyedBy: CodingKeys.self) // musicThumbnailRenderer = try values.decodeIfPresent(MusicThumbnailRenderer.self, forKey: .musicThumbnailRenderer) // } // struct MusicThumbnailRenderer: Codable { // let thumbnail:Thumbnail? // enum CodingKeys: String, CodingKey { // case thumbnail = "thumbnail" // } // init(from decoder: Decoder) throws { // let values = try decoder.container(keyedBy: CodingKeys.self) // thumbnail = try values.decodeIfPresent(Thumbnail.self, forKey: .thumbnail) // } // struct Thumbnail: Codable { // let thumbnails:[Thumbnails]? // enum CodingKeys: String, CodingKey { // case thumbnails = "thumbnails" // } // init(from decoder: Decoder) throws { // let values = try decoder.container(keyedBy: CodingKeys.self) // thumbnails = try values.decodeIfPresent([Thumbnails].self, forKey: .thumbnails) // } // struct Thumbnails: Codable { // let url:String? // enum CodingKeys: String, CodingKey { // case url = "url" // } // init(from decoder: Decoder) throws { // let values = try decoder.container(keyedBy: CodingKeys.self) // url = try values.decodeIfPresent(String.self, forKey: .url) // } // } // } // } // } // struct Title: Codable { // let runs:[Run]? // enum CodingKeys: String, CodingKey { // case runs = "runs" // // } // init(from decoder: Decoder) throws { // let values = try decoder.container(keyedBy: CodingKeys.self) // runs = try values.decodeIfPresent([Run].self, forKey: .runs) // } // struct Run: Codable { // let text:String? // enum CodingKeys: String, CodingKey { // case text = "text" // // } // init(from decoder: Decoder) throws { // let values = try decoder.container(keyedBy: CodingKeys.self) // text = try values.decodeIfPresent(String.self, forKey: .text) // } // } // } // struct Subtitle: Codable { // let runs:[Run]? // enum CodingKeys: String, CodingKey { // case runs = "runs" // // } // init(from decoder: Decoder) throws { // let values = try decoder.container(keyedBy: CodingKeys.self) // runs = try values.decodeIfPresent([Run].self, forKey: .runs) // } // struct Run: Codable { // let text:String? // enum CodingKeys: String, CodingKey { // case text = "text" // // } // init(from decoder: Decoder) throws { // let values = try decoder.container(keyedBy: CodingKeys.self) // text = try values.decodeIfPresent(String.self, forKey: .text) // } // } // } // struct NavigationEndpoint: Codable { // ///列表/专辑类型 // let browseEndpoint:BrowseEndpoint? // ///音视频类型 // let watchEndpoint:WatchEndpoint? // enum CodingKeys: String, CodingKey { // case browseEndpoint = "browseEndpoint" // case watchEndpoint = "watchEndpoint" // } // init(from decoder: Decoder) throws { // let values = try decoder.container(keyedBy: CodingKeys.self) // browseEndpoint = try values.decodeIfPresent(BrowseEndpoint.self, forKey: .browseEndpoint) // watchEndpoint = try values.decodeIfPresent(WatchEndpoint.self, forKey: .watchEndpoint) // } // struct BrowseEndpoint: Codable { // let browseId:String? // let params:String? // let browseEndpointContextSupportedConfigs:BrowseEndpointContextSupportedConfigs? // enum CodingKeys: String, CodingKey { // case browseId = "browseId" // case params = "params" // case browseEndpointContextSupportedConfigs = "browseEndpointContextSupportedConfigs" // } // init(from decoder: Decoder) throws { // let values = try decoder.container(keyedBy: CodingKeys.self) // browseId = try values.decodeIfPresent(String.self, forKey: .browseId) // params = try values.decodeIfPresent(String.self, forKey: .params) // browseEndpointContextSupportedConfigs = try values.decodeIfPresent(BrowseEndpointContextSupportedConfigs.self, forKey: .browseEndpointContextSupportedConfigs) // } // struct BrowseEndpointContextSupportedConfigs: Codable { // let browseEndpointContextMusicConfig:BrowseEndpointContextMusicConfig? // enum CodingKeys: String, CodingKey { // case browseEndpointContextMusicConfig = "browseEndpointContextMusicConfig" // } // init(from decoder: Decoder) throws { // let values = try decoder.container(keyedBy: CodingKeys.self) // browseEndpointContextMusicConfig = try values.decodeIfPresent(BrowseEndpointContextMusicConfig.self, forKey: .browseEndpointContextMusicConfig) // } // struct BrowseEndpointContextMusicConfig: Codable { // let pageType:String? // enum CodingKeys: String, CodingKey { // case pageType = "pageType" // } // init(from decoder: Decoder) throws { // let values = try decoder.container(keyedBy: CodingKeys.self) // pageType = try values.decodeIfPresent(String.self, forKey: .pageType) // } // } // } // } // struct WatchEndpoint: Codable { // ///音视频ID // let videoId:String? // ///音视频所在列表ID // let playlistId:String? // ///音视频类型 // let watchEndpointMusicSupportedConfigs:WatchEndpointMusicSupportedConfigs? // enum CodingKeys: String, CodingKey { // case videoId = "videoId" // case playlistId = "playlistId" // case watchEndpointMusicSupportedConfigs = "watchEndpointMusicSupportedConfigs" // } // init(from decoder: Decoder) throws { // let values = try decoder.container(keyedBy: CodingKeys.self) // videoId = try values.decodeIfPresent(String.self, forKey: .videoId) // playlistId = try values.decodeIfPresent(String.self, forKey: .playlistId) // watchEndpointMusicSupportedConfigs = try values.decodeIfPresent(WatchEndpointMusicSupportedConfigs.self, forKey: .watchEndpointMusicSupportedConfigs) // } // struct WatchEndpointMusicSupportedConfigs: Codable { // let watchEndpointMusicConfig:WatchEndpointMusicConfig? // enum CodingKeys: String, CodingKey { // case watchEndpointMusicConfig = "watchEndpointMusicConfig" // } // init(from decoder: Decoder) throws { // let values = try decoder.container(keyedBy: CodingKeys.self) // watchEndpointMusicConfig = try values.decodeIfPresent(WatchEndpointMusicConfig.self, forKey: .watchEndpointMusicConfig) // } // struct WatchEndpointMusicConfig: Codable { // let musicVideoType:String? // enum CodingKeys: String, CodingKey { // case musicVideoType = "musicVideoType" // } // init(from decoder: Decoder) throws { // let values = try decoder.container(keyedBy: CodingKeys.self) // musicVideoType = try values.decodeIfPresent(String.self, forKey: .musicVideoType) // } // } // } // } // } // } } } } } } } } } } }