1.1.1数据结构更新

This commit is contained in:
Mr.zhou 2024-07-09 18:49:19 +08:00
parent 45455e7c6d
commit 130fefd189
7 changed files with 240 additions and 220 deletions

View File

@ -1312,7 +1312,9 @@ extension MP_NetWorkManager {
content.musicCarouselShelfRenderer?.contents?.forEach({ content in
///
if let musicResponsiveListItemRenderer = content.musicResponsiveListItemRenderer {
browse.items.append(.init(parsingMusicResponsiveListItemRenderer(musicResponsiveListItemRenderer)))
if let item = parsingMusicResponsiveListItemRenderer(musicResponsiveListItemRenderer) {
browse.items.append(.init(item))
}
}else if let musicTwoRowItemRenderer = content.musicTwoRowItemRenderer {
browse.items.append(.init(parsingMusicTwoRowItemRenderer(musicTwoRowItemRenderer)))
}
@ -1392,7 +1394,9 @@ extension MP_NetWorkManager {
content.musicCarouselShelfRenderer?.contents?.forEach({ content in
///
if let musicResponsiveListItemRenderer = content.musicResponsiveListItemRenderer {
browse.items.append(.init(parsingMusicResponsiveListItemRenderer(musicResponsiveListItemRenderer)))
if let item = parsingMusicResponsiveListItemRenderer(musicResponsiveListItemRenderer) {
browse.items.append(.init(item))
}
}else if let musicTwoRowItemRenderer = content.musicTwoRowItemRenderer {
browse.items.append(.init(parsingMusicTwoRowItemRenderer(musicTwoRowItemRenderer)))
}
@ -1421,7 +1425,9 @@ extension MP_NetWorkManager {
musicPlaylistShelfRenderer.contents?.forEach({ content in
///
if let musicResponsiveListItemRenderer = content.musicResponsiveListItemRenderer {
items.append(.init(parsingMusicResponsiveListItemRenderer(musicResponsiveListItemRenderer)))
if let item = parsingMusicResponsiveListItemRenderer(musicResponsiveListItemRenderer) {
items.append(.init(item))
}
}else if let musicTwoRowItemRenderer = content.musicTwoRowItemRenderer {
items.append(.init(parsingMusicTwoRowItemRenderer(musicTwoRowItemRenderer)))
}
@ -1430,7 +1436,9 @@ extension MP_NetWorkManager {
musicShelfRenderer.contents?.forEach({ content in
///
if let musicResponsiveListItemRenderer = content.musicResponsiveListItemRenderer {
items.append(.init(parsingMusicResponsiveListItemRenderer(musicResponsiveListItemRenderer)))
if let item = parsingMusicResponsiveListItemRenderer(musicResponsiveListItemRenderer) {
items.append(.init(item))
}
}else if let musicTwoRowItemRenderer = content.musicTwoRowItemRenderer {
items.append(.init(parsingMusicTwoRowItemRenderer(musicTwoRowItemRenderer)))
}
@ -1449,7 +1457,9 @@ extension MP_NetWorkManager {
musicPlaylistShelfRenderer.contents?.forEach({ content in
///
if let musicResponsiveListItemRenderer = content.musicResponsiveListItemRenderer {
items.append(.init(parsingMusicResponsiveListItemRenderer(musicResponsiveListItemRenderer)))
if let item = parsingMusicResponsiveListItemRenderer(musicResponsiveListItemRenderer) {
items.append(.init(item))
}
}else if let musicTwoRowItemRenderer = content.musicTwoRowItemRenderer {
items.append(.init(parsingMusicTwoRowItemRenderer(musicTwoRowItemRenderer)))
}
@ -1458,7 +1468,9 @@ extension MP_NetWorkManager {
musicShelfRenderer.contents?.forEach({ content in
///
if let musicResponsiveListItemRenderer = content.musicResponsiveListItemRenderer {
items.append(.init(parsingMusicResponsiveListItemRenderer(musicResponsiveListItemRenderer)))
if let item = parsingMusicResponsiveListItemRenderer(musicResponsiveListItemRenderer) {
items.append(.init(item))
}
}else if let musicTwoRowItemRenderer = content.musicTwoRowItemRenderer {
items.append(.init(parsingMusicTwoRowItemRenderer(musicTwoRowItemRenderer)))
}
@ -1540,8 +1552,8 @@ extension MP_NetWorkManager {
params = musicShelfRenderer.title?.runs?.first?.navigationEndpoint?.browseEndpoint?.params
//
musicShelfRenderer.contents?.forEach({ item in
if item.musicResponsiveListItemRenderer != nil {
itemViews.append(.init(parsingMusicResponsiveListItemRenderer(item.musicResponsiveListItemRenderer!)))
if let musicResponsiveListItemRenderer = item.musicResponsiveListItemRenderer, let asd = parsingMusicResponsiveListItemRenderer(musicResponsiveListItemRenderer) {
itemViews.append(.init(asd))
}
})
}
@ -1573,7 +1585,9 @@ extension MP_NetWorkManager {
//
musicPlaylistShelfRenderer.contents?.forEach({ item in
if let musicResponsiveListItemRenderer = item.musicResponsiveListItemRenderer {
array.append(.init(parsingMusicResponsiveListItemRenderer(musicResponsiveListItemRenderer)))
if let asd = parsingMusicResponsiveListItemRenderer(musicResponsiveListItemRenderer) {
array.append(.init(asd))
}
}
})
continuation = musicPlaylistShelfRenderer.continuations?.first?.nextContinuationData?.continuation
@ -1601,7 +1615,9 @@ extension MP_NetWorkManager {
if let contents = musicPlaylistShelfContinuation.contents {
contents.forEach { item in
if let musicResponsiveListItemRenderer = item.musicResponsiveListItemRenderer {
array.append(.init(parsingMusicResponsiveListItemRenderer(musicResponsiveListItemRenderer)))
if let asd = parsingMusicResponsiveListItemRenderer(musicResponsiveListItemRenderer) {
array.append(.init(asd))
}
}
}
}
@ -1810,9 +1826,10 @@ extension MP_NetWorkManager {
let list = MPPositive_RecommendListViewModel()
list.title = section.musicCarouselShelfRenderer?.header?.musicCarouselShelfBasicHeaderRenderer?.title?.runs?.reduce("", { $0 + ($1.text ?? "")})
section.musicCarouselShelfRenderer?.contents?.forEach({ content in
if content.musicResponsiveListItemRenderer != nil {
let item = parsingMusicResponsiveListItemRenderer(content.musicResponsiveListItemRenderer!)
list.items.append(.init(item))
if let musicResponsiveListItemRenderer = content.musicResponsiveListItemRenderer{
if let item = parsingMusicResponsiveListItemRenderer(musicResponsiveListItemRenderer) {
list.items.append(.init(item))
}
}else if content.musicTwoRowItemRenderer != nil {
let item = parsingMusicTwoRowItemRenderer(content.musicTwoRowItemRenderer!)
list.items.append(.init(item))
@ -1968,45 +1985,7 @@ extension MP_NetWorkManager {
//
musicShelfRenderer.contents?.forEach({ content in
/////
let item = MPPositive_BrowseItemModel()
if (content.musicResponsiveListItemRenderer?.playlistItemData != nil || content.musicResponsiveListItemRenderer?.navigationEndpoint != nil) && (content.musicResponsiveListItemRenderer?.navigationEndpoint?.browseEndpoint?.browseEndpointContextSupportedConfigs?.browseEndpointContextMusicConfig?.pageType != "MUSIC_PAGE_TYPE_NON_MUSIC_AUDIO_TRACK_PAGE") {
//
item.coverUrls = content.musicResponsiveListItemRenderer?.thumbnail?.musicThumbnailRenderer?.thumbnail?.thumbnails?.map({$0.url ?? ""})
//
for (index, flexColumn) in (content.musicResponsiveListItemRenderer?.flexColumns ?? []).enumerated() {
if index == 0 {
//
item.title = flexColumn.musicResponsiveListItemFlexColumnRenderer?.text?.runs?.reduce("", { $0 + ($1.text ?? "")})
item.pageType = flexColumn.musicResponsiveListItemFlexColumnRenderer?.text?.runs?.first?.navigationEndpoint?.browseEndpoint?.browseEndpointContextSupportedConfigs?.browseEndpointContextMusicConfig?.pageType
}else {
//
item.subtitle = (item.subtitle ?? "") + (flexColumn.musicResponsiveListItemFlexColumnRenderer?.text?.runs?.reduce("", { $0 + ($1.text ?? "")}) ?? "")
}
}
item.playListId = content.musicResponsiveListItemRenderer?.menu?.menuRenderer?.items?.first?.menuNavigationItemRenderer?.navigationEndpoint?.watchEndpoint?.playlistId
//id
if content.musicResponsiveListItemRenderer?.playlistItemData != nil {
//
item.itemType = .single
item.videoId = content.musicResponsiveListItemRenderer?.playlistItemData?.videoId
}else {
///
item.browseId = content.musicResponsiveListItemRenderer?.navigationEndpoint?.browseEndpoint?.browseId
let pageType = content.musicResponsiveListItemRenderer?.navigationEndpoint?.browseEndpoint?.browseEndpointContextSupportedConfigs?.browseEndpointContextMusicConfig?.pageType
if youTubeKeys.contains(pageType ?? "") == true && pageType != "MUSIC_PAGE_TYPE_NON_MUSIC_AUDIO_TRACK_PAGE" {
//
if pageType == "MUSIC_PAGE_TYPE_ARTIST" {
item.artistId = content.musicResponsiveListItemRenderer?.navigationEndpoint?.browseEndpoint?.browseId
//
item.itemType = .artist
}else {
///
item.itemType = .list
}
}
}
}
if item.itemType != nil, item.title != nil, item.pageType != "MUSIC_PAGE_TYPE_NON_MUSIC_AUDIO_TRACK_PAGE" {
if let musicResponsiveListItemRenderer = content.musicResponsiveListItemRenderer, let item = parsingMusicResponsiveListItemRenderer(musicResponsiveListItemRenderer) {
resultList.previewItemViews.append(.init(item))
}
})
@ -2146,55 +2125,87 @@ extension MP_NetWorkManager {
return (array, continuation, clickTrackingParams)
}
//MARK: -
//musicResponsiveListItemRenderer
private func parsingMusicResponsiveListItemRenderer(_ musicResponsiveListItemRenderer: RootMusicResponsiveListItemRenderer) -> MPPositive_BrowseItemModel {
//musicResponsiveListItemRenderer
private func parsingMusicResponsiveListItemRenderer(_ musicResponsiveListItemRenderer: RootMusicResponsiveListItemRenderer) -> MPPositive_BrowseItemModel? {
//
let item = MPPositive_BrowseItemModel()
//
item.coverUrls = musicResponsiveListItemRenderer.thumbnail?.musicThumbnailRenderer?.thumbnail?.thumbnails?.compactMap({$0.url})
//
if let flexColumns = musicResponsiveListItemRenderer.flexColumns {
for (index,flexColumn) in flexColumns.enumerated() {
if index == 0 {
//
item.title = flexColumn.musicResponsiveListItemFlexColumnRenderer?.text?.runs?.reduce("", { $0 + ($1.text ?? "")})
item.playListId = flexColumn.musicResponsiveListItemFlexColumnRenderer?.text?.runs?.first?.navigationEndpoint?.watchEndpoint?.playlistId
}else{
item.subtitle = (item.subtitle ?? "") + (flexColumn.musicResponsiveListItemFlexColumnRenderer?.text?.runs?.reduce("", { $0 + ($1.text ?? "")}) ?? "")
}
}
}
if item.playListId == nil {
//playListId
item.playListId = musicResponsiveListItemRenderer.menu?.menuRenderer?.items?.first?.menuNavigationItemRenderer?.navigationEndpoint?.watchEndpoint?.playlistId
}
//
//
if let playlistItemData = musicResponsiveListItemRenderer.playlistItemData {
//
///
item.itemType = .single
item.videoId = playlistItemData.videoId
item.pageType = "MUSIC_VIDEO_TYPE_ATV"
}
if let navigationEndpoint = musicResponsiveListItemRenderer.navigationEndpoint {
//
if navigationEndpoint.browseEndpoint?.browseEndpointContextSupportedConfigs?.browseEndpointContextMusicConfig?.pageType == "MUSIC_PAGE_TYPE_ARTIST" && navigationEndpoint.browseEndpoint?.browseEndpointContextSupportedConfigs?.browseEndpointContextMusicConfig?.pageType != "MUSIC_PAGE_TYPE_NON_MUSIC_AUDIO_TRACK_PAGE" {
//
item.itemType = .artist
item.artistId = navigationEndpoint.browseEndpoint?.browseId
item.pageType = "MUSIC_PAGE_TYPE_ARTIST"
}else {
if navigationEndpoint.browseEndpoint?.browseEndpointContextSupportedConfigs?.browseEndpointContextMusicConfig?.pageType != "MUSIC_PAGE_TYPE_NON_MUSIC_AUDIO_TRACK_PAGE" {
//
item.itemType = .list
item.pageType = navigationEndpoint.browseEndpoint?.browseEndpointContextSupportedConfigs?.browseEndpointContextMusicConfig?.pageType
item.browseId = navigationEndpoint.browseEndpoint?.browseId
item.params = navigationEndpoint.browseEndpoint?.params
}
//
guard var flexColumns = musicResponsiveListItemRenderer.flexColumns, flexColumns.isEmpty != true else {
return nil
}
//,VideoId,PlayListId,pageTypeflexColumn
let first = flexColumns.removeFirst()
item.title = first.musicResponsiveListItemFlexColumnRenderer?.text?.runs?.reduce("", { $0 + ($1.text ?? "")})
//watchEndpoint
guard let watchEndpoint = first.musicResponsiveListItemFlexColumnRenderer?.text?.runs?.first?.navigationEndpoint?.watchEndpoint else {return nil}
//watchEndpointitem
item.playListId = watchEndpoint.playlistId
item.pageType = watchEndpoint.watchEndpointMusicSupportedConfigs?.watchEndpointMusicConfig?.musicVideoType
///
flexColumns.forEach { flexColumn in
item.subtitle = (item.subtitle ?? "") + (flexColumn.musicResponsiveListItemFlexColumnRenderer?.text?.runs?.reduce("", { $0 + ($1.text ?? "")}) ?? "")
}
//videoId,playListId,playListId使
guard (item.playListId ?? "").isEmpty == true else {
//
return item
}
//
if let watchItem = musicResponsiveListItemRenderer.menu?.menuRenderer?.items?.first(where: {$0.menuNavigationItemRenderer?.navigationEndpoint?.watchEndpoint != nil}) {
item.playListId = watchItem.menuNavigationItemRenderer?.navigationEndpoint?.watchEndpoint?.playlistId
return item
}else {
//
return nil
}
}else if let navigationEndpoint = musicResponsiveListItemRenderer.navigationEndpoint {
////
//
guard var flexColumns = musicResponsiveListItemRenderer.flexColumns, flexColumns.isEmpty != true else {
return nil
}
//,
let first = flexColumns.removeFirst()
item.title = first.musicResponsiveListItemFlexColumnRenderer?.text?.runs?.reduce("", { $0 + ($1.text ?? "")})
///
flexColumns.forEach { flexColumn in
item.subtitle = (item.subtitle ?? "") + (flexColumn.musicResponsiveListItemFlexColumnRenderer?.text?.runs?.reduce("", { $0 + ($1.text ?? "")}) ?? "")
}
//Id
guard let browseEndpoint = navigationEndpoint.browseEndpoint else {
return nil
}
item.browseId = browseEndpoint.browseId
//pageType
guard let pageType = browseEndpoint.browseEndpointContextSupportedConfigs?.browseEndpointContextMusicConfig?.pageType else {return nil}
item.pageType = pageType
if pageType == "MUSIC_PAGE_TYPE_ALBUM" {
//
item.itemType = .list
return item
}else if pageType == "MUSIC_PAGE_TYPE_PLAYLIST" {
//
item.itemType = .list
return item
}else if pageType == "MUSIC_PAGE_TYPE_ARTIST" {
//
item.itemType = .artist
return item
}else {
return nil
}
}else {
return nil
}
return item
}
//musicResponsiveListItemRenderer
//musicResponsiveListItemRenderer
private func parsingMusicTwoRowItemRenderer(_ musicTwoRowItemRenderer: RootMusicTwoRowItemRenderer) -> MPPositive_BrowseItemModel {
//
let item = MPPositive_BrowseItemModel()
@ -2224,7 +2235,6 @@ extension MP_NetWorkManager {
item.itemType = .list
item.pageType = browseEndpoint.browseEndpointContextSupportedConfigs?.browseEndpointContextMusicConfig?.pageType
item.browseId = browseEndpoint.browseId
item.params = browseEndpoint.params
}
}
return item

View File

@ -469,32 +469,33 @@ struct JsonBrowses: Codable {
}
//MARK: -
////(ID)
///(ID)playlistItemDatanavigationEndpoint/
struct RootMusicResponsiveListItemRenderer: Codable {
///
let thumbnail:Thumbnail?
///(0)
let flexColumns:[FlexColumn]?
///flexColumnsplayListId
let menu:Menu?
////IDplaylistItemData/
let playlistItemData:PlaylistItemData?
////IDnavigationEndpoint/
///(navigationEndpoint)
let navigationEndpoint:NavigationEndpoint?
///playlistItemDataflexColumnsPlayListIDplayListId
let menu:Menu?
enum CodingKeys: String, CodingKey {
case thumbnail = "thumbnail"
case flexColumns = "flexColumns"
case menu = "menu"
case playlistItemData = "playlistItemData"
case navigationEndpoint = "navigationEndpoint"
case menu = "menu"
}
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)
menu = try values.decodeIfPresent(Menu.self, forKey: .menu)
playlistItemData = try values.decodeIfPresent(PlaylistItemData.self, forKey: .playlistItemData)
navigationEndpoint = try values.decodeIfPresent(NavigationEndpoint.self, forKey: .navigationEndpoint)
menu = try values.decodeIfPresent(Menu.self, forKey: .menu)
}
//
struct Thumbnail: Codable {
@ -573,6 +574,7 @@ struct RootMusicResponsiveListItemRenderer: Codable {
struct Run: Codable {
///
let text:String?
///
let navigationEndpoint:NavigationEndpoint?
enum CodingKeys: String, CodingKey {
case text = "text"
@ -583,60 +585,54 @@ struct RootMusicResponsiveListItemRenderer: Codable {
text = try values.decodeIfPresent(String.self, forKey: .text)
navigationEndpoint = try values.decodeIfPresent(NavigationEndpoint.self, forKey: .navigationEndpoint)
}
//
struct NavigationEndpoint: Codable {
///
let watchEndpoint:WatchEndpoint?
let browseEndpoint:BrowseEndpoint?
enum CodingKeys: String, CodingKey {
case watchEndpoint = "watchEndpoint"
case browseEndpoint = "browseEndpoint"
}
init(from decoder: Decoder) throws {
let values = try decoder.container(keyedBy: CodingKeys.self)
watchEndpoint = try values.decodeIfPresent(WatchEndpoint.self, forKey: .watchEndpoint)
browseEndpoint = try values.decodeIfPresent(BrowseEndpoint.self, forKey: .browseEndpoint)
}
//
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 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?
struct WatchEndpointMusicSupportedConfigs: Codable {
let watchEndpointMusicConfig:WatchEndpointMusicConfig?
enum CodingKeys: String, CodingKey {
case browseEndpointContextMusicConfig = "browseEndpointContextMusicConfig"
case watchEndpointMusicConfig = "watchEndpointMusicConfig"
}
init(from decoder: Decoder) throws {
let values = try decoder.container(keyedBy: CodingKeys.self)
browseEndpointContextMusicConfig = try values.decodeIfPresent(BrowseEndpointContextMusicConfig.self, forKey: .browseEndpointContextMusicConfig)
watchEndpointMusicConfig = try values.decodeIfPresent(WatchEndpointMusicConfig.self, forKey: .watchEndpointMusicConfig)
}
struct BrowseEndpointContextMusicConfig: Codable {
let pageType:String?
struct WatchEndpointMusicConfig: Codable {
///
let musicVideoType:String?
enum CodingKeys: String, CodingKey {
case pageType = "pageType"
case musicVideoType = "musicVideoType"
}
init(from decoder: Decoder) throws {
let values = try decoder.container(keyedBy: CodingKeys.self)
pageType = try values.decodeIfPresent(String.self, forKey: .pageType)
musicVideoType = try values.decodeIfPresent(String.self, forKey: .musicVideoType)
}
}
}
@ -646,68 +642,7 @@ struct RootMusicResponsiveListItemRenderer: Codable {
}
}
}
//
struct Menu: Codable {
let menuRenderer:MenuRenderer?
enum CodingKeys: String, CodingKey {
case menuRenderer = "menuRenderer"
}
init(from decoder: Decoder) throws {
let values = try decoder.container(keyedBy: CodingKeys.self)
menuRenderer = try values.decodeIfPresent(MenuRenderer.self, forKey: .menuRenderer)
}
struct MenuRenderer: Codable {
let items:[Item]?
enum CodingKeys: String, CodingKey {
case items = "items"
}
init(from decoder: Decoder) throws {
let values = try decoder.container(keyedBy: CodingKeys.self)
items = try values.decodeIfPresent([Item].self, forKey: .items)
}
struct Item: Codable {
let menuNavigationItemRenderer:MenuNavigationItemRenderer?
enum CodingKeys: String, CodingKey {
case menuNavigationItemRenderer = "menuNavigationItemRenderer"
}
init(from decoder: Decoder) throws {
let values = try decoder.container(keyedBy: CodingKeys.self)
menuNavigationItemRenderer = try values.decodeIfPresent(MenuNavigationItemRenderer.self, forKey: .menuNavigationItemRenderer)
}
struct MenuNavigationItemRenderer: Codable {
let navigationEndpoint:NavigationEndpoint?
enum CodingKeys: String, CodingKey {
case navigationEndpoint = "navigationEndpoint"
}
init(from decoder: Decoder) throws {
let values = try decoder.container(keyedBy: CodingKeys.self)
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 {
@ -718,6 +653,7 @@ struct RootMusicResponsiveListItemRenderer: Codable {
videoId = try values.decodeIfPresent(String.self, forKey: .videoId)
}
}
//
struct NavigationEndpoint: Codable {
let browseEndpoint:BrowseEndpoint?
enum CodingKeys: String, CodingKey {
@ -728,18 +664,16 @@ struct RootMusicResponsiveListItemRenderer: Codable {
browseEndpoint = try values.decodeIfPresent(BrowseEndpoint.self, forKey: .browseEndpoint)
}
struct BrowseEndpoint: Codable {
///ID
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 {
@ -752,6 +686,7 @@ struct RootMusicResponsiveListItemRenderer: Codable {
browseEndpointContextMusicConfig = try values.decodeIfPresent(BrowseEndpointContextMusicConfig.self, forKey: .browseEndpointContextMusicConfig)
}
struct BrowseEndpointContextMusicConfig: Codable {
///
let pageType:String?
enum CodingKeys: String, CodingKey {
case pageType = "pageType"
@ -763,11 +698,106 @@ struct RootMusicResponsiveListItemRenderer: Codable {
}
}
}
}
//
struct Menu: Codable {
let menuRenderer:MenuRenderer?
enum CodingKeys: String, CodingKey {
case menuRenderer = "menuRenderer"
}
init(from decoder: Decoder) throws {
let values = try decoder.container(keyedBy: CodingKeys.self)
menuRenderer = try values.decodeIfPresent(MenuRenderer.self, forKey: .menuRenderer)
}
struct MenuRenderer: Codable {
///
let items:[Item]?
enum CodingKeys: String, CodingKey {
case items = "items"
}
init(from decoder: Decoder) throws {
let values = try decoder.container(keyedBy: CodingKeys.self)
items = try values.decodeIfPresent([Item].self, forKey: .items)
}
struct Item: Codable {
///watchEndpoint
let menuNavigationItemRenderer:MenuNavigationItemRenderer?
enum CodingKeys: String, CodingKey {
case menuNavigationItemRenderer = "menuNavigationItemRenderer"
}
init(from decoder: Decoder) throws {
let values = try decoder.container(keyedBy: CodingKeys.self)
menuNavigationItemRenderer = try values.decodeIfPresent(MenuNavigationItemRenderer.self, forKey: .menuNavigationItemRenderer)
}
struct MenuNavigationItemRenderer: Codable {
///
let navigationEndpoint:NavigationEndpoint?
enum CodingKeys: String, CodingKey {
case navigationEndpoint = "navigationEndpoint"
}
init(from decoder: Decoder) throws {
let values = try decoder.container(keyedBy: CodingKeys.self)
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 {
///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)
}
}
}
}
}
}
}
}
}
}
////(ID)
/////(ID)
struct RootMusicTwoRowItemRenderer: Codable {
///
let thumbnailRenderer:ThumbnailRenderer?

View File

@ -20,9 +20,7 @@ class MPPositive_BrowseItemModel: NSObject, Codable {
var playListId:String?
///ID
var browseId:String?
///
var params:String?
///Id
///Id(pageType == MUSIC_PAGE_TYPE_ARTISTbrowseId)
var artistId:String?
///
var pageType:String?

View File

@ -72,7 +72,7 @@ class MPPositive_BaseViewController: MP_BaseViewController, UIGestureRecognizerD
}
//pop
@objc func popActionClick(_ sender:UIButton) {
MPPositive_Debouncer.shared.call {
MPPositive_Debouncer.shared.call(0.1) {
[weak self] in
guard let self = self else {return}
navigationController?.popViewController(animated: true)

View File

@ -137,7 +137,6 @@ class MPPositive_HomeViewController: MPPositive_BaseViewController, UIViewContro
func presentGuide() {
guard UserDefaults.standard.bool(forKey: "isGuide") != true else {
//
print("已经评论过了")
return
}
//3
@ -267,7 +266,7 @@ extension MPPositive_HomeViewController: UITableViewDataSource, UITableViewDeleg
cell.requestNextBlock = {
[weak self] (item) in
guard let self = self else {return}
MP_AnalyticsManager.shared.home_b_module_clickAction(MPPositive_BrowseLoadViewModel.shared.browseModuleLists[indexPath.section].title ?? "")
MP_AnalyticsManager.shared.home_b_module_clickAction(item.browseItem.pageType ?? "")
switch item.browseItem.itemType {
case .single:
///
@ -299,7 +298,7 @@ extension MPPositive_HomeViewController: UITableViewDataSource, UITableViewDeleg
case .list:
isFirstAppearance = false
//
let listVC = MPPositive_ListShowViewController(item.browseItem.browseId ?? "", params: item.browseItem.params ?? "", title: item.title ?? "", subtitle: item.subtitle ?? "")
let listVC = MPPositive_ListShowViewController(item.browseItem.browseId ?? "", params: "", title: item.title ?? "", subtitle: item.subtitle ?? "")
navigationController?.pushViewController(listVC, animated: true)
case .artist:
isFirstAppearance = false

View File

@ -166,7 +166,7 @@ extension MPPositive_MoreContentViewController: UICollectionViewDataSource, UICo
navigationController?.pushViewController(artistVC, animated: true)
default:
//
let listVC = MPPositive_ListShowViewController(browseModuleList.items[indexPath.row].browseItem.browseId ?? "", params: browseModuleList.items[indexPath.row].browseItem.params ?? "", title: browseModuleList.items[indexPath.row].title ?? "", subtitle: browseModuleList.items[indexPath.row].subtitle ?? "")
let listVC = MPPositive_ListShowViewController(browseModuleList.items[indexPath.row].browseItem.browseId ?? "", params: "", title: browseModuleList.items[indexPath.row].title ?? "", subtitle: browseModuleList.items[indexPath.row].subtitle ?? "")
navigationController?.pushViewController(listVC, animated: true)
}
}

View File

@ -36,27 +36,9 @@ class MPPositive_HomeSinglesTableViewCell: UITableViewCell, UIViewControllerTran
didSet{
titleLabel.text = browseViewModel.title
collectionView.reloadData()
// let groupSize = browseViewModel.items.count / 3 //
// var remainder = browseViewModel.items.count % 3 //
// let numberOfGroups = 3 //
// var groups = [[MPPositive_BrowseItemViewModel]]() //
// var start = 0
// for _ in 0..<numberOfGroups {
// let end = start + groupSize + (remainder > 0 ? 1 : 0)
// let group = Array(browseViewModel.items[start..<end])
// groups.append(group)
// start = end
// remainder -= 1
// }
// items = groups
}
}
///
// private var items:[[MPPositive_BrowseItemViewModel]] = []{
// didSet{
// collectionView.reloadData()
// }
// }
override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
super.init(style: style, reuseIdentifier: reuseIdentifier)
@ -143,6 +125,7 @@ extension MPPositive_HomeSinglesTableViewCell:UICollectionViewDataSource, UIColl
return
}
let item = self.browseViewModel.items[indexPath.row]
MP_AnalyticsManager.shared.home_b_module_clickAction(item.browseItem.pageType ?? "")
MP_AnalyticsManager.shared.song_clickAction("Home")
//
MP_PlayerManager.shared.loadPlayer = nil