对B面bug的处理,以及部分性能优化,优化节点-进度条拖动问题

This commit is contained in:
Mr.zhou 2024-06-05 09:56:35 +08:00
parent da3177eb27
commit 88bf10f284
20 changed files with 242 additions and 126 deletions

View File

@ -612,9 +612,9 @@
CBAFCA3C2C0A10500054500E /* JsonStructs(js文件结构) */ = { CBAFCA3C2C0A10500054500E /* JsonStructs(js文件结构) */ = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
CBAFCA322C0A10500054500E /* MPPositive_JsonBrowse.swift */,
CBAFCA302C0A10500054500E /* MPPositive_JsonArtist.swift */, CBAFCA302C0A10500054500E /* MPPositive_JsonArtist.swift */,
CBAFCA312C0A10500054500E /* MPPositive_JsonArtistMore.swift */, CBAFCA312C0A10500054500E /* MPPositive_JsonArtistMore.swift */,
CBAFCA322C0A10500054500E /* MPPositive_JsonBrowse.swift */,
CBAFCA332C0A10500054500E /* MPPositive_JsonListAlbum.swift */, CBAFCA332C0A10500054500E /* MPPositive_JsonListAlbum.swift */,
CBAFCA342C0A10500054500E /* MPPositive_JsonLyrics.swift */, CBAFCA342C0A10500054500E /* MPPositive_JsonLyrics.swift */,
CBAFCA352C0A10500054500E /* MPPositive_JsonNext.swift */, CBAFCA352C0A10500054500E /* MPPositive_JsonNext.swift */,
@ -682,8 +682,8 @@
CBAFCA5E2C0A10500054500E /* ViewModels */ = { CBAFCA5E2C0A10500054500E /* ViewModels */ = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
CBAFCA572C0A10500054500E /* ListViewModels */,
CBAFCA5D2C0A10500054500E /* LoadViewModels */, CBAFCA5D2C0A10500054500E /* LoadViewModels */,
CBAFCA572C0A10500054500E /* ListViewModels */,
); );
path = ViewModels; path = ViewModels;
sourceTree = "<group>"; sourceTree = "<group>";
@ -692,8 +692,8 @@
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
CBAFCA3C2C0A10500054500E /* JsonStructs(js文件结构) */, CBAFCA3C2C0A10500054500E /* JsonStructs(js文件结构) */,
CBAFCA472C0A10500054500E /* Models */,
CBAFCA5E2C0A10500054500E /* ViewModels */, CBAFCA5E2C0A10500054500E /* ViewModels */,
CBAFCA472C0A10500054500E /* Models */,
); );
path = Models; path = Models;
sourceTree = "<group>"; sourceTree = "<group>";
@ -822,13 +822,13 @@
CBAFCA9F2C0A10500054500E /* Search */ = { CBAFCA9F2C0A10500054500E /* Search */ = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
CBAFCA982C0A10500054500E /* MPPositive_SearchResultPreviewShowView.swift */,
CBAFCA992C0A10500054500E /* MPPositive_SearchResultShowTableViewCell.swift */,
CBAFCA9A2C0A10500054500E /* MPPositive_SearchResultsShowView.swift */,
CBAFCA9B2C0A10500054500E /* MPPositive_SearchResultTypeShowView.swift */,
CBAFCA9C2C0A10500054500E /* MPPositive_SearchSuggestionItemTableViewCell.swift */,
CBAFCA9D2C0A10500054500E /* MPPositive_SearchSuggestionsView.swift */,
CBAFCA9E2C0A10500054500E /* MPPositive_SearchTagCollectionViewCell.swift */, CBAFCA9E2C0A10500054500E /* MPPositive_SearchTagCollectionViewCell.swift */,
CBAFCA9D2C0A10500054500E /* MPPositive_SearchSuggestionsView.swift */,
CBAFCA9A2C0A10500054500E /* MPPositive_SearchResultsShowView.swift */,
CBAFCA982C0A10500054500E /* MPPositive_SearchResultPreviewShowView.swift */,
CBAFCA9B2C0A10500054500E /* MPPositive_SearchResultTypeShowView.swift */,
CBAFCA992C0A10500054500E /* MPPositive_SearchResultShowTableViewCell.swift */,
CBAFCA9C2C0A10500054500E /* MPPositive_SearchSuggestionItemTableViewCell.swift */,
); );
path = Search; path = Search;
sourceTree = "<group>"; sourceTree = "<group>";
@ -1541,9 +1541,10 @@
buildSettings = { buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
CODE_SIGN_STYLE = Manual; CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 4; CURRENT_PROJECT_VERSION = 4;
DEVELOPMENT_TEAM = ""; DEVELOPMENT_TEAM = T93S37G27F;
GENERATE_INFOPLIST_FILE = YES; GENERATE_INFOPLIST_FILE = YES;
INFOPLIST_FILE = relax.offline.mp3.music/Info.plist; INFOPLIST_FILE = relax.offline.mp3.music/Info.plist;
INFOPLIST_KEY_CFBundleDisplayName = Musiclax; INFOPLIST_KEY_CFBundleDisplayName = Musiclax;
@ -1580,9 +1581,10 @@
buildSettings = { buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
CODE_SIGN_STYLE = Manual; CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 4; CURRENT_PROJECT_VERSION = 4;
DEVELOPMENT_TEAM = ""; DEVELOPMENT_TEAM = T93S37G27F;
GENERATE_INFOPLIST_FILE = YES; GENERATE_INFOPLIST_FILE = YES;
INFOPLIST_FILE = relax.offline.mp3.music/Info.plist; INFOPLIST_FILE = relax.offline.mp3.music/Info.plist;
INFOPLIST_KEY_CFBundleDisplayName = Musiclax; INFOPLIST_KEY_CFBundleDisplayName = Musiclax;

View File

@ -31,68 +31,68 @@ class MP_LunchViewController: UIViewController {
timer.add(to: RunLoop.current, forMode: .common) timer.add(to: RunLoop.current, forMode: .common)
//idfa //idfa
_ = requestTrackingAuthorization(self) _ = requestTrackingAuthorization(self)
MP_AnalyticsManager.shared.getOpenStatus { [weak self] open in // MP_AnalyticsManager.shared.getOpenStatus { [weak self] open in
guard let self = self else {return} // guard let self = self else {return}
if open { // if open {
//ip // //ip
MP_NetWorkManager.shared.requestIPInfo { statu in // MP_NetWorkManager.shared.requestIPInfo { statu in
if statu == true { // if statu == true {
//b // //b
print("BLog") // print("BLog")
self.completionBlock = { // self.completionBlock = {
DispatchQueue.main.async { // DispatchQueue.main.async {
[weak self] in // [weak self] in
guard let self = self else {return} // guard let self = self else {return}
// // //
timer.isPaused = true // timer.isPaused = true
// // //
accessAppdelegate.switch_positive() // accessAppdelegate.switch_positive()
} // }
} // }
}else { // }else {
print("ALog") // print("ALog")
//A // //A
self.completionBlock = { // self.completionBlock = {
DispatchQueue.main.async { // DispatchQueue.main.async {
[weak self] in // [weak self] in
guard let self = self else {return} // guard let self = self else {return}
// // //
timer.isPaused = true // timer.isPaused = true
// // //
accessAppdelegate.switch_aSide() // accessAppdelegate.switch_aSide()
} // }
} // }
} // }
} // }
}else { // }else {
print("ALog") // print("ALog")
//A // //A
completionBlock = { // completionBlock = {
DispatchQueue.main.async { // DispatchQueue.main.async {
[weak self] in // [weak self] in
guard let self = self else {return} // guard let self = self else {return}
// // //
timer.isPaused = true // timer.isPaused = true
// // //
accessAppdelegate.switch_aSide() // accessAppdelegate.switch_aSide()
} // }
} // }
}
}
//
timer.isPaused = false
// self.completionBlock = {
// DispatchQueue.main.async {
// [weak self] in
// guard let self = self else {return}
// //
// timer.isPaused = true
// //
// accessAppdelegate.switch_positive()
// //
// MPPositive_BrowseLoadViewModel.shared.reloadBrowseLists()
// } // }
// } // }
//
timer.isPaused = false
self.completionBlock = {
DispatchQueue.main.async {
[weak self] in
guard let self = self else {return}
//
timer.isPaused = true
//
accessAppdelegate.switch_positive()
//
MPPositive_BrowseLoadViewModel.shared.reloadBrowseLists()
}
}
} }
deinit { deinit {
// //

View File

@ -98,7 +98,7 @@ func improveDataforLycirsAndRelated(_ song:MPPositive_SongItemModel, completion:
} }
} }
///player ///player
func improveDataforResouceAndCover(_ song:MPPositive_SongItemModel, completion:@escaping((([String],[Int],[String]), [String]?) -> Void)) { func improveDataforResouceAndCover(_ song:MPPositive_SongItemModel, completion:@escaping((([String],[Int],[String])?, [String]?) -> Void)) {
//player //player
MP_NetWorkManager.shared.requestAndroidPlayer(song.videoId, playlistId: "") { resourceUrls, coverUrls in MP_NetWorkManager.shared.requestAndroidPlayer(song.videoId, playlistId: "") { resourceUrls, coverUrls in
completion(resourceUrls,coverUrls) completion(resourceUrls,coverUrls)

View File

@ -59,7 +59,8 @@ class MP_AnalyticsManager: NSObject {
super.init() super.init()
Crashlytics.crashlytics().log(app_crash) Crashlytics.crashlytics().log(app_crash)
// //
// remoteConfig.setDefaults(["openStatus":false as NSObject]) remoteConfig.setDefaults(["versionCode":app_Version as NSObject,
"enter":false as NSObject])
} }
//MARK: - A/B //MARK: - A/B
func getOpenStatus(_ completion:@escaping ((Bool) -> Void)) { func getOpenStatus(_ completion:@escaping ((Bool) -> Void)) {

View File

@ -19,7 +19,29 @@ class MP_NetWorkManager: NSObject {
static let shared = MP_NetWorkManager() static let shared = MP_NetWorkManager()
//MARK: - //MARK: -
/// ///
private let MPSession = Alamofire.Session(interceptor: MP_CustomRetrier()) private lazy var MPSession:Session = {
let configuration = URLSessionConfiguration.af.default
//4
configuration.timeoutIntervalForRequest = 30
configuration.timeoutIntervalForResource = 30
return Alamofire.Session(configuration: configuration, interceptor: MP_CustomRetrier())
}()
///
private lazy var PlayerSeesion:Session = {
let configuration = URLSessionConfiguration.af.default
configuration.timeoutIntervalForRequest = 30
configuration.timeoutIntervalForResource = 30
//4
configuration.httpMaximumConnectionsPerHost = 4
return Alamofire.Session(configuration: configuration, interceptor: MP_CustomRetrier())
}()
///
private var playerRequests: [PlayerRequest] = []
///
struct PlayerRequest {
let request: DataRequest
let onCancel: (() -> Void)
}
//MARK: - API //MARK: - API
///IP ///IP
private let iPInfo:String = "https://api.tikustok.com/app/common/getIPInfo" private let iPInfo:String = "https://api.tikustok.com/app/common/getIPInfo"
@ -631,7 +653,7 @@ extension MP_NetWorkManager {
//MARK: - player //MARK: - player
/// Player(/) /// Player(/)
/// - Parameter item: /// - Parameter item:
func requestAndroidPlayer(_ videoId: String, playlistId: String, completion:@escaping ((([String],[Int],[String]), [String]?) -> Void)){ func requestAndroidPlayer(_ videoId: String, playlistId: String, completion:@escaping ((([String],[Int],[String])?, [String]?) -> Void)){
//player //player
let path = header+point+player let path = header+point+player
//url //url
@ -650,12 +672,6 @@ extension MP_NetWorkManager {
"clientVersion": "\(day.month).\(day.toString(.custom("dd"))).1", "clientVersion": "\(day.month).\(day.toString(.custom("dd"))).1",
"platform":"MOBILE", "platform":"MOBILE",
"browserVersion":"125.0.0.0", "browserVersion":"125.0.0.0",
// "userAgent":
// "clientName": "ANDROID_MUSIC",
// "clientVersion": "5.28.1",
// "platform": "MOBILE",
// "androidSdkVersion":"30",
// "userAgent": "com.google.android.apps.youtube.music/5.28.1 (Linux; U; Android 11) gzip"
] ]
] ]
@ -665,11 +681,20 @@ extension MP_NetWorkManager {
completion(resourceUlrs, coverUrls) completion(resourceUlrs, coverUrls)
} }
} }
private func requestAndroidPostPlayer(_ url:URL, parameters:Parameters, completion:@escaping((([String],[Int],[String]), [String]?) -> Void)) { private func requestAndroidPostPlayer(_ url:URL, parameters:Parameters, completion:@escaping((([String],[Int],[String])?, [String]?) -> Void)) {
//
playerRequests = playerRequests.filter({$0.request.task?.state == .running})
//
if playerRequests.count >= 4, let requestToCancel = playerRequests.first {
requestToCancel.request.cancel()
//
requestToCancel.onCancel()
playerRequests.removeFirst()
print("取消多余的Player资源请求: \(requestToCancel)")
}
//post //post
MPSession.request(url, method: .post, parameters: parameters, encoding: JSONEncoding.default).responseDecodable(of: JsonAndroidPlayer.self) { [weak self] (response) in let request = PlayerSeesion.request(url, method: .post, parameters: parameters, encoding: JSONEncoding.default).responseDecodable(of: JsonAndroidPlayer.self) { [weak self] (response) in
guard let self = self else {return} guard let self = self else {return}
switch response.result { switch response.result {
case .success(let value): case .success(let value):
parsingAndroidPlayer(value) { resourceUlrs, coverUrls in parsingAndroidPlayer(value) { resourceUlrs, coverUrls in
@ -680,6 +705,10 @@ extension MP_NetWorkManager {
handleError(url, error: error) handleError(url, error: error)
} }
} }
//
playerRequests.append(.init(request: request, onCancel: {
completion(nil,nil)
}))
} }
// func requestPlayer(_ videoId: String, playlistId: String, completion:@escaping ((([String],[Float],[String]), [String]?) -> Void)){ // func requestPlayer(_ videoId: String, playlistId: String, completion:@escaping ((([String],[Float],[String]), [String]?) -> Void)){
// //player // //player

View File

@ -69,15 +69,36 @@ class MP_PlayerManager:NSObject{
private var queue:DispatchQueue? private var queue:DispatchQueue?
///load ///load
var loadPlayer:MPPositive_PlayerLoadViewModel!{ var loadPlayer:MPPositive_PlayerLoadViewModel!{
didSet{ willSet{
if loadPlayer != nil { DispatchQueue.main.async {
//load [weak self] in
NotificationCenter.notificationKey.post(notificationName: .pup_bottom_show) guard let self = self else {return}
}else { guard loadPlayer != nil else {
//load if newValue != nil {
NotificationCenter.notificationKey.post(notificationName: .player_delete_list) //load
playState = .Null NotificationCenter.notificationKey.post(notificationName: .pup_bottom_show)
player.pause() }
return
}
if newValue != nil {
//load
NotificationCenter.notificationKey.post(notificationName: .pup_bottom_show)
}else {
//load
NotificationCenter.notificationKey.post(notificationName: .player_delete_list)
playState = .Null
player.pause()
center?.playCommand.removeTarget(self)
center?.pauseCommand.removeTarget(self)
center?.nextTrackCommand.removeTarget(self)
center?.previousTrackCommand.removeTarget(self)
center = nil
do {
try AVAudioSession.sharedInstance().setActive(false)
} catch {
print("Error deactivating audio session: \(error)")
}
}
} }
} }
} }
@ -194,10 +215,8 @@ class MP_PlayerManager:NSObject{
if startAction != nil { if startAction != nil {
startActionBlock = startAction startActionBlock = startAction
} }
//
let newItem = loadPlayer.currentVideo.resourcePlayerItem
//playerItem //playerItem
player.replaceCurrentItem(with: newItem) player.replaceCurrentItem(with: loadPlayer?.currentVideo?.resourcePlayerItem)
if center == nil { if center == nil {
setCommandCenter() setCommandCenter()
} }
@ -206,11 +225,11 @@ class MP_PlayerManager:NSObject{
//PlayerItem //PlayerItem
if loadPlayer.currentVideo?.isKVO == false { if loadPlayer.currentVideo?.isKVO == false {
// //
newItem?.addObserver(self, forKeyPath: "status", options: [.old,.new], context: nil) loadPlayer?.currentVideo?.resourcePlayerItem?.addObserver(self, forKeyPath: "status", options: [.old,.new], context: nil)
// //
newItem?.addObserver(self, forKeyPath: "loadedTimeRanges", options: [.old,.new], context: nil) loadPlayer?.currentVideo?.resourcePlayerItem?.addObserver(self, forKeyPath: "loadedTimeRanges", options: [.old,.new], context: nil)
// //
newItem?.addObserver(self, forKeyPath: "playbackLikelyToKeepUp", options: [.old,.new], context: nil) loadPlayer?.currentVideo?.resourcePlayerItem?.addObserver(self, forKeyPath: "playbackLikelyToKeepUp", options: [.old,.new], context: nil)
loadPlayer.currentVideo.isKVO = true loadPlayer.currentVideo.isKVO = true
//0 //0
player.seek(to: .zero) player.seek(to: .zero)
@ -262,7 +281,7 @@ class MP_PlayerManager:NSObject{
// //
if playState != .Playing { if playState != .Playing {
//statuVlaueplayerItem //statuVlaueplayerItem
print("当前音乐-\(loadPlayer.currentVideo?.title ?? "") 已经准备好播放") print("当前音乐-\(loadPlayer?.currentVideo?.title ?? "") 已经准备好播放")
// if playState != .Playing { // if playState != .Playing {
// player.play() // player.play()
// playState = .Playing // playState = .Playing
@ -295,8 +314,8 @@ class MP_PlayerManager:NSObject{
suspendTimer() suspendTimer()
let times = Int(self.times) let times = Int(self.times)
let msTimes = times*1000 let msTimes = times*1000
MP_AnalyticsManager.shared.player_b_delay_actionAction(loadPlayer.currentVideo?.song.videoId ?? "", videoname: loadPlayer.currentVideo?.title ?? "", artistname: loadPlayer.currentVideo?.song.shortBylineText ?? "", delay: "\(msTimes)ms") MP_AnalyticsManager.shared.player_b_delay_actionAction(loadPlayer?.currentVideo?.song.videoId ?? "", videoname: loadPlayer?.currentVideo?.title ?? "", artistname: loadPlayer?.currentVideo?.song.shortBylineText ?? "", delay: "\(msTimes)ms")
MP_AnalyticsManager.shared.player_b_success_actionAction(loadPlayer.currentVideo?.song.videoId ?? "", videoname: loadPlayer.currentVideo?.title ?? "", artistname: loadPlayer.currentVideo?.song.shortBylineText ?? "") MP_AnalyticsManager.shared.player_b_success_actionAction(loadPlayer?.currentVideo?.song.videoId ?? "", videoname: loadPlayer?.currentVideo?.title ?? "", artistname: loadPlayer?.currentVideo?.song.shortBylineText ?? "")
// //
if startActionBlock != nil { if startActionBlock != nil {
startActionBlock!() startActionBlock!()

View File

@ -44,6 +44,7 @@ class MPPositive_SongViewModel: NSObject {
configure() configure()
} }
deinit { deinit {
print("\(title ?? "")已经销毁了")
resourcePlayerItem = nil resourcePlayerItem = nil
resourcePlayerAsset = nil resourcePlayerAsset = nil
resourcePlayerURL = nil resourcePlayerURL = nil

View File

@ -15,7 +15,7 @@ class MPPositive_PlayerLoadViewModel: NSObject {
///ViewModel ///ViewModel
var currentVideo:MPPositive_SongViewModel!{ var currentVideo:MPPositive_SongViewModel!{
willSet{ willSet{
DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) { DispatchQueue.main.asyncAfter(deadline: .now()) {
[weak self] in [weak self] in
guard let self = self else {return} guard let self = self else {return}
if newValue != nil { if newValue != nil {
@ -123,9 +123,11 @@ class MPPositive_PlayerLoadViewModel: NSObject {
// //
// //
improveDataforResouceAndCover(item) {[weak self] resourceUrls, coverUrls in improveDataforResouceAndCover(item) {[weak self] resourceUrls, coverUrls in
item.resourceUrls = resourceUrls.0 if let resourceUrls = resourceUrls {
item.itags = resourceUrls.1 item.resourceUrls = resourceUrls.0
item.mimeTypes = resourceUrls.2 item.itags = resourceUrls.1
item.mimeTypes = resourceUrls.2
}
item.coverUrls = coverUrls item.coverUrls = coverUrls
//,ViewModellistViewVideos //,ViewModellistViewVideos
self?.listViewVideos.append(.init(item)) self?.listViewVideos.append(.init(item))
@ -147,9 +149,11 @@ class MPPositive_PlayerLoadViewModel: NSObject {
// //
improveDataforResouceAndCover(currentVideo.song) {[weak self] resourceUrls, coverUrls in improveDataforResouceAndCover(currentVideo.song) {[weak self] resourceUrls, coverUrls in
guard let self = self else {return} guard let self = self else {return}
currentVideo.song.resourceUrls = resourceUrls.0 if let resourceUrls = resourceUrls {
currentVideo.song.itags = resourceUrls.1 currentVideo.song.resourceUrls = resourceUrls.0
currentVideo.song.mimeTypes = resourceUrls.2 currentVideo.song.itags = resourceUrls.1
currentVideo.song.mimeTypes = resourceUrls.2
}
//listViewVideos //listViewVideos
listViewVideos.forEach({ item in listViewVideos.forEach({ item in
if item.song.videoId == self.currentVideo.song.videoId { if item.song.videoId == self.currentVideo.song.videoId {

View File

@ -75,6 +75,7 @@ class MPPositive_MoreSongOperationsViewController: UIViewController {
} }
var removeBlock:(() -> Void)? var removeBlock:(() -> Void)?
var disMissBlock:(() -> Void)? var disMissBlock:(() -> Void)?
var collectionBlock:(() -> Void)?
init(_ song:MPPositive_SongItemModel) { init(_ song:MPPositive_SongItemModel) {
super.init(nibName: nil, bundle: nil) super.init(nibName: nil, bundle: nil)
DispatchQueue.main.async { DispatchQueue.main.async {
@ -169,6 +170,9 @@ class MPPositive_MoreSongOperationsViewController: UIViewController {
MPPositive_LoadCoreModel.shared.reloadCollectionSongViewModel(nil) MPPositive_LoadCoreModel.shared.reloadCollectionSongViewModel(nil)
MP_AnalyticsManager.shared.player_b_love_clickAction(song.videoId, videoname: song.title ?? "", artistname: song.shortBylineText ?? "") MP_AnalyticsManager.shared.player_b_love_clickAction(song.videoId, videoname: song.title ?? "", artistname: song.shortBylineText ?? "")
} }
if collectionBlock != nil {
collectionBlock!()
}
} }
} }
//MARK: - tableView //MARK: - tableView

View File

@ -83,9 +83,11 @@ extension MPPositive_LoveSongsViewController: UITableViewDataSource, UITableView
group.enter() group.enter()
// //
improveDataforResouceAndCover(first) {[weak self] resourceUrls, coverUrls in improveDataforResouceAndCover(first) {[weak self] resourceUrls, coverUrls in
first.resourceUrls = resourceUrls.0 if let resourceUrls = resourceUrls {
first.itags = resourceUrls.1 first.resourceUrls = resourceUrls.0
first.mimeTypes = resourceUrls.2 first.itags = resourceUrls.1
first.mimeTypes = resourceUrls.2
}
first.coverUrls = coverUrls first.coverUrls = coverUrls
group.leave() group.leave()
} }
@ -99,6 +101,9 @@ extension MPPositive_LoveSongsViewController: UITableViewDataSource, UITableView
moreVC.disMissBlock = { moreVC.disMissBlock = {
self?.reload() self?.reload()
} }
moreVC.collectionBlock = {
self?.reload()
}
moreVC.transitioningDelegate = self moreVC.transitioningDelegate = self
moreVC.modalPresentationStyle = .custom moreVC.modalPresentationStyle = .custom
self?.present(moreVC, animated: true) self?.present(moreVC, animated: true)

View File

@ -250,9 +250,11 @@ extension MPPositive_ArtistShowViewController: JXPagingViewDelegate{
group.enter() group.enter()
// //
improveDataforResouceAndCover(first) {[weak self] resourceUrls, coverUrls in improveDataforResouceAndCover(first) {[weak self] resourceUrls, coverUrls in
first.resourceUrls = resourceUrls.0 if let resourceUrls = resourceUrls {
first.itags = resourceUrls.1 first.resourceUrls = resourceUrls.0
first.mimeTypes = resourceUrls.2 first.itags = resourceUrls.1
first.mimeTypes = resourceUrls.2
}
first.coverUrls = coverUrls first.coverUrls = coverUrls
group.leave() group.leave()
} }

View File

@ -320,9 +320,11 @@ extension MPPositive_ListShowViewController: UITableViewDataSource, UITableViewD
group.enter() group.enter()
// //
improveDataforResouceAndCover(first) {[weak self] resourceUrls, coverUrls in improveDataforResouceAndCover(first) {[weak self] resourceUrls, coverUrls in
first.resourceUrls = resourceUrls.0 if let resourceUrls = resourceUrls {
first.itags = resourceUrls.1 first.resourceUrls = resourceUrls.0
first.mimeTypes = resourceUrls.2 first.itags = resourceUrls.1
first.mimeTypes = resourceUrls.2
}
first.coverUrls = coverUrls first.coverUrls = coverUrls
group.leave() group.leave()
} }

View File

@ -88,6 +88,9 @@ extension MPPositive_PlayerListShowViewController: UITableViewDataSource, UITabl
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
// //
dismiss(animated: true) { dismiss(animated: true) {
guard MP_PlayerManager.shared.loadPlayer?.songVideos[indexPath.row].videoId != MP_PlayerManager.shared.loadPlayer?.currentVideo?.song.videoId else {
return
}
// //
MP_PlayerManager.shared.loadPlayer.improveData(MP_PlayerManager.shared.loadPlayer.songVideos[indexPath.row].videoId) MP_PlayerManager.shared.loadPlayer.improveData(MP_PlayerManager.shared.loadPlayer.songVideos[indexPath.row].videoId)
} }

View File

@ -259,9 +259,11 @@ extension MPPositive_RecommendViewController: JXSegmentedListContainerViewDataSo
group.enter() group.enter()
// //
improveDataforResouceAndCover(first) {[weak self] resourceUrls, coverUrls in improveDataforResouceAndCover(first) {[weak self] resourceUrls, coverUrls in
first.resourceUrls = resourceUrls.0 if let resourceUrls = resourceUrls {
first.itags = resourceUrls.1 first.resourceUrls = resourceUrls.0
first.mimeTypes = resourceUrls.2 first.itags = resourceUrls.1
first.mimeTypes = resourceUrls.2
}
first.coverUrls = coverUrls first.coverUrls = coverUrls
group.leave() group.leave()
} }

View File

@ -148,9 +148,11 @@ class MPPositive_SearchResultShowViewController: MPPositive_BaseViewController,
group.enter() group.enter()
// //
improveDataforResouceAndCover(first) {[weak self] resourceUrls, coverUrls in improveDataforResouceAndCover(first) {[weak self] resourceUrls, coverUrls in
first.resourceUrls = resourceUrls.0 if let resourceUrls = resourceUrls {
first.itags = resourceUrls.1 first.resourceUrls = resourceUrls.0
first.mimeTypes = resourceUrls.2 first.itags = resourceUrls.1
first.mimeTypes = resourceUrls.2
}
first.coverUrls = coverUrls first.coverUrls = coverUrls
group.leave() group.leave()
} }

View File

@ -40,6 +40,8 @@ class MPPositive_PlayerListShowTableViewCell: UITableViewCell {
coverImageView.kf.setImage(with: URL(string: song.reviewUrls?.first ?? ""), placeholder: placeholderImage) coverImageView.kf.setImage(with: URL(string: song.reviewUrls?.first ?? ""), placeholder: placeholderImage)
titleLabel.text = song.title titleLabel.text = song.title
subtitleLabel.text = song.shortBylineText subtitleLabel.text = song.shortBylineText
//
removeBtn.isHidden = (song.videoId == MP_PlayerManager.shared.loadPlayer?.currentVideo?.song.videoId)
} }
} }
var removeBlock:(() -> Void)? var removeBlock:(() -> Void)?

View File

@ -8,6 +8,10 @@
import UIKit import UIKit
///b ///b
class MPPositive_PlayerSilder: UISlider { class MPPositive_PlayerSilder: UISlider {
///
var hitTestEdgeInsets: UIEdgeInsets = UIEdgeInsets(top: -20, left: -20, bottom: -20, right: -20)
/// Slider
var originalFrame: CGRect?
// //
var thumbImage:UIImage = .init(named: "Player_Slider'logo")! var thumbImage:UIImage = .init(named: "Player_Slider'logo")!
// //
@ -26,6 +30,11 @@ class MPPositive_PlayerSilder: UISlider {
super.init(frame: frame) super.init(frame: frame)
setUpLayout() setUpLayout()
} }
override func awakeFromNib() {
super.awakeFromNib()
print("调整Slider大小")
originalFrame = self.frame
}
required init?(coder: NSCoder) { required init?(coder: NSCoder) {
super.init(coder: coder) super.init(coder: coder)
@ -122,4 +131,16 @@ class MPPositive_PlayerSilder: UISlider {
override func trackRect(forBounds bounds: CGRect) -> CGRect { override func trackRect(forBounds bounds: CGRect) -> CGRect {
return CGRect(x: 0, y: 0, width: bounds.width, height: self.trackHeight) return CGRect(x: 0, y: 0, width: bounds.width, height: self.trackHeight)
} }
//MARK: -
//
override func point(inside point: CGPoint, with event: UIEvent?) -> Bool {
//Slider
let largerFrame: CGRect = self.bounds.inset(by: hitTestEdgeInsets)
//
let isInside = largerFrame.contains(point)
return true
}
//slider
} }

View File

@ -13,6 +13,7 @@ class MPPositive_SearchResultShowTableViewCell: UITableViewCell {
let imageView:UIImageView = .init() let imageView:UIImageView = .init()
imageView.contentMode = .scaleAspectFill imageView.contentMode = .scaleAspectFill
imageView.layer.masksToBounds = true imageView.layer.masksToBounds = true
imageView.layer.cornerRadius = 10*width
return imageView return imageView
}() }()
private lazy var titleLabel:UILabel = createLabel(font: .systemFont(ofSize: 14*width, weight: .regular), textColor: .white, textAlignment: .left) private lazy var titleLabel:UILabel = createLabel(font: .systemFont(ofSize: 14*width, weight: .regular), textColor: .white, textAlignment: .left)

View File

@ -56,6 +56,8 @@ class MPPositive_SearchResultTypeShowView: UIView, JXSegmentedListContainerViewL
} }
var scrollBlock:(() -> Void)? var scrollBlock:(() -> Void)?
var moreBlock:((MPPositive_SearchResultItemViewModel) -> Void)? var moreBlock:((MPPositive_SearchResultItemViewModel) -> Void)?
//
var chooseItemBlock:((MPPositive_SearchResultItemViewModel) -> Void)?
init(frame: CGRect, list:MPPositive_SearchResultListViewModel) { init(frame: CGRect, list:MPPositive_SearchResultListViewModel) {
super.init(frame: frame) super.init(frame: frame)
backgroundColor = .init(hex: "1A1A1A") backgroundColor = .init(hex: "1A1A1A")
@ -118,4 +120,9 @@ extension MPPositive_SearchResultTypeShowView:UITableViewDataSource, UITableView
func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat { func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
return 0 return 0
} }
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
if chooseItemBlock != nil {
chooseItemBlock!(sectionList.allItemViews[indexPath.row])
}
}
} }

View File

@ -173,6 +173,15 @@ extension MPPositive_SearchResultsShowView: JXSegmentedListContainerViewDataSour
moreBlock!(itemView) moreBlock!(itemView)
} }
} }
showView.chooseItemBlock = {
[weak self] item in
guard let self = self else {
return
}
if chooseItemBlock != nil {
chooseItemBlock!(item)
}
}
return showView return showView
} }
} }