PQBaseViewModel.swift 32 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671
  1. //
  2. // PQBaseViewModel.swift
  3. // PQSpeed
  4. //
  5. // Created by SanW on 2020/5/25.
  6. // Copyright © 2020 BytesFlow. All rights reserved.
  7. //
  8. import Alamofire
  9. import UIKit
  10. import ObjectMapper
  11. import RealmSwift
  12. import BFCommonKit
  13. import BFNetRequestKit
  14. import BFUploadKit
  15. import BFMediaKit
  16. public class PQBaseViewModel: NSObject {
  17. public typealias completeHander = (_ userInfo: [String: Any]?, _ msg: String?) -> Void
  18. /// 搜索背景音乐
  19. /// - Parameters:
  20. /// - keyWord: 搜索key
  21. /// - pageNum: 当前页
  22. /// - pageSize: 每页个数 默认 :30
  23. /// - videoCount: 卡点音乐数据搜索-视频素材个数
  24. /// - imageCount: 卡点音乐数据搜索-图片素材个数
  25. /// - totalDuration: 卡点音乐数据搜索-素材总时长
  26. /// - completeHander: completeHander description
  27. /// - Returns: <#description#>
  28. public class func searchBGMListData(_ keyWord: String?, _ pageNum: Int = 1, _ pageSize: Int = 30,videoCount: Int = 0, imageCount: Int = 0, totalDuration: Float64 = 0, completeHander: @escaping (_ bgmList: [PQVoiceModel], _ msg: String?) -> Void) {
  29. BFNetRequestAdaptor.postRequestData(url: PQENVUtil.shared.materialSearchApi + searchBGMMaterialUrl, parames: ["keyWord": keyWord ?? "", "pageNo": pageNum, "pageSize": pageSize], commonParams: commonParams(), encoding: JSONEncoding.default, isJsonEncodingNormal: true) { response, _, error, _ in
  30. DispatchQueue.global().async {
  31. var bgmList = Array<PQVoiceModel>.init()
  32. if response is NSNull || response == nil {
  33. DispatchQueue.main.async {
  34. completeHander(bgmList, error?.msg)
  35. }
  36. return
  37. }
  38. let tempArr = (response as? [String: Any])?["entityList"] as? [[String: Any]]
  39. if tempArr != nil {
  40. for item in tempArr! {
  41. let tempModel = PQVoiceModel(jsonDict: item)
  42. tempModel.volume = 30
  43. tempModel.voiceType = VOICETYPT.BGM.rawValue
  44. if tempModel.rhythmSdata.count > 0 && (videoCount > 0 || imageCount > 0 || totalDuration > 0) {
  45. // tempModel.endTime = tempModel.startTime + tempModel.stuckPointCuttingTime(videoCount: videoCount, imageCount: imageCount, totalDuration: totalDuration)
  46. }
  47. bgmList.append(tempModel)
  48. }
  49. }
  50. DispatchQueue.main.async {
  51. completeHander(bgmList, nil)
  52. }
  53. }
  54. }
  55. }
  56. /// 请求系统配置
  57. /// - Parameter completeHander: <#completeHander description#>
  58. /// - Returns: <#description#>
  59. public class func systemConfig(completeHander: @escaping (_ isSuccess: Bool) -> Void) {
  60. if PQSingletoMemoryUtil.shared.isFinishedCoging {
  61. completeHander(true)
  62. return
  63. }
  64. BFNetRequestAdaptor.postRequestData(url: PQENVUtil.shared.longvideoapi + systemAppConfigUrl, parames: nil, commonParams: commonParams()) { response, _, _, _ in
  65. if response != nil, !(response is NSNull), (response as! [String: Any]).keys.contains("needLogin") {
  66. let needLogin: String = "\((response as! [String: Any])["needLogin"] ?? "0")"
  67. saveUserDefaults(key: cNeedLoginKey, value: needLogin)
  68. PQSingletoMemoryUtil.shared.needLogin = needLogin == "1"
  69. PQSingletoMemoryUtil.shared.isFinishedCoging = true
  70. completeHander(true)
  71. } else {
  72. completeHander(false)
  73. }
  74. }
  75. }
  76. /// 系统设置
  77. /// - Parameter completeHander: <#completeHander description#>
  78. /// - Returns: <#description#>
  79. public class func systemBaseConfig(completeHander: @escaping (_ isSuccess: Bool) -> Void) {
  80. BFNetRequestAdaptor.postRequestData(url: PQENVUtil.shared.longvideoapi + systemConfigUrl, parames: nil, commonParams: commonParams()) { _, _, _, _ in
  81. completeHander(true)
  82. }
  83. }
  84. /// 删除某个视频
  85. /// - Parameters:
  86. /// - videoId: <#videoId description#>
  87. /// - completeHander: <#completeHander description#>
  88. /// - Returns: <#description#>
  89. public class func deleteVideo(videoId: Int, completeHander: @escaping (_ isSuccess: Bool,_ videoId: Int, _ msg: String?) -> Void) {
  90. BFNetRequestAdaptor.postRequestData(url: PQENVUtil.shared.longvideoapi + deleteVideoUrl, parames: ["videoId": videoId], commonParams: commonParams()) { response, _, error, _ in
  91. if response != nil {
  92. postNotification(name: cDeleteVideoSuccessKey, userInfo: ["videoId": "\(videoId)"])
  93. completeHander(true,videoId, nil)
  94. } else {
  95. completeHander(false,videoId,error?.msg)
  96. }
  97. }
  98. }
  99. /// 不感兴趣某个视频b
  100. /// - Parameters:
  101. /// - videoId: 视频Id
  102. /// - completeHander: <#completeHander description#>
  103. /// - Returns: <#description#>
  104. public class func hateVideo(videoId: Int, completeHander: @escaping (_ isSuccess: Bool, _ msg: String?) -> Void) {
  105. BFNetRequestAdaptor.postRequestData(url: PQENVUtil.shared.longvideoapi + hateVideoUrl, parames: ["videoId": videoId], commonParams: commonParams()) { response, _, error, _ in
  106. if response != nil {
  107. completeHander(true, nil)
  108. } else {
  109. completeHander(false, error?.msg)
  110. }
  111. }
  112. }
  113. /// 获取用户发布最新/最热视频
  114. /// - Parameters:
  115. /// - type: 1-最新列表 2-最热列表
  116. /// - targetUid: 目标用户
  117. /// - pageSize: 页面大小
  118. /// - pageNo: 当前页
  119. /// - currentVideoId: 当前视频ID
  120. /// - sortField: 排序方式 1:时间,2:热度
  121. /// - layoutType: 页面排版方式 1:单列,2:双列
  122. /// - lastTimestamp: 最后一条记录的时间戳
  123. /// - Returns: <#description#>
  124. public class func userInfoVideoList(type: Int = 1, targetUid: Int, pageSize: Int = 10, pageNo: Int, currentVideoId _: Int = 0, sortField _: Int = 1, layoutType _: Int = 2, lastTimestamp: Int, completeHander: @escaping (_ listData: [PQVideoListModel]?, _ videoList: [[PQVideoListModel]]?, _ msg: String?) -> Void) {
  125. var url: String = PQENVUtil.shared.longvideoapi
  126. if type == 1 {
  127. url = url + latelyByCollectionIdUrl
  128. } else {
  129. url = url + hotByCollectionIdUrl
  130. }
  131. var params: [String: Any] = ["targetUid": targetUid, "pageSize": pageSize, "sortField": type]
  132. if type == 1 {
  133. params["lastTimestamp"] = lastTimestamp
  134. } else {
  135. params["pageNo"] = pageNo
  136. }
  137. BFNetRequestAdaptor.postRequestData(url: url, parames: params, commonParams: commonParams()) { response, _, error, _ in
  138. BFLog(message: "当前线程:\(Thread.isMainThread) ")
  139. DispatchQueue.global().async {
  140. BFLog(message: "当前线程 global:\(Thread.isMainThread) ")
  141. var listData = Array<PQVideoListModel>.init()
  142. var videoList = Array<[PQVideoListModel]>.init()
  143. if !(response is NSNull), response != nil {
  144. let tempArr = response as! [[String: Any]]
  145. for item in tempArr {
  146. let tempModel = PQVideoListModel(jsonDict: item)
  147. if targetUid == Int(BFLoginUserInfo.shared.uid) {
  148. tempModel.pageSource = .sp_videoDetail_upload
  149. } else {
  150. tempModel.pageSource = .sp_videoDetail_userHomePage
  151. }
  152. listData.append(tempModel)
  153. if tempModel.auditStatus == 5, tempModel.transcodeStatus == 3 {
  154. videoList.append([tempModel])
  155. }
  156. }
  157. DispatchQueue.main.async {
  158. BFLog(message: "当前线程 main:\(Thread.isMainThread) ")
  159. completeHander(listData, videoList, nil)
  160. }
  161. } else {
  162. DispatchQueue.main.async {
  163. BFLog(message: "当前线程main:\(Thread.isMainThread) ")
  164. completeHander(listData, videoList, error?.msg)
  165. }
  166. }
  167. }
  168. }
  169. }
  170. /// 请求举报原因列表
  171. /// - Parameters:
  172. /// - isReportUser: 是否举报用户
  173. /// - groupId: 组id
  174. /// - completeHander: <#completeHander description#>
  175. /// - Returns: <#description#>
  176. public class func reportList(isReportUser: Bool, groupId _: String?, completeHander: @escaping (_ listData: [BFBaseModel]?) -> Void) {
  177. var url: String = PQENVUtil.shared.longvideoapi
  178. if isReportUser {
  179. url = url + reportUserListUrl
  180. } else {
  181. url = url + reportVideoListUrl
  182. }
  183. BFNetRequestAdaptor.postRequestData(url: url, parames: nil, commonParams: commonParams()) { response, _, _, _ in
  184. var reportList = Array<BFBaseModel>.init()
  185. if response is NSNull || response == nil {
  186. completeHander(reportList)
  187. return
  188. }
  189. if isReportUser {
  190. for item in response as! [String] {
  191. let tempModel = BFBaseModel()
  192. tempModel.title = item
  193. reportList.append(tempModel)
  194. }
  195. } else {
  196. let tempArr = response as! [[String: Any]]
  197. for item in tempArr {
  198. let reasonsArr = item["reasons"] as! [String]
  199. for reasonsItem in reasonsArr {
  200. let tempModel = BFBaseModel()
  201. tempModel.title = reasonsItem
  202. reportList.append(tempModel)
  203. }
  204. }
  205. }
  206. completeHander(reportList)
  207. }
  208. }
  209. /// 举报视频/用户
  210. /// - Parameters:
  211. /// - isReportUser: 是否是举报用户
  212. /// - videoId: 视频ID
  213. /// - reason: 举报原因
  214. /// - completeHander: <#completeHander description#>
  215. /// - Returns: <#description#>
  216. public class func reportOprate(isReportUser: Bool, uniqueId: Int, reason: String?, completeHander: @escaping (_ isSuccess: Bool) -> Void) {
  217. var params: [String: Any] = ["reason": reason ?? ""]
  218. var url: String = PQENVUtil.shared.longvideoapi
  219. if isReportUser {
  220. url = url + reportUserUrl
  221. params["reportUid"] = uniqueId
  222. } else {
  223. url = url + reportVideoUrl
  224. params["videoId"] = uniqueId
  225. }
  226. BFNetRequestAdaptor.postRequestData(url: url, parames: params, commonParams: commonParams()) { _, _, _, _ in
  227. completeHander(true)
  228. }
  229. }
  230. /// 拉黑/移除某个用户
  231. /// - Parameters:
  232. /// - targetUid: <#targetUid description#>
  233. /// - completeHander: <#completeHander description#>
  234. /// - Returns: <#description#>
  235. public class func bannedUser(isBanned: Bool, targetUid: Int, completeHander: @escaping (_ isSuccess: Bool, _ isBanned: Bool) -> Void) {
  236. var url: String = PQENVUtil.shared.longvideoapi
  237. if isBanned {
  238. url = url + bannedUserUrl
  239. } else {
  240. url = url + unBannedUserUrl
  241. }
  242. BFNetRequestAdaptor.postRequestData(url: url, parames: ["targetUid": targetUid], commonParams: commonParams()) { _, _, _, _ in
  243. postNotification(name: cBannedNotiKey, userInfo: ["userId": targetUid, "isBanned": isBanned ? 1 : 0])
  244. completeHander(true, isBanned)
  245. }
  246. }
  247. /// 某个用户是否被拉黑
  248. /// - Parameters:
  249. /// - targetUid: <#targetUid description#>
  250. /// - completeHander: <#completeHander description#>
  251. /// - Returns: <#description#>
  252. public class func isBannedUser(targetUid: Int, completeHander: @escaping (_ isSuccess: Bool, _ isBanned: Bool) -> Void) {
  253. BFNetRequestAdaptor.postRequestData(url: PQENVUtil.shared.longvideoapi + isBannedUserUrl, parames: ["targetUid": targetUid], commonParams: commonParams()) { response, _, _, _ in
  254. if response == nil {
  255. completeHander(false, false)
  256. } else {
  257. completeHander(true, (response as! Int) == 1)
  258. }
  259. }
  260. }
  261. /// 获取用户管理列表
  262. /// - Parameter completeHander: <#completeHander description#>
  263. /// - Returns: <#description#>
  264. class public func bannedUserList(completeHander: @escaping (_ listData: [PQUserInfoModel]?) -> Void) {
  265. BFNetRequestAdaptor.postRequestData(url: PQENVUtil.shared.longvideoapi + bannedUserListUrl, parames: nil, commonParams: commonParams()) { response, _, _, _ in
  266. var listData = Array<PQUserInfoModel>.init()
  267. if response is NSNull || response == nil {
  268. completeHander(listData)
  269. return
  270. }
  271. let responseArr: [[String: Any]] = response as! [[String: Any]]
  272. for dictItem in responseArr {
  273. let tempModel = PQUserInfoModel(jsonDict: dictItem)
  274. tempModel.isBanned = true
  275. listData.append(tempModel)
  276. }
  277. completeHander(listData)
  278. }
  279. }
  280. /// 获取视频详情数据
  281. /// - Parameters:
  282. /// - isBatch: 是否批量获取
  283. /// - videoId: 视频id ,isBatch = true 时,用英文,隔开
  284. /// - completeHander: <#completeHander description#>
  285. /// - Returns: <#description#>
  286. public class func videoDetailInfo(isBatch: Bool = false, videoId: String, completeHander: @escaping (_ videoDatas: [[PQVideoListModel]]?, _ code: Int?, _ mag: String?) -> Void) {
  287. var url: String = PQENVUtil.shared.longvideoapi
  288. var params: [String: Any] = [:]
  289. if isBatch {
  290. url = url + videosDetailUrl
  291. params = ["videoIds": videoId]
  292. } else {
  293. url = url + videoDetailUrl
  294. params = ["videoId": videoId]
  295. }
  296. BFNetRequestAdaptor.postRequestData(url: url, parames: params, commonParams: commonParams()) { response, _, error, _ in
  297. if response is NSNull || response == nil {
  298. completeHander(nil, error?.code, error?.msg)
  299. return
  300. }
  301. var videoDatasList = Array<[PQVideoListModel]>.init()
  302. if !isBatch {
  303. let tempModel = PQVideoListModel(jsonDict: response as! [String: Any])
  304. videoDatasList.append([tempModel])
  305. } else {
  306. if response is [[String: Any]] {
  307. let tempArr = response as! [[String: Any]]
  308. for item in tempArr {
  309. let tempModel = PQVideoListModel(jsonDict: item)
  310. tempModel.tab_pageType = .TAB_PAGETYPE_RECOMM
  311. tempModel.pageSource = .sp_category
  312. videoDatasList.append([tempModel])
  313. }
  314. }
  315. }
  316. completeHander(videoDatasList, 0, nil)
  317. }
  318. }
  319. public class func h5ShareLinkInfo(videoId: String, pageSource: PAGESOURCE, completeHander: @escaping (_ shareLinkPath: String?, _ mag: String?) -> Void) {
  320. BFNetRequestAdaptor.postRequestData(url: PQENVUtil.shared.longvideoapi + h5ShareLinkUrl, parames: ["videoId": videoId, "pageSource": pageSource.rawValue, "h5WxRootPageSource": pageSource.rawValue], commonParams: commonParams()) { response, _, _, _ in
  321. if response is NSNull || response == nil {
  322. completeHander(nil, "获取分享地址失败")
  323. return
  324. }
  325. completeHander(response as? String, nil)
  326. }
  327. }
  328. public class func wxFriendShareInfo(videoId: String, completeHander: @escaping (_ shareImagePath: String?, _ shareTitle: String?, _ shareWeappRawId: String?, _ mag: String?) -> Void) {
  329. BFNetRequestAdaptor.postRequestData(url: PQENVUtil.shared.longvideoapi + wxFriendUrl, parames: ["videoId": videoId], commonParams: commonParams()) { response, _, _, _ in
  330. if response is NSNull || response == nil {
  331. completeHander(nil, nil, nil, "获取分享好友数据失败")
  332. return
  333. }
  334. let responseDic = response as! [String: String]
  335. completeHander(responseDic["shareImgPath"], responseDic["shareTitle"], responseDic["shareWeappRawId"], nil)
  336. }
  337. }
  338. /// 获取白名单设置
  339. /// - Returns: <#description#>
  340. public class func datashowAllowData(completeHander: @escaping (_ isShowInfo: Bool, _ msg: String?) -> Void) {
  341. BFNetRequestAdaptor.postRequestData(url: PQENVUtil.shared.longvideoapi + datashowAllowUrl, parames: ["mid": getMachineCode()], commonParams: commonParams(), encoding: JSONEncoding.default, isJsonEncodingNormal: true) { response, _, _, _ in
  342. if response is NSNull || response == nil {
  343. completeHander(false, "获取白名单数据失败")
  344. return
  345. }
  346. completeHander((response as? Int) == 1, nil)
  347. }
  348. }
  349. /// add by ak 取 STS token
  350. /// - Parameter completeHander: completeHander description
  351. public class func getStsToken(completeHander: @escaping completeHander) {
  352. BFNetRequestAdaptor.postRequestData(url: PQENVUtil.shared.longvideoapi + getStsTokenUrl, parames: ["fileType": "2", "type": 1], commonParams: commonParams()) { response, _, error, _ in
  353. if error != nil {
  354. completeHander(nil, error?.msg)
  355. return
  356. }
  357. completeHander(response as? [String: Any], nil)
  358. }
  359. }
  360. /// 获取OSS
  361. /// - Parameter completeHander: <#completeHander description#>
  362. /// - Returns: <#description#>
  363. public class func ossTempToken(completeHander: @escaping completeHander) {
  364. BFNetRequestAdaptor.postRequestData(url: PQENVUtil.shared.longvideoapi + ossTempTokenUrl, parames: ["type": "2", "fileType": "1"], commonParams: commonParams()) { response, _, _, _ in
  365. completeHander(response as? [String: Any], nil)
  366. }
  367. }
  368. /// 请求APP 常规配置参数
  369. /// - Parameter completeHander: <#completeHander description#>
  370. /// - Returns: <#description#>
  371. public class func getBaseConfig(completeHander: @escaping (_ titles: Array<String>?) -> Void) {
  372. BFNetRequestAdaptor.postRequestData(url: PQENVUtil.shared.longvideoapi + getBaseConfigURL, parames: nil, commonParams: commonParams()) { response, _, _, _ in
  373. if response != nil, !(response is NSNull) {
  374. let responseDic = response as! [String: Any]
  375. BFLog(message: "推荐的标题为\(String(describing: responseDic["rhythmVideoTitles"]))")
  376. completeHander(responseDic["rhythmVideoTitles"] as? Array<String>)
  377. } else {
  378. completeHander(nil)
  379. }
  380. }
  381. }
  382. }
  383. // MARK: - 草稿箱相关
  384. /// 草稿箱相关
  385. extension PQBaseViewModel {
  386. /// 保存草稿-进入创作工具调用
  387. /// - Parameters:
  388. /// - draftboxId: 草稿ID
  389. /// - title: 草稿标题
  390. /// - coverUrl: 封面url
  391. /// - sdata: 结构化数据
  392. /// - videoFromScene:上传场景 1:普通上传 2:创作工具,3:普通上传转创作工具,4:后台转换加工,5:卡点视频制作
  393. /// - copyType:卡点视频制作再创作传 - 传3
  394. /// - originProjectId:卡点视频制作再创作传-源项目ID从那个项目做同款
  395. /// - completeHander: <#completeHander description#>
  396. /// - Returns: <#description#>
  397. public class func saveDraftbox(draftboxId: String?, title: String?, coverUrl: String?, sdata: String, videoFromScene: videoFromScene,copyType:Int? = nil,originProjectId:String? = nil, completeHander: @escaping (_ draftboxInfo: [String: Any]?, _ msg: String?) -> Void) {
  398. var parames: [String: Any] = ["sdata": sdata, "fromScene": videoFromScene.rawValue]
  399. if draftboxId != nil {
  400. parames["draftboxId"] = draftboxId
  401. }
  402. if copyType != nil && videoFromScene == .stuckPoint{
  403. parames["copyType"] = 3
  404. }
  405. if originProjectId != nil && videoFromScene == .stuckPoint{
  406. parames["originProjectId"] = originProjectId
  407. }
  408. if title != nil {
  409. parames["title"] = title
  410. }
  411. if coverUrl != nil {
  412. parames["coverUrl"] = coverUrl
  413. }
  414. BFLog(message: "保存草稿参数为:\(parames) \n\n sdata is:\n \(sdata) \n")
  415. /* 返回数据格式
  416. "coverUrl": "string",
  417. "dataVersionCode": 0,
  418. "draftboxId": "string",
  419. "duration": 0,
  420. "projectId": "string",
  421. "title": "string",
  422. "updateTimestamp": 0
  423. */
  424. BFNetRequestAdaptor.postRequestData(url: PQENVUtil.shared.clipapiapi + saveDraftboxUrl, parames: parames, commonParams: commonParams()) { response, _, error, _ in
  425. if error != nil {
  426. completeHander(nil, error?.msg)
  427. return
  428. }
  429. BFLog(message: "保存草稿返回数据 :\(String(describing: response)))")
  430. completeHander(response as? [String: Any], nil)
  431. }
  432. }
  433. /// 保存项目-合成的视频上传完成后发布视频send之前调用
  434. /// - Parameters:
  435. /// - projectId: <#projectId description#>
  436. /// - ossObjectKey: <#ossObjectKey description#>
  437. /// - draftboxId: <#draftboxId description#>
  438. /// - videoId: <#videoId description#>
  439. /// - sdata: <#sdata description#>
  440. /// - videoFromScene:上传场景 1:普通上传 2:创作工具,3:普通上传转创作工具,4:后台转换加工,5:卡点视频制作
  441. /// - completeHander: <#completeHander description#>
  442. /// - Returns: <#description#>
  443. public class func saveProject(draftboxId: String?, sdata: String, videoFromScene: videoFromScene, rhythmMode:createStickersModel? = nil, completeHander: @escaping (_ projectId: String?, _ msg: String?) -> Void) {
  444. var parames: [String: Any] = ["sdata": sdata,"fromScene": videoFromScene.rawValue]
  445. if draftboxId != nil {
  446. parames["draftboxId"] = draftboxId
  447. }
  448. if rhythmMode != nil {
  449. parames["rhythmMode"] = rhythmMode!.rawValue
  450. }
  451. BFNetRequestAdaptor.postRequestData(url: PQENVUtil.shared.clipapiapi + saveProjectUrl, parames: parames, commonParams: commonParams()) { response, _, error, _ in
  452. if error != nil {
  453. completeHander(nil, error?.msg)
  454. return
  455. }
  456. BFLog(message: "生成的项目id :\(String(describing: response))")
  457. completeHander(response as? String, nil)
  458. }
  459. }
  460. /// 更新项目
  461. /// - Parameter projectId: 项目 ID
  462. /// - Parameter produceStatus: 合成状态 必传-合成状态(5:合成成功,99:合成失败)
  463. /// - Parameter completeHander: 回调
  464. public class func updateProject(projectId: String?, produceStatus: String, completeHander: @escaping (_ projectId: String?, _ msg: String?) -> Void) {
  465. var parames: [String: String] = ["produceStatus": produceStatus]
  466. if projectId != nil {
  467. parames["projectId"] = projectId
  468. }
  469. BFNetRequestAdaptor.postRequestData(url: PQENVUtil.shared.clipapiapi + updateProjectUrl, parames: parames, commonParams: commonParams()) { response, _, error, _ in
  470. if error != nil {
  471. completeHander(nil, error?.msg)
  472. return
  473. }
  474. BFLog(message: "生成的项目id :\(String(describing: response))")
  475. completeHander(response as? String, nil)
  476. }
  477. }
  478. /// 发布视频后上报
  479. /// - Parameters:
  480. /// - projectId: 项目ID
  481. /// - videoId: 视频ID
  482. /// - videoFromScene:上传场景 1:普通上传 2:创作工具,3:普通上传转创作工具,4:后台转换加工,5:卡点视频制作
  483. /// - completeHander: <#completeHander description#>
  484. /// - Returns: <#description#>
  485. public class func reportSendVideo(_ projectId: String, _ videoId: String, videoFromScene: videoFromScene, completeHander: @escaping (_ isSeccess: Bool, _ msg: String?) -> Void) {
  486. BFNetRequestAdaptor.postRequestData(url: PQENVUtil.shared.clipapiapi + reportSendVideoUrl, parames: ["projectId": projectId, "videoId": videoId, "fromScene": videoFromScene.rawValue], commonParams: commonParams()) { _, _, error, _ in
  487. BFLog(message: "发布视频后上报:projectId = \(projectId),videoId = \(videoId)")
  488. if error != nil {
  489. completeHander(false, error?.msg)
  490. return
  491. }
  492. completeHander(true, nil)
  493. }
  494. }
  495. /// 获取用户项目草稿箱数据
  496. /// - Parameters:
  497. /// - lastTimestamp: 最后一条时间戳
  498. /// - pageSize: 每页大小
  499. /// - isSelected: 是否已选
  500. /// - completeHander: <#completeHander description#>
  501. public class func listUserDraftbox(lastTimestamp: Int, pageSize: Int = 10, isSelected: Bool = false, completeHander: @escaping (_ projectList: [PQEditProjectModel]?, _ msg: String?) -> Void) {
  502. let params: [String: Any] = ["pageSize": pageSize, "lastTimestamp": lastTimestamp]
  503. BFNetRequestAdaptor.postRequestData(url: PQENVUtil.shared.clipapiapi + listUserDraftboxUrl, parames: params, commonParams: commonParams()) { response, _, error, _ in
  504. if error?.code == -1009 || error?.code == -1001 {
  505. cShowHUB(superView: nil, msg: "网络不可用")
  506. }
  507. if response is NSNull || response == nil {
  508. completeHander(nil, error?.msg)
  509. return
  510. }
  511. var projectList = Array<PQEditProjectModel>.init()
  512. let tempList = (response as? [[String: Any]])
  513. if tempList != nil, (tempList?.count ?? 0) > 0 {
  514. let draftDB: Realm = PQSingletoRealmUtil.shared.getDraftDB(uid: BFLoginUserInfo.shared.uid)
  515. for item in tempList! {
  516. let tempModel: PQEditProjectModel? = Mapper<PQEditProjectModel>().map(JSON: item)
  517. tempModel?.isSelected = isSelected
  518. if tempModel != nil {
  519. let localData = PQSingletoRealmUtil.shared.reamlQueryObjects(realm: draftDB, PQEditProjectModel.self, filter: "draftboxId == '\(tempModel?.draftboxId ?? "")'")
  520. if localData != nil, (localData?.count ?? 0) > 0 {
  521. tempModel?.cacheDataVersionCode = (localData?.first as? PQEditProjectModel)?.dataVersionCode ?? 0
  522. }
  523. projectList.append(tempModel!)
  524. }
  525. }
  526. }
  527. completeHander(projectList, "请求成功")
  528. }
  529. }
  530. /// 获取草稿箱数量
  531. /// - Parameter completeHander: <#completeHander description#>
  532. /// - Returns: <#description#>
  533. public class func draftboxUserCount(completeHander: @escaping (_ draftboxCount: Int, _ msg: String?) -> Void) {
  534. BFNetRequestAdaptor.postRequestData(url: PQENVUtil.shared.clipapiapi + draftboxUserCountUrl, parames: nil, commonParams: commonParams()) { response, _, error, _ in
  535. if response is NSNull || response == nil {
  536. completeHander(0, error?.msg)
  537. return
  538. }
  539. completeHander((response as? Int) ?? 0, nil)
  540. }
  541. }
  542. /// 删除草稿箱
  543. /// - Parameters:
  544. /// - isBatch: 是否批量删除(多个用英文逗号分隔)
  545. /// - draftboxIds: 草稿id
  546. /// - completeHander: <#completeHander description#>
  547. public class func deleteDraftbox(isBatch: Bool = false, draftboxIds: String?, completeHander: @escaping (_ isSuccess: Bool, _ msg: String?) -> Void) {
  548. var url: String = PQENVUtil.shared.clipapiapi
  549. var params: [String: Any] = Dictionary<String, Any>.init()
  550. if isBatch {
  551. url = url + deleteMultiDraftboxUrl
  552. params["draftboxIds"] = draftboxIds ?? ""
  553. } else {
  554. url = url + deleteDraftboxUrl
  555. params["draftboxId"] = draftboxIds ?? ""
  556. }
  557. BFNetRequestAdaptor.postRequestData(url: url, parames: params, commonParams: commonParams()) { _, _, error, _ in
  558. completeHander(error == nil, error?.msg)
  559. }
  560. }
  561. /// 复制草稿箱
  562. /// - Parameters:
  563. /// - draftboxId: 草稿箱id
  564. /// - title: 草稿箱标题
  565. /// - copyType: 复制类型(1:复制自己的项目,2:创建副本(复制别人的项目) 3:再创作)
  566. /// - completeHander: <#completeHander description#>
  567. public class func copyDraftbox(draftboxId: String?, title: String, copyType: Int, completeHander: @escaping (_ newDraftboxId: String?, _ msg: String?) -> Void) {
  568. BFNetRequestAdaptor.postRequestData(url: PQENVUtil.shared.clipapiapi + copyDraftboxUrl, parames: ["draftboxId": draftboxId ?? "", "title": title, "copyType": copyType], commonParams: commonParams()) { response, _, error, _ in
  569. if response is NSNull || response == nil {
  570. completeHander(nil, error?.msg)
  571. return
  572. }
  573. completeHander(response as? String, nil)
  574. }
  575. }
  576. /// 更新草稿名称
  577. /// - Parameters:
  578. /// - draftboxId: 草稿id
  579. /// - title: 标题
  580. /// - completeHander: <#completeHander description#>
  581. public class func updateDraftBoxTitle(draftboxId: String?, title: String, completeHander: @escaping (_ newDraftData: PQEditProjectModel?, _ msg: String?) -> Void) {
  582. BFNetRequestAdaptor.postRequestData(url: PQENVUtil.shared.clipapiapi + updateDraftboxTitleUrl, parames: ["draftboxId": draftboxId ?? "", "title": title], commonParams: commonParams()) { response, _, error, _ in
  583. if response is NSNull || response == nil {
  584. completeHander(nil, error?.msg)
  585. return
  586. }
  587. completeHander(Mapper<PQEditProjectModel>().map(JSON: response as! [String: Any]), nil)
  588. }
  589. }
  590. /// 获取草稿箱结构化数据
  591. /// - Parameters:
  592. /// - : <# description#>
  593. /// - completeHander: <#completeHander description#>
  594. public class func draftboxGetSdata(draftboxId: String?, completeHander: @escaping (_ projectModel: PQEditSdataModel?, _ msg: String?) -> Void) {
  595. let params: [String: Any] = ["draftboxId": draftboxId ?? ""]
  596. BFNetRequestAdaptor.postRequestData(url: PQENVUtil.shared.clipapiapi + draftboxGetSdataUrl, parames: params, commonParams: commonParams()) { response, _, error, _ in
  597. if response is NSNull || response == nil {
  598. completeHander(nil, error?.msg)
  599. return
  600. }
  601. BFLog(message: "draftboxGetSdata response is \(String(describing: response))")
  602. let oneProjectModel = Mapper<PQEditSdataModel>().map(JSONString: response as! String)
  603. completeHander(oneProjectModel, "请求成功")
  604. }
  605. }
  606. /// 素材上报扩展字段
  607. /// - Parameter materialData: <#materialData description#>
  608. /// - Returns: <#description#>
  609. public class func uploadReportExParams(isDownload: Bool, materialData: PQEditVisionTrackMaterialsModel?) -> [String: Any] {
  610. var params: [String: Any] = ["draftboxId": PQSingletoMemoryUtil.shared.draftboxId ?? "", "materialType": materialData?.type ?? ""]
  611. if !isDownload {
  612. params["materialSource"] = (materialData?.localSearchId != nil && (materialData?.localSearchId ?? "").count > 0) ? "netMaterial" : "localMaterial"
  613. }
  614. if materialData?.id != nil, (materialData?.id ?? 0) > 0 {
  615. params["materialId"] = materialData?.id ?? 0
  616. }
  617. if materialData?.materialUrl != nil, (materialData?.materialUrl.count ?? 0) > 0 {
  618. params["materialUrl"] = materialData?.materialUrl ?? ""
  619. }
  620. if materialData?.locationPath != nil, materialData?.locationPath.count ?? 0 > 0 {
  621. params["materialMD5"] = (contentMD5(path: documensDirectory + (materialData?.locationPath ?? ""), data: nil) ?? "")
  622. }
  623. BFLog(message: "素材上报扩展字段 = \(params),isDownload = \(isDownload)")
  624. return params
  625. }
  626. }