TSGeneralRintoneVC.swift 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189
  1. //
  2. // TSGeneralRintoneVC.swift
  3. // AIRingtone
  4. //
  5. // Created by 100Years on 2025/3/6.
  6. //
  7. class TSGeneralRintoneVC: TSBottomAlertVC {
  8. var infoModel:TSActionInfoModel?
  9. var complete:((TSActionInfoModel)->Void)
  10. var prompt:String
  11. var promptSort:String
  12. var showInfoModel:TSActionInfoModel?
  13. init(prompt: String,promptSort: String,showInfoModel:TSActionInfoModel? = nil,complete:@escaping ((TSActionInfoModel)->Void)) {
  14. self.prompt = prompt
  15. self.promptSort = promptSort
  16. self.showInfoModel = showInfoModel
  17. self.complete = complete
  18. super.init()
  19. }
  20. // lazy var viewModel: TSGeneralRintoneVM = {
  21. // let viewModel:TSGeneralRintoneVM = TSGeneralRintoneVM()
  22. // viewModel.aiText = aiText
  23. // return viewModel
  24. // }()
  25. lazy var audioPlayer = TSBusinessAudioPlayer.shared
  26. var uuidString:String = UUID().uuidString
  27. @MainActor required init?(coder: NSCoder) {
  28. fatalError("init(coder:) has not been implemented")
  29. }
  30. lazy var ringView: TSRingToneCellView = {
  31. let ringToneView = TSRingToneCellView()
  32. ringToneView.isSelectedChangeColor = false
  33. ringToneView.clickPlayHandel = { [weak self] play in
  34. guard let self = self else { return }
  35. clickPlay()
  36. }
  37. return ringToneView
  38. }()
  39. //############################## 生成动画 ##############################
  40. lazy var generateInView : TSCommonloadingView = {
  41. let generateInView = TSCommonloadingView()
  42. generateInView.textLabel.text = "Working on your ringtone...".localized
  43. // generateInView.timeLabel.text = "~ 4min"
  44. // generateInView.cancelBtn.addTarget(self, action: #selector(closePage), for: .touchUpInside)
  45. generateInView.backstageBtn.addTarget(self, action: #selector(clickBackstageBtn), for: .touchUpInside)
  46. return generateInView
  47. }()
  48. override func createView() {
  49. super.createView()
  50. view.addSubview(generateInView)
  51. generateInView.snp.makeConstraints { make in
  52. make.top.bottom.leading.trailing.equalTo(0)
  53. }
  54. diyView.addSubview(ringView)
  55. ringView.snp.makeConstraints { make in
  56. make.top.equalTo(98)
  57. make.centerX.equalToSuperview()
  58. make.width.equalTo(k_ScreenWidth - 40)
  59. make.height.equalTo(72)
  60. }
  61. diyView.addSubview(regenerateBtn)
  62. regenerateBtn.snp.makeConstraints { make in
  63. make.top.equalTo(ringView.snp.bottom).offset(16)
  64. make.centerX.equalToSuperview()
  65. }
  66. saveBtn.setTitle("Set As Ringtone".localized, for: .normal)
  67. resultIconImageView.image = resultIcon
  68. bottomViewH = 340.0
  69. bgImageView.addShadow(shadowColor: "#E6E229".uiColor.cgColor, shadowOffset: .zero, shadowRadius: 20, shadowOpacity: 0.8)
  70. diyView.addSubview(failView)
  71. failView.snp.updateConstraints { make in
  72. make.centerY.equalToSuperview().offset(0)
  73. }
  74. }
  75. @objc func clickBackstageBtn() {
  76. // viewModel.cancelAllRequest()
  77. self.dismiss(animated: true, completion: nil)
  78. // hiddenSelfVC(hidden: true)
  79. }
  80. // @objc override func closePage() {
  81. // viewModel.cancelAllRequest()
  82. // self.dismiss(animated: true, completion: nil)
  83. // }
  84. override func clickAgainBtn() {
  85. audioPlayer.stop()
  86. if kPurchaseToolShared.kJudgeVipFreeType(vipFreeNumType: .ringtones, vc: self){ return }//判断 vip
  87. creatRintone()
  88. }
  89. @objc override func clickSubmitBtn(){
  90. guard let model = infoModel else {
  91. kShowToastDataMissing()
  92. return
  93. }
  94. audioPlayer.stop()
  95. TSDownloadManager.getDownLoadRing(urlString: model.response.musicUrl){ url,downLoad in
  96. if let path = url {
  97. _ = kPurchaseToolShared.kshareBand(needVip: model.response.vip, vc: self, fileURL: path, fileName: model.response.title)
  98. }
  99. }
  100. }
  101. @objc func clickPlay(){
  102. guard let infoModel = infoModel else { return }
  103. if TSBusinessAudioPlayer.shared.isPlayURLString(string: infoModel.response.musicUrl) {
  104. if TSBusinessAudioPlayer.shared.isLoading{
  105. return
  106. }
  107. if TSBusinessAudioPlayer.shared.isPlaying{
  108. TSBusinessAudioPlayer.shared.stop()
  109. }else{
  110. audioPlayer.playUrlString(infoModel.response.musicUrl)
  111. }
  112. }else {
  113. TSBusinessAudioPlayer.shared.stop()//让上一个对象停止播放
  114. ringView.monitorPlayStateDefaultHandle()//更换监听
  115. audioPlayer.playUrlString(infoModel.response.musicUrl)
  116. }
  117. }
  118. override func viewWillDisappear(_ animated: Bool) {
  119. super.viewWillDisappear(animated)
  120. audioPlayer.stop()
  121. }
  122. override func dealThings() {
  123. // viewModel.creatRintone(text: self.aiText)
  124. // viewModel.$stateDatauPblished.receive(on: DispatchQueue.main).sink {[weak self] (state,model) in
  125. // guard let self = self else { return }
  126. // self.upDateView(state: state, model: model)
  127. // }.store(in: &cancellable)
  128. if let showInfoModel = showInfoModel {
  129. showSuccess(model: showInfoModel)
  130. updateInfoModel(model: showInfoModel)
  131. }else {
  132. creatRintone()
  133. }
  134. }
  135. func creatRintone() {
  136. if kPurchaseToolShared.kJudgeVipFreeType(vipFreeNumType: .ringtones, vc: self){ return }//判断 vip
  137. self.uuidString = UUID().uuidString
  138. let operation:TSGenerateRintoneOperation = TSGenerateRintoneOperationQueue.shared.creatOperation(uuid: self.uuidString)
  139. operation.$stateDatauPblished.receive(on: DispatchQueue.main).sink {[weak self] (state,model) in
  140. guard let self = self else { return }
  141. self.upDateView(state: state, model: model)
  142. }.store(in: &cancellable)
  143. var oldModel:TSActionInfoModel? = nil
  144. if let model = self.infoModel ,model.actionStatus == .failed{
  145. oldModel = model
  146. }
  147. operation.creatRintone(oldModel: oldModel, prompt: prompt, promptSort: promptSort)
  148. // operation.creatRintone(oldModel: self.infoModel, prompt: prompt, promptSort: promptSort)
  149. }
  150. }
  151. extension TSGeneralRintoneVC{
  152. func setRingViewData(model:TSActionInfoModel) {
  153. ringView.timeLab.text = Float(model.request.duration).floatToMinuteSecond()
  154. ringView.nameLab.text = model.response.title
  155. ringView.setCoverImageView(urlString: model.response.coverUrl)
  156. }
  157. }