Music_Player3/relax.offline.mp3.music/MP/MPPositive/Views/Search/MPPositive_SearchResultShowTableViewCell.swift

291 lines
12 KiB
Swift
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

//
// MPPositive_SearchResultShowTableViewCell.swift
// MusicPlayer
//
// Created by Mr.Zhou on 2024/5/13.
//
import UIKit
import Kingfisher
import DownloadButton
class MPPositive_SearchResultShowTableViewCell: UITableViewCell, PKDownloadButtonDelegate {
//
private lazy var iconImageView:UIImageView = {
let imageView:UIImageView = .init()
imageView.contentMode = .scaleAspectFill
imageView.layer.masksToBounds = true
imageView.layer.cornerRadius = 10*width
return imageView
}()
private lazy var titleLabel:UILabel = createLabel(font: .systemFont(ofSize: 14*width, weight: .regular), textColor: .white, textAlignment: .left)
private lazy var subtitleLabel:UILabel = createLabel(font: .systemFont(ofSize: 12*width, weight: .regular), textColor: .init(hex: "#FFFFFF", alpha: 0.6), textAlignment: .left)
///
private lazy var moreBtn:UIButton = {
let btn:UIButton = .init()
btn.setBackgroundImage(UIImage(named: "Song_More'logo"), for: .normal)
btn.addTarget(self, action: #selector(moreActionClick(_ :)), for: .touchUpInside)
return btn
}()
//
private lazy var loadBtn:PKDownloadButton = {
let btn:PKDownloadButton = .init()
//
btn.startDownloadButton.cleanDefaultAppearance()
btn.startDownloadButton.setBackgroundImage(UIImage(named: "Song_Unload'logo"), for: .normal)
//
btn.downloadedButton.setBackgroundImage(UIImage(named: "Song_Loaded'logo"), for: .normal)
btn.downloadedButton.setAttributedTitle(nil, for: .normal)
//
btn.stopDownloadButton.stopButton.setImage(UIImage(named: "download"), for: .normal)
btn.stopDownloadButton.tintColor = UIColor(hex: "#80F988")
btn.stopDownloadButton.stopButtonWidth = 2
btn.stopDownloadButton.filledLineWidth = 3*width
btn.stopDownloadButton.filledLineStyleOuter = true
//
btn.pendingView.tintColor = UIColor(hex: "#80F988")
btn.pendingView.radius = 12*width
btn.pendingView.emptyLineRadians = 2*width
btn.pendingView.spinTime = 3
btn.delegate = self
return btn
}()
var itemView:MPPositive_SearchResultItemViewModel!{
didSet{
itemView.setImage(iconImageView)
titleLabel.text = itemView.title
subtitleLabel.text = itemView.subtitle
//
if itemView.item.itemType == .single {
moreBtn.isHidden = false
loadBtn.isHidden = false
}else {
moreBtn.isHidden = true
loadBtn.isHidden = true
}
setProgress(itemView.item.videoId ?? "")
}
}
var songViewModel:MPPositive_CollectionSongViewModel!{
didSet{
songViewModel.setImage(iconImageView)
titleLabel.text = songViewModel.title
subtitleLabel.text = songViewModel.subtitle
setProgress(songViewModel.collectionSong.videoId ?? "")
}
}
var loadViewModel:MPPositive_DownloadViewModel!{
didSet{
loadViewModel.setImage(iconImageView)
titleLabel.text = loadViewModel.title
subtitleLabel.text = loadViewModel.subtitle
setProgress(loadViewModel.loadItem.videoId ?? "")
}
}
var videoModel:MPPositive_CustomVideoModel!{
didSet{
iconImageView.kf.setImage(with: videoModel.coverImageURL, placeholder: placeholderImage)
titleLabel.text = videoModel.title
subtitleLabel.text = videoModel.subtitle
setProgress(videoModel.videoId ?? "")
}
}
var moreBlock:(() -> Void)?
//
var deleteBlock:(() -> Void)?
//
var cancelBlock:(() -> Void)?
override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
super.init(style: style, reuseIdentifier: reuseIdentifier)
selectionStyle = .none
backgroundColor = .clear
configure()
}
//videoId
func setProgress(_ videoId:String) {
guard videoId.isEmpty == false, (videoId == itemView?.item?.videoId || videoId == songViewModel?.collectionSong.videoId || videoId == loadViewModel?.loadItem.videoId || videoId == videoModel?.videoId) else {
loadBtn.state = .startDownload
return
}
MP_DownloadManager.shared.loadQueue.async {
[weak self] in
guard let self = self else {return}
//
guard MP_DownloadManager.shared.isDownloadedFileDocuments(videoId) == false else {
DispatchQueue.main.async {
//
self.loadBtn.state = .downloaded
}
return
}
//,
guard MP_DownloadManager.shared.isTasksQueue(for: videoId) else {
DispatchQueue.main.async {
//
self.loadBtn.state = .startDownload
}
return
}
//
if MP_DownloadManager.shared.isActiveTask(for: videoId) {
DispatchQueue.main.async {
self.loadBtn.state = .downloading
}
//
if let progress = MP_DownloadManager.shared.getProgress(for: videoId) {
//
DispatchQueue.main.async {
self.loadBtn.stopDownloadButton.progress = progress
}
}
}else {
//
DispatchQueue.main.async {
//
self.loadBtn.state = .pending
}
}
}
}
required init?(coder: NSCoder) {
super.init(coder: coder)
}
override func awakeFromNib() {
super.awakeFromNib()
// Initialization code
}
override func setSelected(_ selected: Bool, animated: Bool) {
super.setSelected(selected, animated: animated)
// Configure the view for the selected state
}
private func configure() {
contentView.addSubview(iconImageView)
iconImageView.snp.makeConstraints { make in
make.width.height.equalTo(60*width)
make.top.equalToSuperview().offset(8*width).priority(999)
make.bottom.equalToSuperview().offset(-8*width)
make.left.equalToSuperview().offset(18*width)
}
contentView.addSubview(moreBtn)
moreBtn.snp.makeConstraints { make in
make.width.height.equalTo(24*width)
make.centerY.equalTo(iconImageView.snp.centerY)
make.right.equalToSuperview().offset(-18*width)
}
contentView.addSubview(loadBtn)
loadBtn.snp.makeConstraints { make in
make.width.height.equalTo(24*width)
make.centerY.equalTo(iconImageView.snp.centerY)
make.right.equalToSuperview().offset(-54*width)
}
contentView.addSubview(titleLabel)
titleLabel.snp.makeConstraints { make in
make.top.equalTo(iconImageView.snp.top).offset(10*width)
make.left.equalTo(iconImageView.snp.right).offset(12*width)
make.right.equalTo(loadBtn.snp.left).offset(-10*width)
}
contentView.addSubview(subtitleLabel)
subtitleLabel.snp.makeConstraints { make in
make.bottom.equalTo(iconImageView.snp.bottom).offset(-10*width)
make.left.equalTo(titleLabel.snp.left)
make.right.equalTo(titleLabel.snp.right)
}
}
//
@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!()
}
}
//
func downloadButtonTapped(_ downloadButton: PKDownloadButton!, currentState state: PKDownloadButtonState) {
var video:MPPositive_SongItemModel!
//
switch state {
case .startDownload://
//
guard MP_NetWorkManager.shared.netWorkStatu == .reachable else {
MP_HUD.text("Weak connection.", delay: 2.0, completion: nil)
return
}
var videoId:String?
if let itemView = itemView {
videoId = itemView.item.videoId
}
if let songViewModel = songViewModel {
videoId = songViewModel.collectionSong.videoId
}
if let loadViewModel = loadViewModel {
videoId = loadViewModel.loadItem.videoId
}
if let videoModel = videoModel {
videoId = videoModel.videoId
}
//
guard let videoId = videoId else {
return
}
//
// MP_AdMobManager.shared.showLoadInterstitialAdIfAvailable(completion: nil)
//
downloadButton.state = .pending
//(Song)
MP_NetWorkManager.shared.requestNextList("", videoId: videoId){
[weak self] listSongs in
guard let self = self, let first = listSongs.first else {
//
self?.setProgress(videoId)
return
}
let group = DispatchGroup()
group.enter()
improveDataforLycirsAndRelated(first) {(result) in
first.lyricsID = result.0
first.relatedID = result.1
group.leave()
}
group.enter()
//
improveDataforResouceAndCover(first) {(resourceUrls, coverUrls) in
if let resourceUrls = resourceUrls {
first.resourceUrls = resourceUrls.0
first.itags = resourceUrls.1
first.mimeTypes = resourceUrls.2
}
first.coverUrls = coverUrls
group.leave()
}
group.notify(queue: .main, execute: {
[weak self] in
guard let self = self else {
self?.setProgress(videoId)
return
}
video = first
//
MP_AnalyticsManager.shared.player_b_download_clickAction(video.videoId, videoname: video.title ?? "", artistname: video.shortBylineText ?? "")
//,
MP_DownloadManager.shared.prepareVideoDownloadTask(from: video)
})
}
case .downloaded://
if let block = deleteBlock {
block()
}
default:
if let block = cancelBlock {
block()
}
}
}
}