837 lines
60 KiB
Swift
837 lines
60 KiB
Swift
//
|
||
// 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)
|
||
// }
|
||
// }
|
||
// }
|
||
// }
|
||
// }
|
||
// }
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|