PQBaseViewModel.swift 31 KB

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