TSAIChangeEmoteVM.swift 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245
  1. //
  2. // TSAIChangeEmoteVM.swift
  3. // AIEmoji
  4. //
  5. // Created by 100Years on 2025/4/10.
  6. //
  7. import ObjectMapper
  8. import Alamofire
  9. class TSAIChangeEmoteVM {
  10. //###################################### 样式选择 ######################################
  11. var selectedStyleIndex:Int = 0
  12. lazy var selectStyleModels: [TSGenerateStyleModel] = {
  13. var selectStyleModels = [TSGenerateStyleModel]()
  14. if let dataArray = Mapper<TSGenerateStyleModel>().mapArray(JSONfile: "ai_change_emote_style.json"){
  15. selectStyleModels = dataArray
  16. if let model = dataArray.safeObj(At: selectedStyleIndex) {
  17. selectStyleModel = model //加上默认的选择
  18. }
  19. }
  20. return selectStyleModels
  21. }()
  22. var selectStyleModel:TSGenerateStyleModel?
  23. var isSavePhotoMark:Bool = false
  24. var isNeedSavePhoto:Bool {
  25. if isSavePhotoMark == false{
  26. for model in selectStyleModels {
  27. if let _ = model.actionInfoModel {
  28. return true
  29. }
  30. }
  31. }
  32. return false
  33. }
  34. //###################################### 生成图片 ######################################
  35. var uploadRequest:Request?
  36. var creatRequest:Request?
  37. var queryRequest:Request?
  38. var stopNetwork = false
  39. @Published var stateDatauPblished:(TSProgressState,TSActionInfoModel?) = (TSProgressState.none,nil)
  40. var aiText:String = ""
  41. var generatingProgress = 0
  42. var upLoadImage:UIImage?{
  43. didSet{
  44. imageUrl = nil
  45. isSavePhotoMark = false
  46. for model in selectStyleModels {
  47. model.actionInfoModel = nil
  48. }
  49. }
  50. }
  51. var imageUrl:String?
  52. }
  53. extension TSAIChangeEmoteVM {
  54. func creatImage() {
  55. guard let imageUrl = imageUrl else { return }
  56. guard let selectStyleModel = selectStyleModel else { return }
  57. generatingProgress = 0
  58. stopNetwork = false
  59. stateDatauPblished = (.start,nil)
  60. stateDatauPblished = (.progressString(generating(progress: 0.0)),nil)
  61. let postDict = ["emotionType":selectStyleModel.style,
  62. "imageUrl":imageUrl,
  63. "device":getUserInfoJsonString()]
  64. creatRequest = TSNetworkShared.post(urlType: .changeEmotion,parameters:postDict) { [weak self] data,error in
  65. guard let self = self else { return }
  66. if let dataDict = data as? [String:Any] ,
  67. dataDict.safeInt(forKey: "code") == 200,
  68. let actionId = dataDict["actionId"] as? Int{
  69. if stopNetwork == false {
  70. self.getActionInfo(action_id:actionId)
  71. }
  72. }else{
  73. self.stateDatauPblished = (.failed(error?.localizedDescription ?? ""),nil)
  74. }
  75. }
  76. }
  77. func getActionInfo(action_id:Int){
  78. queryRequest = TSNetworkShared.get(urlType: .actionInfo,parameters: ["action_id":action_id]) { [weak self] data,error in
  79. guard let self = self else { return }
  80. if let result = kNetWorkResultSuccess(data: data) {
  81. if let genmojiModel = TSActionInfoModel(JSON: result) {
  82. switch genmojiModel.actionStatus {
  83. case .success:
  84. if let url = URL(string:genmojiModel.response.resultUrl) {
  85. UIImageView.downloadImageWithProgress(url: url) { [weak self] progress in
  86. guard let self = self else { return }
  87. let progressInt = Int(progress*10.0)
  88. let progressString = "Changing".localized + " \(90 + progressInt)%"
  89. stateDatauPblished = (.progressString(progressString),nil)
  90. dePrint("生成后图片下载进度 \(progress)")
  91. } completion: {[weak self] image in
  92. guard let self = self else { return }
  93. self.stateDatauPblished = (.success(nil),genmojiModel)
  94. self.selectStyleModel?.actionInfoModel = genmojiModel
  95. generatingProgress = 0
  96. }
  97. }else{
  98. self.stateDatauPblished = (.success(nil),genmojiModel)
  99. self.selectStyleModel?.actionInfoModel = genmojiModel
  100. generatingProgress = 0
  101. }
  102. case .failed:
  103. self.stateDatauPblished = (.failed(kNetWorkMessage(data: data) ?? ""),nil)
  104. generatingProgress = 0
  105. default:
  106. stateDatauPblished = (.progressString(generating(progress: genmojiModel.percent)),nil)
  107. if stopNetwork == false {
  108. kDelayOnMainThread(1.0) {
  109. self.getActionInfo(action_id: action_id)
  110. }
  111. }
  112. }
  113. }
  114. }else{
  115. self.stateDatauPblished = (.failed(error?.localizedDescription ?? ""),nil)
  116. }
  117. }
  118. }
  119. func cancelAllRequest(){
  120. creatRequest?.cancel()
  121. queryRequest?.cancel()
  122. stopNetwork = true
  123. }
  124. func generating(progress:Float) -> String {
  125. let progress = progress*(0.9) // 预留 10% 进度给图片下载
  126. //Generating 0%-100%
  127. var progressInt = Int(progress*100)
  128. if progressInt > 99 {
  129. progressInt = 99
  130. }
  131. generatingProgress = progressInt
  132. return "Changing".localized + " \(progressInt)%"
  133. }
  134. func uploadAndCreatImage() {
  135. if let model = selectStyleModel?.actionInfoModel {
  136. self.stateDatauPblished = (.success(nil),model)
  137. return
  138. }
  139. if let imageUrl = imageUrl,imageUrl.contains("http") {
  140. creatImage()
  141. return
  142. }
  143. stopNetwork = false
  144. stateDatauPblished = (.start,nil)
  145. stateDatauPblished = (.progressString(uploadingPhoto(progress: 0.0)),nil)
  146. uploadImage { [weak self] progress in
  147. guard let self = self else { return }
  148. if generatingProgress == 0 {
  149. stateDatauPblished = (.progressString(uploadingPhoto(progress: progress)),nil)
  150. }
  151. } completion: { [weak self] data, error in
  152. guard let self = self else { return }
  153. if let error = error {
  154. imageUrl = nil
  155. self.stateDatauPblished = (.failed(error.localizedDescription),nil)
  156. }else{
  157. if let string = data as? String {
  158. imageUrl = string
  159. creatImage()
  160. }
  161. }
  162. }
  163. }
  164. func uploadingPhoto(progress:Float) -> String {
  165. //Uploading Photo 0%-100%
  166. var progressInt = Int(progress*100)
  167. if progressInt > 99 {
  168. progressInt = 99
  169. }
  170. return "Uploading Photo".localized + " \(progressInt)%"
  171. }
  172. func uploadImage(
  173. progressHandler: @escaping (Float) -> Void, // 上传进度回调
  174. completion: @escaping (Any?, Error?) -> Void)
  175. {
  176. guard let imageData = upLoadImage?.pngData() else { return }
  177. stateDatauPblished = (.start,nil)
  178. let dataArray = [
  179. ["data": imageData,
  180. "fieldName": "file", // 字段名
  181. "fileName": "image.png", // 文件名
  182. "mimeType": "image/png" // MIME 类型
  183. ]
  184. ]
  185. uploadRequest = TSNetworkShared.uploadData(
  186. urlType: .upload,
  187. dataArray: dataArray,
  188. progressHandler: { progress in
  189. progressHandler(progress)
  190. },completion: { [weak self] result in
  191. guard let self = self else { return }
  192. switch result {
  193. case .success(let data):
  194. if let dataDict = data as? [String:Any] ,
  195. dataDict.safeInt(forKey: "code") == 200,
  196. let picUrl = dataDict["result"] as? String{
  197. completion(picUrl,nil)
  198. }else{
  199. let error = NSError(domain: "Service exception", code: 0)
  200. completion(nil,error)
  201. }
  202. case .failure(let error):
  203. completion(nil,error)
  204. }
  205. })
  206. }
  207. }