TSGenerateRintoneOperation.swift 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. //
  2. // TSGenerateRintoneOperation.swift
  3. // AIRingtone
  4. //
  5. // Created by 100Years on 2025/3/21.
  6. //
  7. import Combine
  8. import Alamofire
  9. class TSGenerateRintoneOperationQueue: TSGenerateBaseOperationQueue {
  10. static let shared:TSGenerateRintoneOperationQueue = TSGenerateRintoneOperationQueue()
  11. func creatOperation(uuid: String) -> TSGenerateRintoneOperation {
  12. let operation = super.creatOperation(uuid: uuid, type: TSGenerateRintoneOperation.self)
  13. handleStateDatauPblished(uuid: uuid, generateOperation: operation as! TSGenerateBaseOperation, notificationName: .kGenerateRintoneOperationChanged)
  14. return operation as! TSGenerateRintoneOperation
  15. }
  16. override func getUUIDData(uuid:String)->(TSProgressState,TSActionInfoModel?){
  17. if let rintoneOperation = TSGenerateRintoneOperationQueue.shared.findOperation(uuid: uuid) as? TSGenerateRintoneOperation {
  18. dePrint("TSBaseOperation stateDatauPblished 发送 = \(rintoneOperation.stateDatauPblished)")
  19. return (rintoneOperation.stateDatauPblished.0,rintoneOperation.currentActionInfoModel)
  20. }
  21. return (.none,TSActionInfoModel())
  22. }
  23. }
  24. class TSGenerateRintoneOperation: TSGenerateBaseOperation , @unchecked Sendable{
  25. override var actionInfoDict:[String:Any]{
  26. return [
  27. "actionType":"music_create",
  28. "comments": "Success",
  29. "costTime":15,
  30. "createdTimestamp":1741338454,
  31. "id":1536,
  32. "percent":1,
  33. "request":"{\"prompt\": \"Create a Techno ringtone with a repetitive bassline, crisp hi-hats, and subtle synth textures. Use a BPM of 125-130 for a sleek, modern sound., Create a uplifting and modern music track blending Pop, Electronic, and Ambient elements. Use a BPM of 100-120, a catchy melody with synth or piano, warm harmonies, and a mix of electronic and organic sounds. Ensure a clear structure (Intro, Verse, Chorus, Outro) and a light, positive vibe suitable for background or casual listening\", \"duration\": 5}",
  34. "response":"{\"coverUrl\": \"https://be-aigc.s3-accelerate.amazonaws.com/f0fb7739-a5cc-4805-9b68-b4a5890eb285.png\", \"title\": \"Neon Pulse\\\" \\n\\\"Horizon Glow\", \"musicUrl\": \"https://be-aigc.s3-accelerate.amazonaws.com/c47d40dd-d07c-4edc-a6d9-8382438149d1.wav\"}",
  35. "status":"success"
  36. ]
  37. }
  38. override func replaceSaveInfoModel(model:TSActionInfoModel){
  39. model.uuid = uuid
  40. TSAIRintoneHistory.shared.replaceModel(oldID: currentActionInfoModel.id, newModel: model)
  41. currentActionInfoModel = model
  42. dePrint("TSAIRintoneHistory.shared.listModels.count=\(TSAIRintoneHistory.shared.listModels.count)")
  43. dePrint("model actionStatus 发出=\(model.actionStatus)")
  44. currentActionInfoModelChanged?(currentActionInfoModel)
  45. }
  46. override func handleGenerateSuccess() {
  47. kPurchaseToolShared.useOnceForFree(type: .ringtones)
  48. }
  49. // //模拟数据
  50. // func creatRintone(oldModel:TSActionInfoModel? = nil,prompt:String,promptSort:String) {
  51. //
  52. // initializeFirstCurrentActionInfoModel(oldModel: oldModel, prompt: prompt, promptSort: promptSort)
  53. // let time = 8.0
  54. //
  55. // for i in 0..<Int(time){
  56. // kDelayOnMainThread(Double(i)) {
  57. // let progress = Float(i)*10.0/100.0
  58. // self.currentActionInfoModel.percent = progress
  59. // self.currentActionInfoModel.actionStatus = .running
  60. // self.currentActionInfoModel.status = "running"
  61. // self.replaceSaveInfoModel(model: self.currentActionInfoModel)
  62. // self.stateDatauPblished = (.progressString(self.generating(progress: progress)),nil)
  63. // }
  64. // }
  65. //
  66. // kDelayOnMainThread(time+1.0) {
  67. // if kRandomBool(), let infoModel = TSActionInfoModel(JSON: self.actionInfoDict){
  68. // infoModel.id = Int.uuid
  69. // self.replaceSaveInfoModel(model: infoModel)
  70. // self.stateDatauPblished = (.success(nil),self.currentActionInfoModel)
  71. // }else{
  72. // self.currentActionInfoModel.actionStatus = .failed
  73. // self.currentActionInfoModel.status = "failed"
  74. // self.replaceSaveInfoModel(model: self.currentActionInfoModel)
  75. // self.stateDatauPblished = (.failed("error?.localizedDescription"),nil)
  76. // }
  77. // TSAIRintoneHistory.shared.dePrintAllModel()
  78. // }
  79. // }
  80. func creatRintone(oldModel:TSActionInfoModel? = nil,prompt:String,promptSort:String) {
  81. initializeFirstCurrentActionInfoModel(oldModel: oldModel, prompt: prompt, promptSort: promptSort)
  82. generatingProgress = 0
  83. let postDict:[String : Any] = [
  84. "prompt":prompt,
  85. "duration":20
  86. ]
  87. creatRequest = TSNetworkShared.post(urlType: .musicCreate,parameters: postDict) { [weak self] data,error in
  88. guard let self = self else { return }
  89. if let dataDict = data as? [String:Any] ,
  90. dataDict.safeInt(forKey: "code") == 200,
  91. let actionId = dataDict["actionId"] as? Int{
  92. if stopNetwork == false {
  93. self.getActionInfo(action_id:actionId)
  94. return
  95. }
  96. }
  97. handleFailInfoModel(errorString: error?.localizedDescription)
  98. }
  99. }
  100. }