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 content.musicCarouselShelfRenderer?.contents?.forEach({ content in
/// ///
if let musicResponsiveListItemRenderer = content.musicResponsiveListItemRenderer { 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 { }else if let musicTwoRowItemRenderer = content.musicTwoRowItemRenderer {
browse.items.append(.init(parsingMusicTwoRowItemRenderer(musicTwoRowItemRenderer))) browse.items.append(.init(parsingMusicTwoRowItemRenderer(musicTwoRowItemRenderer)))
} }
@ -1392,7 +1394,9 @@ extension MP_NetWorkManager {
content.musicCarouselShelfRenderer?.contents?.forEach({ content in content.musicCarouselShelfRenderer?.contents?.forEach({ content in
/// ///
if let musicResponsiveListItemRenderer = content.musicResponsiveListItemRenderer { 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 { }else if let musicTwoRowItemRenderer = content.musicTwoRowItemRenderer {
browse.items.append(.init(parsingMusicTwoRowItemRenderer(musicTwoRowItemRenderer))) browse.items.append(.init(parsingMusicTwoRowItemRenderer(musicTwoRowItemRenderer)))
} }
@ -1421,7 +1425,9 @@ extension MP_NetWorkManager {
musicPlaylistShelfRenderer.contents?.forEach({ content in musicPlaylistShelfRenderer.contents?.forEach({ content in
/// ///
if let musicResponsiveListItemRenderer = content.musicResponsiveListItemRenderer { 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 { }else if let musicTwoRowItemRenderer = content.musicTwoRowItemRenderer {
items.append(.init(parsingMusicTwoRowItemRenderer(musicTwoRowItemRenderer))) items.append(.init(parsingMusicTwoRowItemRenderer(musicTwoRowItemRenderer)))
} }
@ -1430,7 +1436,9 @@ extension MP_NetWorkManager {
musicShelfRenderer.contents?.forEach({ content in musicShelfRenderer.contents?.forEach({ content in
/// ///
if let musicResponsiveListItemRenderer = content.musicResponsiveListItemRenderer { 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 { }else if let musicTwoRowItemRenderer = content.musicTwoRowItemRenderer {
items.append(.init(parsingMusicTwoRowItemRenderer(musicTwoRowItemRenderer))) items.append(.init(parsingMusicTwoRowItemRenderer(musicTwoRowItemRenderer)))
} }
@ -1449,7 +1457,9 @@ extension MP_NetWorkManager {
musicPlaylistShelfRenderer.contents?.forEach({ content in musicPlaylistShelfRenderer.contents?.forEach({ content in
/// ///
if let musicResponsiveListItemRenderer = content.musicResponsiveListItemRenderer { 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 { }else if let musicTwoRowItemRenderer = content.musicTwoRowItemRenderer {
items.append(.init(parsingMusicTwoRowItemRenderer(musicTwoRowItemRenderer))) items.append(.init(parsingMusicTwoRowItemRenderer(musicTwoRowItemRenderer)))
} }
@ -1458,7 +1468,9 @@ extension MP_NetWorkManager {
musicShelfRenderer.contents?.forEach({ content in musicShelfRenderer.contents?.forEach({ content in
/// ///
if let musicResponsiveListItemRenderer = content.musicResponsiveListItemRenderer { 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 { }else if let musicTwoRowItemRenderer = content.musicTwoRowItemRenderer {
items.append(.init(parsingMusicTwoRowItemRenderer(musicTwoRowItemRenderer))) items.append(.init(parsingMusicTwoRowItemRenderer(musicTwoRowItemRenderer)))
} }
@ -1540,8 +1552,8 @@ extension MP_NetWorkManager {
params = musicShelfRenderer.title?.runs?.first?.navigationEndpoint?.browseEndpoint?.params params = musicShelfRenderer.title?.runs?.first?.navigationEndpoint?.browseEndpoint?.params
// //
musicShelfRenderer.contents?.forEach({ item in musicShelfRenderer.contents?.forEach({ item in
if item.musicResponsiveListItemRenderer != nil { if let musicResponsiveListItemRenderer = item.musicResponsiveListItemRenderer, let asd = parsingMusicResponsiveListItemRenderer(musicResponsiveListItemRenderer) {
itemViews.append(.init(parsingMusicResponsiveListItemRenderer(item.musicResponsiveListItemRenderer!))) itemViews.append(.init(asd))
} }
}) })
} }
@ -1573,7 +1585,9 @@ extension MP_NetWorkManager {
// //
musicPlaylistShelfRenderer.contents?.forEach({ item in musicPlaylistShelfRenderer.contents?.forEach({ item in
if let musicResponsiveListItemRenderer = item.musicResponsiveListItemRenderer { 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 continuation = musicPlaylistShelfRenderer.continuations?.first?.nextContinuationData?.continuation
@ -1601,7 +1615,9 @@ extension MP_NetWorkManager {
if let contents = musicPlaylistShelfContinuation.contents { if let contents = musicPlaylistShelfContinuation.contents {
contents.forEach { item in contents.forEach { item in
if let musicResponsiveListItemRenderer = item.musicResponsiveListItemRenderer { 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() let list = MPPositive_RecommendListViewModel()
list.title = section.musicCarouselShelfRenderer?.header?.musicCarouselShelfBasicHeaderRenderer?.title?.runs?.reduce("", { $0 + ($1.text ?? "")}) list.title = section.musicCarouselShelfRenderer?.header?.musicCarouselShelfBasicHeaderRenderer?.title?.runs?.reduce("", { $0 + ($1.text ?? "")})
section.musicCarouselShelfRenderer?.contents?.forEach({ content in section.musicCarouselShelfRenderer?.contents?.forEach({ content in
if content.musicResponsiveListItemRenderer != nil { if let musicResponsiveListItemRenderer = content.musicResponsiveListItemRenderer{
let item = parsingMusicResponsiveListItemRenderer(content.musicResponsiveListItemRenderer!) if let item = parsingMusicResponsiveListItemRenderer(musicResponsiveListItemRenderer) {
list.items.append(.init(item)) list.items.append(.init(item))
}
}else if content.musicTwoRowItemRenderer != nil { }else if content.musicTwoRowItemRenderer != nil {
let item = parsingMusicTwoRowItemRenderer(content.musicTwoRowItemRenderer!) let item = parsingMusicTwoRowItemRenderer(content.musicTwoRowItemRenderer!)
list.items.append(.init(item)) list.items.append(.init(item))
@ -1968,45 +1985,7 @@ extension MP_NetWorkManager {
// //
musicShelfRenderer.contents?.forEach({ content in musicShelfRenderer.contents?.forEach({ content in
///// /////
let item = MPPositive_BrowseItemModel() if let musicResponsiveListItemRenderer = content.musicResponsiveListItemRenderer, let item = parsingMusicResponsiveListItemRenderer(musicResponsiveListItemRenderer) {
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" {
resultList.previewItemViews.append(.init(item)) resultList.previewItemViews.append(.init(item))
} }
}) })
@ -2146,55 +2125,87 @@ extension MP_NetWorkManager {
return (array, continuation, clickTrackingParams) return (array, continuation, clickTrackingParams)
} }
//MARK: - //MARK: -
//musicResponsiveListItemRenderer //musicResponsiveListItemRenderer
private func parsingMusicResponsiveListItemRenderer(_ musicResponsiveListItemRenderer: RootMusicResponsiveListItemRenderer) -> MPPositive_BrowseItemModel { private func parsingMusicResponsiveListItemRenderer(_ musicResponsiveListItemRenderer: RootMusicResponsiveListItemRenderer) -> MPPositive_BrowseItemModel? {
// //
let item = MPPositive_BrowseItemModel() let item = MPPositive_BrowseItemModel()
// //
item.coverUrls = musicResponsiveListItemRenderer.thumbnail?.musicThumbnailRenderer?.thumbnail?.thumbnails?.compactMap({$0.url}) 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 { if let playlistItemData = musicResponsiveListItemRenderer.playlistItemData {
// ///
item.itemType = .single item.itemType = .single
item.videoId = playlistItemData.videoId item.videoId = playlistItemData.videoId
item.pageType = "MUSIC_VIDEO_TYPE_ATV" //
} guard var flexColumns = musicResponsiveListItemRenderer.flexColumns, flexColumns.isEmpty != true else {
if let navigationEndpoint = musicResponsiveListItemRenderer.navigationEndpoint { return nil
//
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
}
} }
//,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 { private func parsingMusicTwoRowItemRenderer(_ musicTwoRowItemRenderer: RootMusicTwoRowItemRenderer) -> MPPositive_BrowseItemModel {
// //
let item = MPPositive_BrowseItemModel() let item = MPPositive_BrowseItemModel()
@ -2224,7 +2235,6 @@ extension MP_NetWorkManager {
item.itemType = .list item.itemType = .list
item.pageType = browseEndpoint.browseEndpointContextSupportedConfigs?.browseEndpointContextMusicConfig?.pageType item.pageType = browseEndpoint.browseEndpointContextSupportedConfigs?.browseEndpointContextMusicConfig?.pageType
item.browseId = browseEndpoint.browseId item.browseId = browseEndpoint.browseId
item.params = browseEndpoint.params
} }
} }
return item return item

View File

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

View File

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

View File

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

View File

@ -137,7 +137,6 @@ class MPPositive_HomeViewController: MPPositive_BaseViewController, UIViewContro
func presentGuide() { func presentGuide() {
guard UserDefaults.standard.bool(forKey: "isGuide") != true else { guard UserDefaults.standard.bool(forKey: "isGuide") != true else {
// //
print("已经评论过了")
return return
} }
//3 //3
@ -267,7 +266,7 @@ extension MPPositive_HomeViewController: UITableViewDataSource, UITableViewDeleg
cell.requestNextBlock = { cell.requestNextBlock = {
[weak self] (item) in [weak self] (item) in
guard let self = self else {return} 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 { switch item.browseItem.itemType {
case .single: case .single:
/// ///
@ -299,7 +298,7 @@ extension MPPositive_HomeViewController: UITableViewDataSource, UITableViewDeleg
case .list: case .list:
isFirstAppearance = false 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) navigationController?.pushViewController(listVC, animated: true)
case .artist: case .artist:
isFirstAppearance = false isFirstAppearance = false

View File

@ -166,7 +166,7 @@ extension MPPositive_MoreContentViewController: UICollectionViewDataSource, UICo
navigationController?.pushViewController(artistVC, animated: true) navigationController?.pushViewController(artistVC, animated: true)
default: 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) navigationController?.pushViewController(listVC, animated: true)
} }
} }

View File

@ -36,27 +36,9 @@ class MPPositive_HomeSinglesTableViewCell: UITableViewCell, UIViewControllerTran
didSet{ didSet{
titleLabel.text = browseViewModel.title titleLabel.text = browseViewModel.title
collectionView.reloadData() 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?) { override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
super.init(style: style, reuseIdentifier: reuseIdentifier) super.init(style: style, reuseIdentifier: reuseIdentifier)
@ -143,6 +125,7 @@ extension MPPositive_HomeSinglesTableViewCell:UICollectionViewDataSource, UIColl
return return
} }
let item = self.browseViewModel.items[indexPath.row] let item = self.browseViewModel.items[indexPath.row]
MP_AnalyticsManager.shared.home_b_module_clickAction(item.browseItem.pageType ?? "")
MP_AnalyticsManager.shared.song_clickAction("Home") MP_AnalyticsManager.shared.song_clickAction("Home")
// //
MP_PlayerManager.shared.loadPlayer = nil MP_PlayerManager.shared.loadPlayer = nil