b面1.0.4上架版本(bug修复,优化功能)

This commit is contained in:
Mr.zhou 2024-06-06 18:43:34 +08:00
parent a9c62a68f6
commit 716180557b
34 changed files with 518 additions and 344 deletions

View File

@ -45,7 +45,6 @@
CBAFCB082C0A10500054500E /* MP_AnalyticsManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = CBAFCA1F2C0A10500054500E /* MP_AnalyticsManager.swift */; };
CBAFCB092C0A10500054500E /* MP_AVURLAsset.swift in Sources */ = {isa = PBXBuildFile; fileRef = CBAFCA202C0A10500054500E /* MP_AVURLAsset.swift */; };
CBAFCB0A2C0A10500054500E /* MP_CacheManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = CBAFCA212C0A10500054500E /* MP_CacheManager.swift */; };
CBAFCB0B2C0A10500054500E /* MP_CircularProgressView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CBAFCA222C0A10500054500E /* MP_CircularProgressView.swift */; };
CBAFCB0C2C0A10500054500E /* MP_CoreDataHandlerManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = CBAFCA232C0A10500054500E /* MP_CoreDataHandlerManager.swift */; };
CBAFCB0D2C0A10500054500E /* MP_DownloadManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = CBAFCA242C0A10500054500E /* MP_DownloadManager.swift */; };
CBAFCB0E2C0A10500054500E /* MP_HUD.swift in Sources */ = {isa = PBXBuildFile; fileRef = CBAFCA252C0A10500054500E /* MP_HUD.swift */; };
@ -254,7 +253,6 @@
CBAFCA1F2C0A10500054500E /* MP_AnalyticsManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MP_AnalyticsManager.swift; sourceTree = "<group>"; };
CBAFCA202C0A10500054500E /* MP_AVURLAsset.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MP_AVURLAsset.swift; sourceTree = "<group>"; };
CBAFCA212C0A10500054500E /* MP_CacheManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MP_CacheManager.swift; sourceTree = "<group>"; };
CBAFCA222C0A10500054500E /* MP_CircularProgressView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MP_CircularProgressView.swift; sourceTree = "<group>"; };
CBAFCA232C0A10500054500E /* MP_CoreDataHandlerManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MP_CoreDataHandlerManager.swift; sourceTree = "<group>"; };
CBAFCA242C0A10500054500E /* MP_DownloadManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MP_DownloadManager.swift; sourceTree = "<group>"; };
CBAFCA252C0A10500054500E /* MP_HUD.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MP_HUD.swift; sourceTree = "<group>"; };
@ -581,7 +579,6 @@
CBAFCA1F2C0A10500054500E /* MP_AnalyticsManager.swift */,
CBAFCA202C0A10500054500E /* MP_AVURLAsset.swift */,
CBAFCA212C0A10500054500E /* MP_CacheManager.swift */,
CBAFCA222C0A10500054500E /* MP_CircularProgressView.swift */,
CBAFCA232C0A10500054500E /* MP_CoreDataHandlerManager.swift */,
CBAFCA242C0A10500054500E /* MP_DownloadManager.swift */,
CBAFCA252C0A10500054500E /* MP_HUD.swift */,
@ -1347,7 +1344,6 @@
CBAFCB912C0A10500054500E /* MPSideA_HomeViewController.swift in Sources */,
CBAFCAEA2C0A10500054500E /* MP_Lunch_ProgressView.swift in Sources */,
CBAFCB732C0A10500054500E /* MPPositive_SearchSuggestionItemTableViewCell.swift in Sources */,
CBAFCB0B2C0A10500054500E /* MP_CircularProgressView.swift in Sources */,
CBAFCB432C0A10500054500E /* MPPositive_NavigationController.swift in Sources */,
CBAFCB302C0A10500054500E /* MPPositive_BrowseModuleListViewModel.swift in Sources */,
CBAFCBA62C0A10500054500E /* MPSideA_Home_SecondListCollectionViewCell.swift in Sources */,
@ -1470,7 +1466,7 @@
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
COPY_PHASE_STRIP = NO;
DEBUG_INFORMATION_FORMAT = dwarf;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
ENABLE_STRICT_OBJC_MSGSEND = YES;
ENABLE_TESTABILITY = YES;
ENABLE_USER_SCRIPT_SANDBOXING = NO;
@ -1565,7 +1561,7 @@
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1.0.4.1;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
DEVELOPMENT_TEAM = 8DQD6BV6H9;
DEVELOPMENT_TEAM = T93S37G27F;
GENERATE_INFOPLIST_FILE = YES;
INFOPLIST_FILE = relax.offline.mp3.music/Info.plist;
INFOPLIST_KEY_CFBundleDisplayName = Musiclax;
@ -1606,7 +1602,7 @@
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1.0.4.1;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
DEVELOPMENT_TEAM = 8DQD6BV6H9;
DEVELOPMENT_TEAM = T93S37G27F;
GENERATE_INFOPLIST_FILE = YES;
INFOPLIST_FILE = relax.offline.mp3.music/Info.plist;
INFOPLIST_KEY_CFBundleDisplayName = Musiclax;

View File

@ -18,14 +18,6 @@ class AppDelegate: UIResponder, UIApplicationDelegate {
//
var backgroundSessionCompletionHandler: (() -> Void)?
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
//
UNUserNotificationCenter.current()
.requestAuthorization(options: [.alert, .sound, .badge]) {
(accepted, error) in
if !accepted {
print("Users are not allowed to be notified of messages.")
}
}
//FireBase
FirebaseApp.configure()
//
@ -39,8 +31,6 @@ class AppDelegate: UIResponder, UIApplicationDelegate {
switch_lunch()
//
MP_AnalyticsManager.shared.user_launchAction()
// let numbers = [0]
// let _ = numbers[1]
return true
}
func application(_ application: UIApplication, handleEventsForBackgroundURLSession identifier: String, completionHandler: @escaping () -> Void) {
@ -56,7 +46,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate {
let session = AVAudioSession.sharedInstance()
do {
//,
try session.setCategory(.playAndRecord, mode: .default)
try session.setCategory(.playAndRecord, mode: .default, options: [.allowAirPlay, .defaultToSpeaker])
//
try session.setActive(true)
try session.overrideOutputAudioPort(.speaker)

View File

@ -0,0 +1,22 @@
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "img_v3_02bi_4e2abf4f-00e4-4e5f-9ed0-066d53fd191g.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "img_v3_02bi_7d70335a-d60e-4199-bafe-d683a83952fg.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

View File

@ -6,7 +6,6 @@
//
import UIKit
class MP_BaseViewController: UIViewController {
override func viewDidLoad() {
@ -17,6 +16,73 @@ class MP_BaseViewController: UIViewController {
tabBarController?.tabBar.isTranslucent = true
//
navigationController?.setNavigationBarHidden(true, animated: false)
// MP_NetWorkManager.shared.requestStatusToYouTube()
//
// NotificationCenter.default.addObserver(self, selector: #selector(appWillEnterForegroundAction), name:UIApplication.willEnterForegroundNotification, object: nil)
}
//
@objc private func appWillEnterForegroundAction() {
//
guard MP_NetWorkManager.shared.netWorkStatu != .reachable else {
//
return
}
//,
guard UserDefaults.standard.bool(forKey: "isNetWorkUsage") != true else {
return
}
//
UserDefaults.standard.set(true, forKey: "isNetWorkUsage")
}
// private func triggerLocalNetworkPrivacyAlert() {
// let sock4 = socket(AF_INET, SOCK_DGRAM, 0)
// guard sock4 >= 0 else { return }
// defer { close(sock4) }
// let sock6 = socket(AF_INET6, SOCK_DGRAM, 0)
// guard sock6 >= 0 else { return }
// defer { close(sock6) }
//
// let addresses = addressesOfDiscardServiceOnBroadcastCapableInterfaces()
// var message = [UInt8]("!".utf8)
// for address in addresses {
// address.withUnsafeBytes { buf in
// let sa = buf.baseAddress!.assumingMemoryBound(to: sockaddr.self)
// let saLen = socklen_t(buf.count)
// let sock = sa.pointee.sa_family == AF_INET ? sock4 : sock6
// _ = sendto(sock, &message, message.count, MSG_DONTWAIT, sa, saLen)
// }
// }
// }
// private func addressesOfDiscardServiceOnBroadcastCapableInterfaces() -> [Data] {
// var addrList: UnsafeMutablePointer<ifaddrs>? = nil
// let err = getifaddrs(&addrList)
// guard err == 0, let start = addrList else { return [] }
// defer { freeifaddrs(start) }
// return sequence(first: start, next: { $0.pointee.ifa_next })
// .compactMap { i -> Data? in
// guard(i.pointee.ifa_flags & UInt32(bitPattern: IFF_BROADCAST)) != 0,
// let sa = i.pointee.ifa_addr
// else { return nil }
// var result = Data(UnsafeRawBufferPointer(start: sa, count: Int(sa.pointee.sa_len)))
// switch CInt(sa.pointee.sa_family) {
// case AF_INET:
// result.withUnsafeMutableBytes { buf in
// let sin = buf.baseAddress!.assumingMemoryBound(to: sockaddr_in.self)
// sin.pointee.sin_port = UInt16(9).bigEndian
// }
// case AF_INET6:
// result.withUnsafeMutableBytes { buf in
// let sin6 = buf.baseAddress!.assumingMemoryBound(to: sockaddr_in6.self)
// sin6.pointee.sin6_port = UInt16(9).bigEndian
// }
// default:
// return nil
// }
// return result
// }
// }
}

View File

@ -26,68 +26,9 @@ class MP_LunchViewController: UIViewController {
view.backgroundColor = .init(hex: "#000000")
timer = CADisplayLink(target: self, selector: #selector(timerActionClick(_ :)))
//
timer.preferredFramesPerSecond = 20
timer.preferredFramesPerSecond = 40
//线
timer.add(to: RunLoop.current, forMode: .common)
DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) {
[weak self] in
guard let self = self else {return}
requestTrackingAuthorization { idfa in
if let idfa = idfa {
print("用户同意授权-idfa:\(idfa)")
}
}
}
MP_AnalyticsManager.shared.getOpenStatus { [weak self] open in
guard let self = self else {return}
if open {
//ip
MP_NetWorkManager.shared.requestIPInfo { statu in
if statu == true {
//b
print("BLog")
self.completionBlock = {
DispatchQueue.main.async {
[weak self] in
guard let self = self else {return}
//
timer.isPaused = true
//
accessAppdelegate.switch_positive()
//
MPPositive_BrowseLoadViewModel.shared.reloadBrowseLists()
}
}
}else {
print("ALog")
//A
self.completionBlock = {
DispatchQueue.main.async {
[weak self] in
guard let self = self else {return}
//
timer.isPaused = true
//
accessAppdelegate.switch_aSide()
}
}
}
}
}else {
print("ALog")
//A
completionBlock = {
DispatchQueue.main.async {
[weak self] in
guard let self = self else {return}
//
timer.isPaused = true
//
accessAppdelegate.switch_aSide()
}
}
}
}
//
timer.isPaused = false
// self.completionBlock = {
@ -109,6 +50,21 @@ class MP_LunchViewController: UIViewController {
timer = nil
NotificationCenter.default.removeObserver(self)
}
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
DispatchQueue.main.asyncAfter(deadline: .now() + 2) {
//
requestTrackingAuthorization { idfa in
// if let idfa = idfa {
// print("IDFA: \(idfa)")
// StartManager.shared.idfaid = idfa
// print("Stored IDFA: \(StartManager.shared.idfaid ?? "N/A")")
// } else {
// print("IDFA is not available or tracking authorization denied.")
// }
}
}
}
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
MP_AnalyticsManager.shared.launch_pvAction()
@ -118,7 +74,7 @@ class MP_LunchViewController: UIViewController {
@objc fileprivate func timerActionClick(_ link:CADisplayLink) {
if maxTimes > currentTimes {
//
currentTimes += 0.05
currentTimes += 0.025
let value = currentTimes/maxTimes
DispatchQueue.main.async {
[weak self] in
@ -127,8 +83,51 @@ class MP_LunchViewController: UIViewController {
progressView.setProgress(value)
}
}else {
if completionBlock != nil {
completionBlock!()
//
timer.isPaused = true
MP_AnalyticsManager.shared.getOpenStatus { [weak self] open in
guard let self = self else {return}
if open {
//ip
MP_NetWorkManager.shared.requestIPInfo { statu in
if statu == true {
//b
print("BLog")
DispatchQueue.main.async {
[weak self] in
guard let self = self else {return}
//
timer.isPaused = true
//
accessAppdelegate.switch_positive()
//
MPPositive_BrowseLoadViewModel.shared.reloadBrowseLists()
}
}else {
print("ALog")
//A
DispatchQueue.main.async {
[weak self] in
guard let self = self else {return}
//
timer.isPaused = true
//
accessAppdelegate.switch_aSide()
}
}
}
}else {
print("ALog")
//A
DispatchQueue.main.async {
[weak self] in
guard let self = self else {return}
//
timer.isPaused = true
//
accessAppdelegate.switch_aSide()
}
}
}
}
}

View File

@ -107,14 +107,14 @@ func improveDataforResouceAndCover(_ song:MPPositive_SongItemModel, completion:@
///
func setTimesToMinSeconds(_ time:TimeInterval) -> String {
//
let min = Int(time / 60)
let second = Int(time.truncatingRemainder(dividingBy: 60))
let min = Int((time.isNaN ? 0:time) / 60)
let second = Int((time.isNaN ? 0:time).truncatingRemainder(dividingBy: 60))
return "\(min < 10 ? "0\(min)":"\(min)"):\(second < 10 ? "0\(second)":"\(second)")"
}
///
func setTimesToMins(_ time:TimeInterval) -> String {
//
let min = Int(time / 60)
let min = Int((time.isNaN ? 0:time) / 60)
return "\(min < 10 ? "0\(min)":"\(min)")"
}
///
@ -219,3 +219,25 @@ func requestTrackingAuthorization(completion: @escaping (String?) -> Void) {
}
}
}
///\n\n
func truncateTextAfterTwoNewlines(from text: String) -> String {
//
let pattern = "\n{2,}.*"
let regex = try! NSRegularExpression(pattern: pattern, options: [.dotMatchesLineSeparators])
// 使
let truncatedText = regex.stringByReplacingMatches(in: text, options: [], range: NSRange(location: 0, length: text.utf16.count), withTemplate: "")
return truncatedText
}
///
func getUserNotificationCenter() {
//
UNUserNotificationCenter.current()
.requestAuthorization(options: [.alert, .sound, .badge]) {
(accepted, error) in
if !accepted {
print("Users are not allowed to be notified of messages.")
}
}
}

View File

@ -15,7 +15,7 @@ class MPPositive_Debouncer: NSObject {
private var delay: TimeInterval
private override init() {
delay = 0.2
delay = 0.1
super.init()
}
deinit {

View File

@ -1,84 +0,0 @@
//
// MP_CircularProgressView.swift
// MusicPlayer
//
// Created by 16 on 2024/5/14.
//
import Foundation
import UIKit
class CircularProgressView: UIView {
private var progressLayer = CAShapeLayer()
private var trackLayer = CAShapeLayer()
public var progress: CGFloat = 0 {
didSet {
progressLayer.strokeEnd = progress
}
}
override init(frame: CGRect) {
super.init(frame: frame)
setupView()
}
required init?(coder: NSCoder) {
super.init(coder: coder)
setupView()
}
// private func setupLayers() {
// // Track layer (background circle)
// let center = CGPoint(x: bounds.width / 2, y: bounds.height / 2)
// let circularPath = UIBezierPath(arcCenter: center, radius: bounds.width / 2, startAngle: -CGFloat.pi / 2, endAngle: 3 * CGFloat.pi / 2, clockwise: true)
//
// trackLayer.path = circularPath.cgPath
// trackLayer.strokeColor = UIColor.lightGray.cgColor
// trackLayer.lineWidth = 3
// trackLayer.fillColor = UIColor.clear.cgColor
// layer.addSublayer(trackLayer)
//
// // Progress layer (foreground circle)
// progressLayer.path = circularPath.cgPath
// progressLayer.strokeColor = UIColor.green.cgColor
// progressLayer.lineWidth = 3
// progressLayer.fillColor = UIColor.clear.cgColor
// progressLayer.lineCap = .round
// progressLayer.strokeEnd = 0
// layer.addSublayer(progressLayer)
// }
//
// func setProgress(to progress: CGFloat) {
// self.progress = progress
// }
private func setupView() {
//
trackLayer.path = createCircularPath().cgPath
trackLayer.fillColor = UIColor.clear.cgColor
trackLayer.strokeColor = UIColor.lightGray.cgColor
trackLayer.lineWidth = 3
trackLayer.strokeEnd = 1.0
layer.addSublayer(trackLayer)
//
progressLayer.path = createCircularPath().cgPath
progressLayer.fillColor = UIColor.clear.cgColor
progressLayer.strokeColor = UIColor.green.cgColor
progressLayer.lineWidth = 3
progressLayer.strokeEnd = 0.0
layer.addSublayer(progressLayer)
}
private func createCircularPath() -> UIBezierPath {
return UIBezierPath(arcCenter: center, radius: bounds.size.width / 2, startAngle: -.pi / 2, endAngle: .pi * 3 / 2, clockwise: true)
}
func setProgress(to progress: CGFloat) {
self.progress = progress
print("Updating progress to: \(progress)")
DispatchQueue.main.async {
self.progressLayer.strokeEnd = progress
}
}
}

View File

@ -65,19 +65,20 @@ class MP_HUD: NSObject {
static func showWithStatus(hudStatus status: status, text: String?, delay: TimeInterval ,completion:(() -> Void)?) {
SVProgressHUD.setDefaultStyle(.light)
SVProgressHUD.setDefaultMaskType(.clear)
SVProgressHUD.setBackgroundColor(.init(hex: "#80F988", alpha: 0.1))
SVProgressHUD.setForegroundColor(.init(hex: "#80F988"))
SVProgressHUD.setBackgroundColor(.init(hex: "#151718", alpha: 0.4))
SVProgressHUD.setForegroundColor(.white)
SVProgressHUD.setOffsetFromCenter(.init(horizontal: 0, vertical: 0))
switch status {
case .success:
SVProgressHUD.showSuccess(withStatus: text)
SVProgressHUD.setMinimumSize(CGSize(width: 100 * width, height: 80 * width))
SVProgressHUD.show(UIImage(), status: text)
case .error:
SVProgressHUD.showError(withStatus: text)
case .onlyText:
SVProgressHUD.setOffsetFromCenter(.init(horizontal: 0, vertical: (screen_Height / 2) - 85 * width))
// SVProgressHUD.setOffsetFromCenter(.init(horizontal: 0, vertical: (screen_Height / 2) - 85 * width))
SVProgressHUD.setMinimumSize(CGSize(width: 100 * width, height: 40 * width))
SVProgressHUD.show(UIImage(), status: text)
SVProgressHUD.show(UIImage(named: "NoNetReache'log")!, status: text)
case .loading:
SVProgressHUD.setBackgroundColor(.white)
SVProgressHUD.show()

View File

@ -63,16 +63,16 @@ class MP_NetWorkManager: NSObject {
private let youTubeKeys:[String] = ["MUSIC_VIDEO_TYPE_ATV","MUSIC_VIDEO_TYPE_OMV","MUSIC_PAGE_TYPE_ALBUM","MUSIC_PAGE_TYPE_ARTIST","MUSIC_PAGE_TYPE_PLAYLIST","MUSIC_PAGE_TYPE_TRACK_LYRICS","MUSIC_PAGE_TYPE_TRACK_RELATED"]
///IP
private let banIPs:[String] = [
// "CN",
// "HK",
// "TW",
// "JP",
// "KR",
// "GB",
// "CH",
// "BE",
// "MO",
// "SG"
"CN",
"HK",
"TW",
"JP",
"KR",
"GB",
"CH",
"BE",
"MO",
"SG"
]
//
enum NetWorkStatus: String {
@ -82,22 +82,33 @@ class MP_NetWorkManager: NSObject {
}
///
private let reachabilityManager:NetworkReachabilityManager = NetworkReachabilityManager(host: "https://music.youtube.com/")!
///
private var monitor:NWPathMonitor
///
private var isReach:Bool = false
///
var netWorkStatu:NetWorkStatus!{
willSet{
//
if netWorkStatu == .reachable, newValue == .notReachable {
print("网络不可用")
NotificationCenter.notificationKey.post(notificationName: .net_switch_notReachable)
guard newValue != netWorkStatu else {
//
return
}
//
if (netWorkStatu == .notReachable), newValue == .reachable {
switch newValue {
case .reachable://
print("网络可用")
NotificationCenter.notificationKey.post(notificationName: .net_switch_reachable)
case .notReachable://
print("网络不可用")
NotificationCenter.notificationKey.post(notificationName: .net_switch_notReachable)
case .unknown://
print("网络状况未知")
case .none:
break
}
}
}
//
private var debounceTimer: Timer?
//MARK: -
//访
private var visitorData:String?
@ -154,63 +165,97 @@ class MP_NetWorkManager: NSObject {
var browseRequestStateBlock:BrowseRequestStateBlock?
//
private override init() {
self.monitor = NWPathMonitor()
super.init()
}
//MARK: -
///
func requestNetworkPermission(oberve:UIViewController, completeHanlder:ActionBlock?) {
let monitor = NWPathMonitor()
monitor.pathUpdateHandler = { path in
switch path.status {
case .satisfied:
DispatchQueue.main.async {
guard completeHanlder != nil else {
return
}
completeHanlder!()
switch netWorkStatu {
case .reachable:
DispatchQueue.main.async {
guard completeHanlder != nil else {
return
}
default://
DispatchQueue.main.async {
//
let alertController = UIAlertController(title: "Access network request", message: "”Musiclax“ needs to be loaded via a network request. Please click “Settings” to allow this application to gain access to the network.", preferredStyle: .alert)
let CancelAction = UIAlertAction(title:"Cancel", style: .cancel) { (Cancel) in
completeHanlder!()
}
default:
DispatchQueue.main.async {
//
let alertController = UIAlertController(title: "Access network request", message: "”Musiclax“ needs to be loaded via a network request. Please click “Settings” to allow this application to gain access to the network.", preferredStyle: .alert)
let CancelAction = UIAlertAction(title:"Cancel", style: .cancel) { (Cancel) in
}
let OKAction = UIAlertAction(title: "Settings", style: .default) { (action) in
let url = URL(string: UIApplication.openSettingsURLString)
if let url = url,UIApplication.shared.canOpenURL(url){
if #available(iOS 10, *) {
UIApplication.shared.open(url, options: [:]) { (success) in
}
}else{
UIApplication.shared.canOpenURL(url)
}
let OKAction = UIAlertAction(title: "Settings", style: .default) { (action) in
let url = URL(string: UIApplication.openSettingsURLString)
if let url = url,UIApplication.shared.canOpenURL(url){
if #available(iOS 10, *) {
UIApplication.shared.open(url, options: [:]) { (success) in
}
}else{
UIApplication.shared.canOpenURL(url)
}
}
alertController.addAction(CancelAction)
alertController.addAction(OKAction)
oberve.present(alertController, animated: true, completion: nil)
}
alertController.addAction(CancelAction)
alertController.addAction(OKAction)
oberve.present(alertController, animated: true, completion: nil)
}
}
let queue = DispatchQueue(label: "MPNetWorkManager")
monitor.start(queue: queue)
}
///
func requestStatusToYouTube() {
//ping
reachabilityManager.startListening(onQueue: .main, onUpdatePerforming: { [weak self] status in
guard let self = self else {return}
switch status {
case .unknown://
netWorkStatu = .unknown
case .notReachable://
netWorkStatu = .notReachable
case .reachable(.ethernetOrWiFi), .reachable(.cellular)://
netWorkStatu = .reachable
guard isReach == false else {
return
}
isReach = true
// //ping
// reachabilityManager.startListening(onQueue: .main, onUpdatePerforming: { [weak self] status in
// guard let self = self else {return}
// var newStatu:NetWorkStatus = .unknown
// switch status {
// case .unknown://
// newStatu = .unknown
// case .notReachable://
// newStatu = .notReachable
// case .reachable(.ethernetOrWiFi), .reachable(.cellular)://
// newStatu = .reachable
// }
// //
// self.handleDebouncedNetworkStatusChange(newStatu)
// })
let queue = DispatchQueue(label: "MPNetWorkManager")
monitor.start(queue: queue)
monitor.pathUpdateHandler = { [weak self] path in
self?.updateNetworkStatus(path)
}
}
private func updateNetworkStatus(_ path: NWPath) {
if path.status == .satisfied {
netWorkStatu = .reachable
} else {
netWorkStatu = .notReachable
}
}
func stopListening() {
reachabilityManager.stopListening()
isReach = false
}
private func handleDebouncedNetworkStatusChange(_ newStatus: NetWorkStatus) {
//
debounceTimer?.invalidate()
//
debounceTimer = Timer.scheduledTimer(withTimeInterval: 1.0, repeats: false) { [weak self] _ in
guard let self = self else { return }
//
if newStatus != self.netWorkStatu {
self.netWorkStatu = newStatus
}
})
}
}
}
//MARK: - API
@ -1238,7 +1283,8 @@ extension MP_NetWorkManager {
model.subscriptions = header.musicImmersiveHeaderRenderer?.subscriptionButton?.subscribeButtonRenderer?.subscriberCountText?.runs?.reduce("", { $0 + ($1.text ?? "")})
model.subscriptionedText = header.musicImmersiveHeaderRenderer?.subscriptionButton?.subscribeButtonRenderer?.subscribedButtonText?.runs?.reduce("", { $0 + ($1.text ?? "")})
model.fordescription = header.musicImmersiveHeaderRenderer?.description?.runs?.reduce("", { $0 + ($1.text ?? "")})
model.thumbnails = header.musicImmersiveHeaderRenderer?.thumbnail?.musicThumbnailRenderer?.thumbnail?.thumbnails?.compactMap({$0.url})
model.fordescription = truncateTextAfterTwoNewlines(from: model.fordescription ?? "")
model.thumbnails = header.musicImmersiveHeaderRenderer?.thumbnail?.musicThumbnailRenderer?.thumbnail?.thumbnails?.compactMap({$0.url})
return model
}
///_Contents
@ -1413,7 +1459,14 @@ extension MP_NetWorkManager {
var videos:[String] = []
var itags:[Int] = []
var mimeType:[String] = []
let allFormats = (streamingData.formats ?? []) + (streamingData.adaptiveFormats ?? [])
var allFormats = (streamingData.formats ?? []) + (streamingData.adaptiveFormats ?? [])
// //itag
// allFormats = allFormats.sorted(by: {($0.itag ?? 0) > ($1.itag ?? 0)})
//mimeTypevideo/mp4
// if let index = allFormats.firstIndex(where: {$0.itag == 22}) {
// let element = allFormats.remove(at: index)
// allFormats.insert(element, at: 0)
// }
for format in allFormats {
videos.append(format.url ?? "")
itags.append(format.itag ?? 0)

View File

@ -92,6 +92,7 @@ class MP_PlayerManager:NSObject{
center?.pauseCommand.removeTarget(self)
center?.nextTrackCommand.removeTarget(self)
center?.previousTrackCommand.removeTarget(self)
center?.changePlaybackPositionCommand.removeTarget(self)
center = nil
do {
try AVAudioSession.sharedInstance().setActive(false)
@ -102,6 +103,8 @@ class MP_PlayerManager:NSObject{
}
}
}
//
private var currentInfo:[String:Any]?
//
private var playState:MP_PlayerStateType = .Null{
didSet{
@ -168,7 +171,8 @@ class MP_PlayerManager:NSObject{
//
let currentDuration = CMTimeGetSeconds(time)
//
updateProgress(currentDuration)
// updateProgress(currentDuration)
updateNowPlayingInfo()
//
let maxDuration = getMusicDuration()
if maxDuration.isNaN == false {
@ -282,25 +286,21 @@ class MP_PlayerManager:NSObject{
if playState != .Playing {
//statuVlaueplayerItem
print("当前音乐-\(loadPlayer?.currentVideo?.title ?? "") 已经准备好播放")
// if playState != .Playing {
// player.play()
// playState = .Playing
// //
// suspendTimer()
// let times = Int(self.times)
// 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_success_actionAction(loadPlayer.currentVideo?.song.videoId ?? "", videoname: loadPlayer.currentVideo?.title ?? "", artistname: loadPlayer.currentVideo?.song.shortBylineText ?? "")
// //
// if startActionBlock != nil {
// startActionBlock!()
// }
// }
}
}else {
print("当前音乐-\(loadPlayer.currentVideo?.title ?? "") 未做好准备播放,失败原因是\(loadPlayer.currentVideo?.resourcePlayerItem.error?.localizedDescription ?? "")")
//
play()
if loadPlayer?.currentVideo?.isKVO == true {
//KVO
loadPlayer?.currentVideo?.resourcePlayerItem.removeObserver(self, forKeyPath: "status")
loadPlayer?.currentVideo?.resourcePlayerItem.removeObserver(self, forKeyPath: "loadedTimeRanges")
loadPlayer?.currentVideo?.resourcePlayerItem.removeObserver(self, forKeyPath: "playbackLikelyToKeepUp")
loadPlayer?.currentVideo?.isKVO = false
//
loadPlayer.remakeImproveData {
[weak self] in
self?.play()
}
}
}
case "loadedTimeRanges"://
cacheLoadTimes()
@ -455,6 +455,13 @@ class MP_PlayerManager:NSObject{
//
switch playType {
case .random://
//
guard (loadPlayer?.randomVideos?.count ?? 0) != 1 else {
player.seek(to: .zero)
playState = .Playing
player.play()
return
}
for (index, item) in loadPlayer.randomVideos.enumerated() {
if item.videoId == loadPlayer.currentVideo?.song.videoId {
//
@ -472,6 +479,12 @@ class MP_PlayerManager:NSObject{
loadPlayer.improveData(song.videoId ?? "", isRandom: true)
}
default://
guard (loadPlayer?.songVideos?.count ?? 0) != 1 else {
player.seek(to: .zero)
playState = .Playing
player.play()
return
}
for (index, item) in loadPlayer.songVideos.enumerated() {
if item.videoId == loadPlayer.currentVideo?.song.videoId {
//
@ -497,6 +510,12 @@ class MP_PlayerManager:NSObject{
var nextIndex:Int = 0
switch playType {
case .random:
guard (loadPlayer?.randomVideos?.count ?? 0) != 1 else {
player.seek(to: .zero)
playState = .Playing
player.play()
return
}
for (index, item) in loadPlayer.randomVideos.enumerated() {
if item.videoId == loadPlayer.currentVideo?.song.videoId {
//
@ -514,6 +533,12 @@ class MP_PlayerManager:NSObject{
loadPlayer.improveData(song.videoId ?? "", isRandom: true)
}
default:
guard (loadPlayer?.songVideos?.count ?? 0) != 1 else {
player.seek(to: .zero)
playState = .Playing
player.play()
return
}
for (index, item) in loadPlayer.songVideos.enumerated() {
if item.videoId == loadPlayer.currentVideo?.song.videoId {
//
@ -632,53 +657,73 @@ class MP_PlayerManager:NSObject{
return .noActionableNowPlayingItem
}
}
//
center?.changePlaybackPositionCommand.addTarget(handler: { [weak self] event in
guard let self = self else { return .noActionableNowPlayingItem}
guard let positionEvent = event as? MPChangePlaybackPositionCommandEvent else {
return .commandFailed
}
if loadPlayer.currentVideo != nil {
self.player.seek(to: CMTime(seconds: positionEvent.positionTime, preferredTimescale: 1))
return .success
}else {
return .noActionableNowPlayingItem
}
})
}
//
func updateNowPlayingInfo() {
guard loadPlayer?.currentVideo != nil else {return}
//info
var info = [String:Any]()
currentInfo = [:]
//
info[MPMediaItemPropertyTitle] = loadPlayer.currentVideo?.title ?? ""
currentInfo![MPMediaItemPropertyTitle] = loadPlayer?.currentVideo?.title ?? ""
//
info[MPMediaItemPropertyArtist] = loadPlayer.currentVideo?.song?.shortBylineText ?? ""
currentInfo![MPMediaItemPropertyArtist] = loadPlayer?.currentVideo?.song?.shortBylineText ?? ""
//
info[MPMediaItemPropertyAlbumTitle] = loadPlayer.currentVideo?.song?.longBylineText
currentInfo![MPMediaItemPropertyAlbumTitle] = loadPlayer?.currentVideo?.song?.longBylineText
//
currentInfo![MPNowPlayingInfoPropertyElapsedPlaybackTime] = CMTimeGetSeconds(player.currentItem?.currentTime() ?? .zero)
//
info[MPMediaItemPropertyPlaybackDuration] = getMusicDuration()
currentInfo![MPMediaItemPropertyPlaybackDuration] = CMTimeGetSeconds(player.currentItem?.duration ?? .zero)
currentInfo![MPNowPlayingInfoPropertyPlaybackRate] = 1.0
let reviewURL = URL(string: loadPlayer.currentVideo?.song?.reviewUrls?.last ?? "")!
KingfisherManager.shared.retrieveImage(with: reviewURL) { result in
KingfisherManager.shared.retrieveImage(with: reviewURL) { [weak self]result in
switch result {
case .success(let imageResult):
let image = imageResult.image
info[MPMediaItemPropertyArtwork] = MPMediaItemArtwork(boundsSize: image.size, requestHandler: { size in
self?.currentInfo?[MPMediaItemPropertyArtwork] = MPMediaItemArtwork(boundsSize: image.size, requestHandler: { size in
return image
})
// MPNowPlayingInfoCenter线
DispatchQueue.main.async {
//
MPNowPlayingInfoCenter.default().nowPlayingInfo = info
MPNowPlayingInfoCenter.default().nowPlayingInfo = self?.currentInfo
}
case .failure(_):
info[MPMediaItemPropertyArtwork] = MPMediaItemArtwork(boundsSize: placeholderImage.size, requestHandler: { size in
self?.currentInfo?[MPMediaItemPropertyArtwork] = MPMediaItemArtwork(boundsSize: placeholderImage.size, requestHandler: { size in
return placeholderImage
})
// MPNowPlayingInfoCenter线
DispatchQueue.main.async {
//
MPNowPlayingInfoCenter.default().nowPlayingInfo = info
MPNowPlayingInfoCenter.default().nowPlayingInfo = self?.currentInfo
}
}
}
}
//
private func updateProgress(_ time:TimeInterval) {
if var nowPlayingInfo = MPNowPlayingInfoCenter.default().nowPlayingInfo {
nowPlayingInfo[MPNowPlayingInfoPropertyElapsedPlaybackTime] = time
DispatchQueue.main.async {
//
MPNowPlayingInfoCenter.default().nowPlayingInfo = nowPlayingInfo
}
}
}
// private func updateProgress(_ time:TimeInterval) {
// guard var currentInfo = currentInfo else {
// return
// }
// currentInfo[MPNowPlayingInfoPropertyElapsedPlaybackTime] = setTimesToMinSeconds(time)
// DispatchQueue.main.async {
// print(currentInfo)
// //
// MPNowPlayingInfoCenter.default().nowPlayingInfo = currentInfo
// }
// }
}

View File

@ -21,9 +21,14 @@ class MPPositive_BrowseLoadViewModel: NSObject {
browseModuleLists.append(contentsOf: lists)
//
browseModuleLists = browseModuleLists.filter{($0.items.count != 0)}
//UI
NotificationCenter.notificationKey.post(notificationName: .positive_browses_reload)
if isCompleted == true {
//
if let index = browseModuleLists.firstIndex(where: {$0.items.first?.browseItem.pageType == "MUSIC_VIDEO_TYPE_OMV"}) {
let removedElement = browseModuleLists.remove(at: index)
browseModuleLists.append(removedElement)
}
//UI
NotificationCenter.notificationKey.post(notificationName: .positive_browses_reload)
//
MP_AnalyticsManager.shared.home_b_module_showsucces_actionAction()
}

View File

@ -146,30 +146,8 @@ class MPPositive_PlayerLoadViewModel: NSObject {
}
///
func remakeImproveData(_ completion:@escaping (() -> Void)) {
//
improveDataforResouceAndCover(currentVideo.song) {[weak self] resourceUrls, coverUrls in
guard let self = self else {return}
if let resourceUrls = resourceUrls {
currentVideo.song.resourceUrls = resourceUrls.0
currentVideo.song.itags = resourceUrls.1
currentVideo.song.mimeTypes = resourceUrls.2
}
//listViewVideos
listViewVideos.forEach({ item in
if item.song.videoId == self.currentVideo.song.videoId {
item.song.resourceUrls = self.currentVideo.song.resourceUrls
item.song.itags = self.currentVideo.song.itags
item.song.mimeTypes = self.currentVideo.song.mimeTypes
}
})
// currentVideo.resourceAsset = .init(url: .init(string: currentVideo.song.resourceUrls!.first!)!)
// currentVideo.resourcePlayerItem = .init(asset: currentVideo.resourceAsset!)
// currentVideo.resourcePlayerItem = .init(url: .init(string: (currentVideo.song.resourceUrls?.first ?? ""))!, bitrate: Int64(currentVideo.song.bitrates?.first ?? 0), title: currentVideo.title, videoId: currentVideo.song.videoId)
currentVideo.configure()
//UI
NotificationCenter.notificationKey.post(notificationName: .positive_player_reload)
completion()
}
currentVideo.configure()
completion()
}
///songlistViewVideosindex

View File

@ -91,7 +91,7 @@ class MPPositive_BaseViewController: MP_BaseViewController {
make.width.equalTo(211*width)
make.height.equalTo(172*width)
}
let label = createLabel("Failure to obtain data", font: .systemFont(ofSize: 13*width, weight: .regular), textColor: .white, textAlignment: .center)
let label = createLabel("Weak connection. Please check your network", font: .systemFont(ofSize: 13*width, weight: .regular), textColor: .white, textAlignment: .center)
errorView.addSubview(label)
label.snp.makeConstraints { make in
make.centerX.equalToSuperview()
@ -134,7 +134,7 @@ class MPPositive_BaseViewController: MP_BaseViewController {
DispatchQueue.main.async {
[weak self] in
guard let self = self else {return}
MP_HUD.text("Failure to obtain data", delay: 1.0){ [weak self] in
MP_HUD.text("Weak connection.", delay: 1.0){ [weak self] in
//
if self?.errorBlock != nil {
self?.errorBlock!()

View File

@ -9,8 +9,6 @@ import UIKit
import Kingfisher
///
class MPPositive_MoreSongOperationsViewController: UIViewController {
//View
private var loadView = CircularProgressView()
//
private lazy var indictorImageView:UIImageView = .init(image: .init(named: "Player_Indictor'logo"))
//ICON
@ -267,6 +265,7 @@ class MPPositive_MoreSongOperationsViewController: UIViewController {
}
//
@objc private func collectionClick(_ sender:UIButton) {
getUserNotificationCenter()
if self.collectionBtn.isSelected == true{
self.collectionBtn.isSelected = false
MPPositive_CollectionSongModel.fetch(.init(format: "videoId == %@", song.videoId)).forEach { item in
@ -315,6 +314,7 @@ extension MPPositive_MoreSongOperationsViewController:UITableViewDataSource, UIT
}
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
if indexPath.row == 0 {
getUserNotificationCenter()
if isLoaded {
//
MPPositive_DownloadItemModel.fetch(.init(format: "videoId == %@", song.videoId)).forEach { item in

View File

@ -90,21 +90,11 @@ extension MPPositive_TabBarController {
@objc private func pupPlayerAction() {
DispatchQueue.main.async {
[weak self] in
//load
// if MP_PlayerManager.shared.loadPlayer != nil{
// let playerVC = MPPositive_PlayerViewController()
// playerVC.modalPresentationStyle = .fullScreen
// playerVC.recommendBlock = {
// let recommendVC = MPPositive_RecommendViewController(MP_PlayerManager.shared.loadPlayer.currentVideo.song.relatedID)
// self?.viewControllers![self?.selectedIndex ?? 0].children[0].navigationController?.pushViewController(recommendVC, animated: true)
// }
// self?.present(playerVC, animated: true)
// }
let playerVC = MPPositive_PlayerViewController()
playerVC.modalPresentationStyle = .fullScreen
playerVC.recommendBlock = {
let recommendVC = MPPositive_RecommendViewController(MP_PlayerManager.shared.loadPlayer.currentVideo.song.relatedID)
self?.viewControllers![self?.selectedIndex ?? 0].children[0].navigationController?.pushViewController(recommendVC, animated: true)
self?.viewControllers![self?.selectedIndex ?? 0].children[0].navigationController?.pushViewController(recommendVC, animated: false)
}
self?.present(playerVC, animated: true)
}

View File

@ -93,10 +93,14 @@ extension MPPositive_LoveSongsViewController: UITableViewDataSource, UITableView
MPPositive_Debouncer.shared.call {
[weak self] in
guard let self = self else {return}
//
NotificationCenter.notificationKey.post(notificationName: .pup_player_vc)
guard MP_NetWorkManager.shared.netWorkStatu == .reachable else {
MP_HUD.text("Weak connection.", delay: 2.0, completion: nil)
return
}
//
MP_PlayerManager.shared.loadPlayer = nil
//
NotificationCenter.notificationKey.post(notificationName: .pup_player_vc)
//
var array:[MPPositive_SongItemModel] = []
for (index,song) in MPPositive_LoadCoreModel.shared.songViewModels.enumerated() {
@ -114,7 +118,6 @@ extension MPPositive_LoveSongsViewController: UITableViewDataSource, UITableView
let lodaViewModel = MPPositive_PlayerLoadViewModel(array, currentVideoId: MPPositive_LoadCoreModel.shared.songViewModels[indexPath.row].collectionSong.videoId ?? "")
lodaViewModel.improveData(MPPositive_LoadCoreModel.shared.songViewModels[indexPath.row].collectionSong.videoId ?? "")
MP_PlayerManager.shared.loadPlayer = lodaViewModel
// NotificationCenter.notificationKey.post(notificationName: .pup_player_vc)
}
}
func presentationController(forPresented presented: UIViewController, presenting: UIViewController?, source: UIViewController) -> UIPresentationController? {

View File

@ -99,10 +99,10 @@ extension MPPositive_OfflineSongsViewController: UITableViewDataSource, UITableV
MPPositive_Debouncer.shared.call {
[weak self] in
guard let self = self else {return}
//
NotificationCenter.notificationKey.post(notificationName: .pup_player_vc)
//
MP_PlayerManager.shared.loadPlayer = nil
//
NotificationCenter.notificationKey.post(notificationName: .pup_player_vc)
//
var array:[MPPositive_SongItemModel] = []
for (index, song) in MPPositive_LoadCoreModel.shared.loadViewModels.enumerated() {

View File

@ -215,11 +215,15 @@ extension MPPositive_ArtistShowViewController: JXPagingViewDelegate{
MPPositive_Debouncer.shared.call {
[weak self] in
guard let self = self else {return}
guard MP_NetWorkManager.shared.netWorkStatu == .reachable else {
MP_HUD.text("Weak connection.", delay: 2.0, completion: nil)
return
}
//
MP_PlayerManager.shared.loadPlayer = nil
///
//
NotificationCenter.notificationKey.post(notificationName: .pup_player_vc)
//
MP_PlayerManager.shared.loadPlayer = nil
//next
MP_NetWorkManager.shared.requestNextList(item.browseItem.playListId ?? "", videoId: item.browseItem.videoId ?? ""){ [weak self] listSongs in
guard let self = self else {return}

View File

@ -158,10 +158,14 @@ extension MPPositive_HomeViewController: UITableViewDataSource, UITableViewDeleg
MPPositive_Debouncer.shared.call {
[weak self] in
guard let self = self else {return}
//
NotificationCenter.notificationKey.post(notificationName: .pup_player_vc)
guard MP_NetWorkManager.shared.netWorkStatu == .reachable else {
MP_HUD.text("Weak connection.", delay: 2.0, completion: nil)
return
}
//
MP_PlayerManager.shared.loadPlayer = nil
//
NotificationCenter.notificationKey.post(notificationName: .pup_player_vc)
//next
MP_NetWorkManager.shared.requestNextList(item.browseItem.playListId ?? "", videoId: item.browseItem.videoId ?? ""){ [weak self] listSongs in
guard let self = self else {return}
@ -169,7 +173,6 @@ extension MPPositive_HomeViewController: UITableViewDataSource, UITableViewDeleg
let lodaViewModel = MPPositive_PlayerLoadViewModel(listSongs, currentVideoId: item.browseItem.videoId ?? "")
lodaViewModel.improveData(item.browseItem.videoId ?? "")
MP_PlayerManager.shared.loadPlayer = lodaViewModel
// NotificationCenter.notificationKey.post(notificationName: .pup_player_vc)
}
}
case .list:

View File

@ -248,15 +248,19 @@ class MPPositive_ListShowViewController: MPPositive_BaseViewController, UIViewCo
}
//MARK: -
///
//
@objc private func playListActionClick(_ sender:UITapGestureRecognizer) {
MPPositive_Debouncer.shared.call {
[weak self] in
guard let self = self, let item = listOrAlbum.items.randomElement() else {return}
//
NotificationCenter.notificationKey.post(notificationName: .pup_player_vc)
guard MP_NetWorkManager.shared.netWorkStatu == .reachable else {
MP_HUD.text("Weak connection.", delay: 2.0, completion: nil)
return
}
//
MP_PlayerManager.shared.loadPlayer = nil
//
NotificationCenter.notificationKey.post(notificationName: .pup_player_vc)
//next
MP_NetWorkManager.shared.requestNextList(item.browseItem.playListId ?? "", videoId: item.browseItem.videoId ?? ""){ [weak self] listSongs in
guard let self = self else {return}
@ -264,13 +268,13 @@ class MPPositive_ListShowViewController: MPPositive_BaseViewController, UIViewCo
let lodaViewModel = MPPositive_PlayerLoadViewModel(listSongs, currentVideoId: item.browseItem.videoId ?? "")
lodaViewModel.improveData(item.browseItem.videoId ?? "")
MP_PlayerManager.shared.loadPlayer = lodaViewModel
//
// NotificationCenter.notificationKey.post(notificationName: .pup_player_vc)
}
}
}
//
@objc private func collectionSwitchClick(_ sender:UIButton) {
getUserNotificationCenter()
if self.collectionListBtn.isSelected == true{
self.collectionListBtn.isSelected = false
@ -322,6 +326,10 @@ extension MPPositive_ListShowViewController: UITableViewDataSource, UITableViewD
MPPositive_Debouncer.shared.call {
[weak self] in
guard let self = self else {return}
guard MP_NetWorkManager.shared.netWorkStatu == .reachable else {
MP_HUD.text("Weak connection.", delay: 2.0, completion: nil)
return
}
//
NotificationCenter.notificationKey.post(notificationName: .pup_player_vc)
//next
@ -331,8 +339,6 @@ extension MPPositive_ListShowViewController: UITableViewDataSource, UITableViewD
let lodaViewModel = MPPositive_PlayerLoadViewModel(listSongs, currentVideoId: listOrAlbum.items[indexPath.row].browseItem.videoId ?? "")
lodaViewModel.improveData(listOrAlbum.items[indexPath.row].browseItem.videoId ?? "")
MP_PlayerManager.shared.loadPlayer = lodaViewModel
//
// NotificationCenter.notificationKey.post(notificationName: .pup_player_vc)
}
}
}

View File

@ -62,7 +62,7 @@ class MPPositive_MoreContentViewController: MPPositive_BaseViewController {
var browseModuleList:MPPositive_BrowseModuleListViewModel!
override func viewDidLoad() {
super.viewDidLoad()
setTitle("Report")
setTitle("More")
setPopBtn()
confirgue()
}
@ -113,10 +113,14 @@ extension MPPositive_MoreContentViewController: UICollectionViewDataSource, UICo
MPPositive_Debouncer.shared.call {
[weak self] in
guard let self = self else {return}
//
NotificationCenter.notificationKey.post(notificationName: .pup_player_vc)
guard MP_NetWorkManager.shared.netWorkStatu == .reachable else {
MP_HUD.text("Weak connection.", delay: 2.0, completion: nil)
return
}
//
MP_PlayerManager.shared.loadPlayer = nil
//
NotificationCenter.notificationKey.post(notificationName: .pup_player_vc)
//next
MP_NetWorkManager.shared.requestNextList(browseModuleList.items[indexPath.row].browseItem.playListId ?? "", videoId: browseModuleList.items[indexPath.row].browseItem.videoId ?? ""){ [weak self] listSongs in
guard let self = self else {return}
@ -124,7 +128,6 @@ extension MPPositive_MoreContentViewController: UICollectionViewDataSource, UICo
let lodaViewModel = MPPositive_PlayerLoadViewModel(listSongs, currentVideoId: browseModuleList.items[indexPath.row].browseItem.videoId ?? "")
lodaViewModel.improveData(browseModuleList.items[indexPath.row].browseItem.videoId ?? "")
MP_PlayerManager.shared.loadPlayer = lodaViewModel
// NotificationCenter.notificationKey.post(notificationName: .pup_player_vc)
}
}
default:

View File

@ -123,6 +123,7 @@ class MPPositive_PlayerViewController: MPPositive_BaseViewController, UIViewCont
//View
private lazy var lyricsView:MPPositive_PlayerLyricView = .init(frame: .init(x: 0, y: 0, width: screen_Width, height: 480*width))
var recommendBlock:(() -> Void)?
override func viewDidLoad() {
super.viewDidLoad()
//label
@ -420,6 +421,10 @@ class MPPositive_PlayerViewController: MPPositive_BaseViewController, UIViewCont
}
//|
@objc private func switchActionClick(_ sender:UIButton) {
guard MP_NetWorkManager.shared.netWorkStatu == .reachable else {
MP_HUD.text("Weak connection.", delay: 2.0, completion: nil)
return
}
topShowType = .init(rawValue: sender.tag)!
}
//
@ -467,17 +472,23 @@ class MPPositive_PlayerViewController: MPPositive_BaseViewController, UIViewCont
}
//
@objc private func relatedContentClick(_ sender:UIButton) {
//dismiss
dismiss(animated: true) {[weak self] in
guard let self = self else {return}
if recommendBlock != nil {
recommendBlock!()
}
guard MP_NetWorkManager.shared.netWorkStatu == .reachable else {
MP_HUD.text("Weak connection.", delay: 2.0, completion: nil)
return
}
//dismiss
if recommendBlock != nil {
recommendBlock!()
}
dismiss(animated: true)
}
////
@objc private func playClick(_ sender:UIButton) {
guard MP_NetWorkManager.shared.netWorkStatu == .reachable else {
MP_HUD.text("Weak connection.", delay: 2.0, completion: nil)
return
}
guard MP_PlayerManager.shared.loadPlayer != nil else {
return
}
@ -504,7 +515,12 @@ class MPPositive_PlayerViewController: MPPositive_BaseViewController, UIViewCont
}
//
@objc private func listClick(_ sender:UIButton) {
guard MP_NetWorkManager.shared.netWorkStatu == .reachable else {
MP_HUD.text("Weak connection.", delay: 2.0, completion: nil)
return
}
if MP_PlayerManager.shared.loadPlayer != nil {
MPPositive_ModalType = .PlayerList
let listVC = MPPositive_PlayerListShowViewController()
listVC.transitioningDelegate = self
@ -517,6 +533,10 @@ class MPPositive_PlayerViewController: MPPositive_BaseViewController, UIViewCont
}
////
@objc private func typeClick(_ sender:UIButton) {
guard MP_NetWorkManager.shared.netWorkStatu == .reachable else {
MP_HUD.text("Weak connection.", delay: 2.0, completion: nil)
return
}
MPPositive_Debouncer.shared.call {
[weak self] in
guard let self = self else {return}
@ -531,22 +551,34 @@ class MPPositive_PlayerViewController: MPPositive_BaseViewController, UIViewCont
}
//
@objc private func nextClick(_ sender:UIButton) {
guard MP_NetWorkManager.shared.netWorkStatu == .reachable else {
MP_HUD.text("Weak connection.", delay: 2.0, completion: nil)
return
}
guard MP_PlayerManager.shared.loadPlayer?.currentVideo != nil else {
return
}
MPPositive_Debouncer.shared.call {
[weak self] in
guard let self = self else {return}
coverView.sliderView.value = 0
playBtn.isUserInteractionEnabled = false
MP_PlayerManager.shared.nextEvent()
}
}
//
@objc private func previousClick(_ sender:UIButton) {
guard MP_NetWorkManager.shared.netWorkStatu == .reachable else {
MP_HUD.text("Weak connection.", delay: 2.0, completion: nil)
return
}
guard MP_PlayerManager.shared.loadPlayer?.currentVideo != nil else {
return
}
MPPositive_Debouncer.shared.call {
[weak self] in
guard let self = self else {return}
coverView.sliderView.value = 0
playBtn.isUserInteractionEnabled = false
MP_PlayerManager.shared.previousEvent()
}
}

View File

@ -229,6 +229,9 @@ extension MPPositive_RecommendViewController: JXSegmentedListContainerViewDataSo
let listVC = MPPositive_ListShowViewController(item.browseItem.browseId ?? "", params: "", title: item.title ?? "", subtitle: item.subtitle ?? "")
navigationController?.pushViewController(listVC, animated: true)
case .single:
//
MP_PlayerManager.shared.loadPlayer = nil
NotificationCenter.notificationKey.post(notificationName: .pup_player_vc)
///
//next
MP_NetWorkManager.shared.requestNextList(item.browseItem.playListId ?? "", videoId: item.browseItem.videoId ?? ""){ [weak self] listSongs in

View File

@ -113,11 +113,15 @@ class MPPositive_SearchResultShowViewController: MPPositive_BaseViewController,
MPPositive_Debouncer.shared.call {
[weak self] in
guard let self = self else {return}
guard MP_NetWorkManager.shared.netWorkStatu == .reachable else {
MP_HUD.text("Weak connection.", delay: 2.0, completion: nil)
return
}
//
MP_PlayerManager.shared.loadPlayer = nil
///
//
NotificationCenter.notificationKey.post(notificationName: .pup_player_vc)
//
MP_PlayerManager.shared.loadPlayer = nil
//next
MP_NetWorkManager.shared.requestNextList(item.item.playListId ?? "", videoId: item.item.videoId ?? ""){ [weak self] listSongs in
guard let self = self else {return}

View File

@ -92,6 +92,7 @@ class MPPositive_ArtistShowHeaderView: UIView {
}
//
@objc private func collectionClick(_ sender:UIButton) {
getUserNotificationCenter()
if self.collectionBtn.isSelected == true{
self.collectionBtn.isSelected = false

View File

@ -96,6 +96,10 @@ class MPPositive_ArtistShowSongTableViewCell: UITableViewCell {
var moreBlock:(() -> Void)?
//
@objc private func moreActionClick(_ sender:UIButton) {
guard MP_NetWorkManager.shared.netWorkStatu == .reachable else {
MP_HUD.text("Weak connection.", delay: 2.0, completion: nil)
return
}
guard moreBlock != nil else {
return
}

View File

@ -101,6 +101,10 @@ class MPPositive_MusicItemShowTableViewCell: UITableViewCell {
}
//
@objc private func moreActionClick(_ sender:UIButton) {
guard MP_NetWorkManager.shared.netWorkStatu == .reachable else {
MP_HUD.text("Weak connection.", delay: 2.0, completion: nil)
return
}
guard moreBlock != nil else {
return
}

View File

@ -81,11 +81,21 @@ class MPPositive_PlayerCoverView: UIView, PKDownloadButtonDelegate {
maskView.backgroundColor = .init(hex: "#000000", alpha: 0.7)
maskView.layer.masksToBounds = true
maskView.layer.cornerRadius = 16*width
//icon
let iconImageView:UIImageView = .init(image: .init(named: "NoNetReache'log"))
maskView.addSubview(iconImageView)
iconImageView.snp.makeConstraints { make in
make.centerX.equalToSuperview()
make.centerY.equalToSuperview().multipliedBy(0.8)
make.width.equalTo(52*width)
make.height.equalTo(42*width)
}
//label
let noticeLabel:UILabel = createLabel("The network connection is disconnected and the player will stop loading music. Please restore the network as soon as possible!", font: .systemFont(ofSize: 18, weight: .medium), textColor: .white, textAlignment: .center, lines: 0)
let noticeLabel:UILabel = createLabel("Weak connection. Please check your network", font: .systemFont(ofSize: 18, weight: .medium), textColor: .white, textAlignment: .center, lines: 0)
maskView.addSubview(noticeLabel)
noticeLabel.snp.makeConstraints { make in
make.center.equalToSuperview()
make.top.equalTo(iconImageView.snp.bottom).offset(20*width)
make.centerX.equalToSuperview()
make.width.equalToSuperview().multipliedBy(0.7)
}
return maskView
@ -143,7 +153,7 @@ class MPPositive_PlayerCoverView: UIView, PKDownloadButtonDelegate {
maskNotReachableView.snp.makeConstraints { make in
make.left.right.top.bottom.equalTo(coverImageView)
}
maskNotReachableView.isHidden = true
maskNotReachableView.isHidden = (MP_NetWorkManager.shared.netWorkStatu == .reachable)
//
addSubview(titleLabel)
titleLabel.snp.makeConstraints { make in
@ -232,6 +242,11 @@ class MPPositive_PlayerCoverView: UIView, PKDownloadButtonDelegate {
}
//
@objc private func collectionSwitchClick(_ sender:UIButton) {
getUserNotificationCenter()
guard MP_NetWorkManager.shared.netWorkStatu == .reachable else {
MP_HUD.text("Weak connection.", delay: 2.0, completion: nil)
return
}
if self.collectionSongBtn.isSelected == true{
self.collectionSongBtn.isSelected = false
if MP_PlayerManager.shared.loadPlayer.currentVideo != nil{
@ -263,6 +278,11 @@ class MPPositive_PlayerCoverView: UIView, PKDownloadButtonDelegate {
}
//
func downloadButtonTapped(_ downloadButton: PKDownloadButton!, currentState state: PKDownloadButtonState) {
getUserNotificationCenter()
guard MP_NetWorkManager.shared.netWorkStatu == .reachable else {
MP_HUD.text("Weak connection.", delay: 2.0, completion: nil)
return
}
guard MP_PlayerManager.shared.loadPlayer?.currentVideo != nil, MP_PlayerManager.shared.loadPlayer?.currentVideo?.isDlownd == false else {
return
}

View File

@ -72,7 +72,7 @@ class MPPositive_PlayerListShowTableViewCell: UITableViewCell {
}
contentView.addSubview(removeBtn)
removeBtn.snp.makeConstraints { make in
make.width.height.equalTo(24*width)
make.width.height.equalTo(44*width)
make.centerY.equalTo(coverImageView.snp.centerY)
make.right.equalToSuperview().offset(-18*width)
}

View File

@ -29,7 +29,7 @@ class MPPositive_PlayerSilder: UISlider {
override init(frame:CGRect) {
super.init(frame: frame)
setUpLayout()
print("调整Slider大小")
// print("Slider")
originalFrame = self.frame
}
override func awakeFromNib() {

View File

@ -119,6 +119,10 @@ class MPPositive_SearchResultShowTableViewCell: UITableViewCell {
//
@objc private func moreActionClick(_ sender:UIButton) {
guard MP_NetWorkManager.shared.netWorkStatu == .reachable else {
MP_HUD.text("Weak connection.", delay: 2.0, completion: nil)
return
}
if moreBlock != nil {
moreBlock!()
}