ASMyRingCell.swift 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327
  1. //
  2. // ASMyRingCell.swift
  3. // AIPlayRingtones
  4. //
  5. // Created by mini on 2025/5/19.
  6. //
  7. import Combine
  8. import SwipeCellKit
  9. class ASMyRingCell: SwipeCollectionViewCell {
  10. weak var targetVC:UIViewController?
  11. var indexPath:IndexPath = IndexPath(item: 0, section: 0)
  12. override init(frame: CGRect) {
  13. super.init(frame: frame)
  14. creatUI()
  15. dealThings()
  16. }
  17. required public init?(coder: NSCoder) {
  18. fatalError("init(coder:) has not been implemented")
  19. }
  20. static let cellID = "ASMyRingCell"
  21. lazy var ringView: ASRingToneCellView = {
  22. let ringToneView = ASRingToneCellView()
  23. ringToneView.cornerRadius = 0.0
  24. ringToneView.setRingBtn.isHidden = false
  25. ringToneView.editBtn.isHidden = true
  26. ringToneView.clickPlayHandel = { [weak self] isplay in
  27. guard let self = self else { return }
  28. clickPlay()
  29. }
  30. // ringToneView.clickEditHandel = { [weak self] in
  31. // guard let self = self else { return }
  32. // clickEidtBtn()
  33. // }
  34. ringToneView.clickSetUpHandel = { [weak self] in
  35. guard let self = self else { return }
  36. clickSetRingBtn()
  37. }
  38. return ringToneView
  39. }()
  40. lazy var generateView: TSRingToneGenerateView = {
  41. let generateView = TSRingToneGenerateView()
  42. generateView.isHidden = true
  43. generateView.refreshHandel = { [weak self] in
  44. guard let self = self else { return }
  45. guard let oldModel = model else { return }
  46. if oldModel.modelType == .ttr {
  47. // if kPurchaseToolShared.kJudgeVipFreeType(vipFreeNumType: .ringtones){ return }//判断 vip
  48. if ASGenerateTextToRingOperationQueue.shared.isAvailability {
  49. generateView.setProgress(progress: 0)
  50. let gennerateOperation = ASGenerateTextToRingOperationQueue.shared.creatOperation(uuid: oldModel.uuid)
  51. gennerateOperation.isSaveProcessToDB = true
  52. gennerateOperation.creatRing(oldModel: oldModel) { success in }
  53. // dePrint("\(self.indexPath.item),刷新进度发self.operation=\(gennerateOperation)")
  54. modelDidSet()
  55. }
  56. }else if oldModel.modelType == .rtr {
  57. // if kPurchaseToolShared.kJudgeVipFreeType(vipFreeNumType: .ringtones){ return }//判断 vip
  58. if ASGenerateRingToRingOperationQueue.shared.isAvailability {
  59. generateView.setProgress(progress: 0)
  60. let gennerateOperation = ASGenerateRingToRingOperationQueue.shared.creatOperation(uuid: oldModel.uuid)
  61. gennerateOperation.isSaveProcessToDB = true
  62. gennerateOperation.creatRing(oldModel: oldModel) { success in }
  63. modelDidSet()
  64. }
  65. }
  66. }
  67. return generateView
  68. }()
  69. lazy var exampleView: UIView = {
  70. let exampleView = UIView()
  71. exampleView.backgroundColor = "#7E57F4".uiColor
  72. let textLabel = UILabel.createLabel(
  73. text: "Example".localized,
  74. font: .font(size: 12),
  75. textColor: .white
  76. )
  77. exampleView.addSubview(textLabel)
  78. textLabel.snp.makeConstraints { make in
  79. make.top.edges.equalTo(UIEdgeInsets(top: 4, left: 6, bottom: 4, right: 6))
  80. }
  81. kDelayMainShort {
  82. exampleView.makeCorner([.topLeft,.bottomLeft], radius: 10)
  83. }
  84. return exampleView
  85. }()
  86. lazy var vipView: UIImageView = {
  87. let vipView = UIImageView.createImageView(imageName: "ring_vip")
  88. vipView.isHidden = true
  89. return vipView
  90. }()
  91. var model:ASActionInfoModel?{
  92. didSet{
  93. modelDidSet()
  94. }
  95. }
  96. func creatUI() {
  97. cornerRadius = 16.0
  98. backgroundColor = .cardColor
  99. contentView.addSubview(ringView)
  100. ringView.snp.makeConstraints { make in
  101. make.edges.equalToSuperview()
  102. }
  103. contentView.addSubview(vipView)
  104. vipView.snp.makeConstraints { make in
  105. make.top.trailing.equalTo(0)
  106. make.width.height.equalTo(24)
  107. }
  108. contentView.addSubview(exampleView)
  109. exampleView.snp.makeConstraints { make in
  110. make.trailing.equalToSuperview()
  111. make.top.equalTo(0)
  112. make.height.equalTo(20)
  113. }
  114. contentView.addSubview(generateView)
  115. generateView.snp.makeConstraints { make in
  116. make.edges.equalToSuperview()
  117. }
  118. }
  119. func setTargetVC(targetVC:UIViewController?,indexPath:IndexPath) {
  120. self.targetVC = targetVC
  121. self.indexPath = indexPath
  122. if let vc = targetVC as? any SwipeCollectionViewCellDelegate {
  123. self.delegate = vc
  124. }
  125. }
  126. func dealThings(){
  127. }
  128. var operation:ASGenerateBaseOperation?
  129. }
  130. extension ASMyRingCell {
  131. var currentOperation:ASGenerateBaseOperation?{
  132. guard let model = model else { return nil }
  133. // dePrint("\(self.indexPath.item),刷新进度真self.uuid=\(model.uuid)")
  134. if model.modelType == .ttr {
  135. return ASGenerateTextToRingOperationQueue.shared.findOperation(uuid: model.uuid)
  136. }else if model.modelType == .rtr {
  137. return ASGenerateRingToRingOperationQueue.shared.findOperation(uuid: model.uuid)
  138. }
  139. return nil
  140. }
  141. func modelDidSet(){
  142. guard let model = model else { return }
  143. if let rintoneOperation = currentOperation {
  144. // rintoneOperation.currentActionInfoModelChanged = { [weak self] actionInfoModel in
  145. // guard let self = self else { return }
  146. // DispatchQueue.main.async {
  147. // self.updataActionInfoModelView(model: actionInfoModel)
  148. // }
  149. // }
  150. rintoneOperation.stateDataPblishedChanged = { [weak self] state, actionInfoModel in
  151. guard let self = self else { return }
  152. switch state {
  153. case .failed(let errorStr,let code):
  154. generateView.isHidden = false
  155. generateView.setFail()
  156. case .success:
  157. if let model = actionInfoModel {
  158. updataActionInfoModelView(model: model)
  159. }
  160. case .progress(let progress, let string):
  161. generateView.isHidden = false
  162. generateView.setProgress(progress: progress)
  163. default:
  164. generateView.isHidden = false
  165. generateView.setProgress(progress: 0)
  166. }
  167. }
  168. self.operation = rintoneOperation
  169. // dePrint("\(self.indexPath.item),刷新进度真self.operation=\(self.operation)")
  170. }
  171. else{
  172. // dePrint("\(self.indexPath.item),刷新进度空self.operation=\(self.operation)")
  173. self.operation = nil
  174. }
  175. updataActionInfoModelView(model: model)
  176. dePrint("\(self.indexPath.item),model actionStatus 收到=\(model.actionStatus)")
  177. if playSelf{
  178. setPlayerStateChangedHandle()
  179. }else{
  180. changePlayerState(state: .stop)
  181. }
  182. }
  183. func setPlayerStateChangedHandle(){
  184. TSBusinessAudioPlayer.shared.stateChangedHandle = { [weak self] playerState in
  185. guard let self = self else { return }
  186. self.changePlayerState(state: playerState)
  187. }
  188. self.changePlayerState(state: TSBusinessAudioPlayer.shared.currentPlayerState)
  189. }
  190. }
  191. extension ASMyRingCell {
  192. }
  193. extension ASMyRingCell {
  194. func clickPlay() {
  195. if playSelf{
  196. if TSBusinessAudioPlayer.shared.isLoading{
  197. return
  198. }
  199. if TSBusinessAudioPlayer.shared.isPlaying{
  200. TSBusinessAudioPlayer.shared.stop()
  201. }else{
  202. TSBusinessAudioPlayer.shared.playUrlString(modelUrlString,localURL: modelLocalURL,indexPath: indexPath)
  203. }
  204. }else{
  205. TSBusinessAudioPlayer.shared.stop()//让上一个对象停止播放
  206. setPlayerStateChangedHandle()//更换监听
  207. TSBusinessAudioPlayer.shared.playUrlString(modelUrlString,localURL: modelLocalURL,indexPath: indexPath)
  208. }
  209. }
  210. func changePlayerState(state:TSBusinessAudioPlayer.PlayerState){
  211. ringView.handelAudioPlayerStateChange(state: state)
  212. }
  213. func updataActionInfoModelView(model:ASActionInfoModel){
  214. if model.modelType == .example {
  215. model.actionStatus = .success
  216. }
  217. switch model.actionStatus {
  218. case .pending,.running:
  219. generateView.isHidden = false
  220. generateView.setProgress(progress: model.percent*kPercentScale)
  221. case .success:
  222. generateView.isHidden = true
  223. ringView.timeLab.text = Float(model.response.duration).floatToMinuteSecond()
  224. ringView.nameLab.text = model.response.title
  225. ringView.setCoverImageView(urlString: model.response.coverUrl)
  226. exampleView.isHidden = model.modelType != .example
  227. vipView.isHidden = true
  228. self.changePlayerState(state: TSBusinessAudioPlayer.shared.currentPlayerState)
  229. case .failed:
  230. generateView.isHidden = false
  231. generateView.setFail()
  232. }
  233. }
  234. var playSelf:Bool{
  235. return TSBusinessAudioPlayer.shared.isPlayURLString(string: modelUrlString,localURL: modelLocalURL,indexPath: indexPath)
  236. }
  237. var modelUrlString:String{
  238. var urlString:String = ""
  239. if let model = model{
  240. urlString = model.response.musicUrl
  241. }
  242. return urlString
  243. }
  244. var modelLocalURL:URL?{
  245. return model?.localURL
  246. }
  247. }
  248. //点击编辑和设置按钮
  249. extension ASMyRingCell {
  250. @objc func clickSetRingBtn(){
  251. if let model = model {
  252. setShareBand(infoModel: model)
  253. }
  254. TSBusinessAudioPlayer.shared.stop()
  255. }
  256. func setShareBand(infoModel:ASActionInfoModel){
  257. guard let targetVC = targetVC else { return }
  258. let needVip = infoModel.response.vip
  259. let urlString = infoModel.response.musicUrl
  260. let fileName = infoModel.response.title
  261. ASDownloadManager.getDownLoadRing(urlString: urlString){ url,downLoad in
  262. if let path = url {
  263. _ = kshareBand(needVip: needVip, vc: targetVC, fileURL: path, fileName: fileName)
  264. }
  265. }
  266. }
  267. }