PQBaseViewModel.swift 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647
  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. }
  365. // MARK: - 草稿箱相关
  366. /// 草稿箱相关
  367. extension PQBaseViewModel {
  368. /// 保存草稿-进入创作工具调用
  369. /// - Parameters:
  370. /// - draftboxId: 草稿ID
  371. /// - title: 草稿标题
  372. /// - coverUrl: 封面url
  373. /// - sdata: 结构化数据
  374. /// - videoFromScene:上传场景 1:普通上传 2:创作工具,3:普通上传转创作工具,4:后台转换加工,5:卡点视频制作
  375. /// - copyType:卡点视频制作再创作传 - 传3
  376. /// - originProjectId:卡点视频制作再创作传-源项目ID从那个项目做同款
  377. /// - completeHander: <#completeHander description#>
  378. /// - Returns: <#description#>
  379. 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) {
  380. var parames: [String: Any] = ["sdata": sdata, "fromScene": videoFromScene.rawValue]
  381. if draftboxId != nil {
  382. parames["draftboxId"] = draftboxId
  383. }
  384. if copyType != nil && videoFromScene == .stuckPoint{
  385. parames["copyType"] = 3
  386. }
  387. if originProjectId != nil && videoFromScene == .stuckPoint{
  388. parames["originProjectId"] = originProjectId
  389. }
  390. if title != nil {
  391. parames["title"] = title
  392. }
  393. if coverUrl != nil {
  394. parames["coverUrl"] = coverUrl
  395. }
  396. BFLog(message: "保存草稿参数为:\(parames) \n\n sdata is:\n \(sdata) \n")
  397. /* 返回数据格式
  398. "coverUrl": "string",
  399. "dataVersionCode": 0,
  400. "draftboxId": "string",
  401. "duration": 0,
  402. "projectId": "string",
  403. "title": "string",
  404. "updateTimestamp": 0
  405. */
  406. SWNetRequest.postRequestData(url: PQENVUtil.shared.clipapiapi + saveDraftboxUrl, parames: parames) { response, _, error, _ in
  407. if error != nil {
  408. completeHander(nil, error?.msg)
  409. return
  410. }
  411. BFLog(message: "保存草稿返回数据 :\(String(describing: response)))")
  412. completeHander(response as? [String: Any], nil)
  413. }
  414. }
  415. /// 保存项目-合成的视频上传完成后发布视频send之前调用
  416. /// - Parameters:
  417. /// - projectId: <#projectId description#>
  418. /// - ossObjectKey: <#ossObjectKey description#>
  419. /// - draftboxId: <#draftboxId description#>
  420. /// - videoId: <#videoId description#>
  421. /// - sdata: <#sdata description#>
  422. /// - videoFromScene:上传场景 1:普通上传 2:创作工具,3:普通上传转创作工具,4:后台转换加工,5:卡点视频制作
  423. /// - completeHander: <#completeHander description#>
  424. /// - Returns: <#description#>
  425. public class func saveProject(draftboxId: String?, sdata: String, videoFromScene: videoFromScene, completeHander: @escaping (_ projectId: String?, _ msg: String?) -> Void) {
  426. var parames: [String: Any] = ["sdata": sdata,"fromScene": videoFromScene.rawValue]
  427. if draftboxId != nil {
  428. parames["draftboxId"] = draftboxId
  429. }
  430. SWNetRequest.postRequestData(url: PQENVUtil.shared.clipapiapi + saveProjectUrl, parames: parames) { response, _, error, _ in
  431. if error != nil {
  432. completeHander(nil, error?.msg)
  433. return
  434. }
  435. BFLog(message: "生成的项目id :\(String(describing: response))")
  436. completeHander(response as? String, nil)
  437. }
  438. }
  439. /// 更新项目
  440. /// - Parameter projectId: 项目 ID
  441. /// - Parameter produceStatus: 合成状态 必传-合成状态(5:合成成功,99:合成失败)
  442. /// - Parameter completeHander: 回调
  443. public class func updateProject(projectId: String?, produceStatus: String, completeHander: @escaping (_ projectId: String?, _ msg: String?) -> Void) {
  444. var parames: [String: String] = ["produceStatus": produceStatus]
  445. if projectId != nil {
  446. parames["projectId"] = projectId
  447. }
  448. SWNetRequest.postRequestData(url: PQENVUtil.shared.clipapiapi + updateProjectUrl, parames: parames) { response, _, error, _ in
  449. if error != nil {
  450. completeHander(nil, error?.msg)
  451. return
  452. }
  453. BFLog(message: "生成的项目id :\(String(describing: response))")
  454. completeHander(response as? String, nil)
  455. }
  456. }
  457. /// 发布视频后上报
  458. /// - Parameters:
  459. /// - projectId: 项目ID
  460. /// - videoId: 视频ID
  461. /// - videoFromScene:上传场景 1:普通上传 2:创作工具,3:普通上传转创作工具,4:后台转换加工,5:卡点视频制作
  462. /// - completeHander: <#completeHander description#>
  463. /// - Returns: <#description#>
  464. public class func reportSendVideo(_ projectId: String, _ videoId: String, videoFromScene: videoFromScene, completeHander: @escaping (_ isSeccess: Bool, _ msg: String?) -> Void) {
  465. SWNetRequest.postRequestData(url: PQENVUtil.shared.clipapiapi + reportSendVideoUrl, parames: ["projectId": projectId, "videoId": videoId, "fromScene": videoFromScene.rawValue]) { _, _, error, _ in
  466. BFLog(message: "发布视频后上报:projectId = \(projectId),videoId = \(videoId)")
  467. if error != nil {
  468. completeHander(false, error?.msg)
  469. return
  470. }
  471. completeHander(true, nil)
  472. }
  473. }
  474. /// 获取用户项目草稿箱数据
  475. /// - Parameters:
  476. /// - lastTimestamp: 最后一条时间戳
  477. /// - pageSize: 每页大小
  478. /// - isSelected: 是否已选
  479. /// - completeHander: <#completeHander description#>
  480. public class func listUserDraftbox(lastTimestamp: Int, pageSize: Int = 10, isSelected: Bool = false, completeHander: @escaping (_ projectList: [PQEditProjectModel]?, _ msg: String?) -> Void) {
  481. let params: [String: Any] = ["pageSize": pageSize, "lastTimestamp": lastTimestamp]
  482. SWNetRequest.postRequestData(url: PQENVUtil.shared.clipapiapi + listUserDraftboxUrl, parames: params) { response, _, error, _ in
  483. if error?.code == -1009 || error?.code == -1001 {
  484. cShowHUB(superView: nil, msg: "网络不可用")
  485. }
  486. if response is NSNull || response == nil {
  487. completeHander(nil, error?.msg)
  488. return
  489. }
  490. var projectList = Array<PQEditProjectModel>.init()
  491. let tempList = (response as? [[String: Any]])
  492. if tempList != nil, (tempList?.count ?? 0) > 0 {
  493. let draftDB: Realm = PQSingletoRealmUtil.shared.getDraftDB(uid: BFLoginUserInfo.shared.uid)
  494. for item in tempList! {
  495. let tempModel: PQEditProjectModel? = Mapper<PQEditProjectModel>().map(JSON: item)
  496. tempModel?.isSelected = isSelected
  497. if tempModel != nil {
  498. let localData = PQSingletoRealmUtil.shared.reamlQueryObjects(realm: draftDB, PQEditProjectModel.self, filter: "draftboxId == '\(tempModel?.draftboxId ?? "")'")
  499. if localData != nil, (localData?.count ?? 0) > 0 {
  500. tempModel?.cacheDataVersionCode = (localData?.first as? PQEditProjectModel)?.dataVersionCode ?? 0
  501. }
  502. projectList.append(tempModel!)
  503. }
  504. }
  505. }
  506. completeHander(projectList, "请求成功")
  507. }
  508. }
  509. /// 获取草稿箱数量
  510. /// - Parameter completeHander: <#completeHander description#>
  511. /// - Returns: <#description#>
  512. public class func draftboxUserCount(completeHander: @escaping (_ draftboxCount: Int, _ msg: String?) -> Void) {
  513. SWNetRequest.postRequestData(url: PQENVUtil.shared.clipapiapi + draftboxUserCountUrl, parames: nil) { response, _, error, _ in
  514. if response is NSNull || response == nil {
  515. completeHander(0, error?.msg)
  516. return
  517. }
  518. completeHander((response as? Int) ?? 0, nil)
  519. }
  520. }
  521. /// 删除草稿箱
  522. /// - Parameters:
  523. /// - isBatch: 是否批量删除(多个用英文逗号分隔)
  524. /// - draftboxIds: 草稿id
  525. /// - completeHander: <#completeHander description#>
  526. public class func deleteDraftbox(isBatch: Bool = false, draftboxIds: String?, completeHander: @escaping (_ isSuccess: Bool, _ msg: String?) -> Void) {
  527. var url: String = PQENVUtil.shared.clipapiapi
  528. var params: [String: Any] = Dictionary<String, Any>.init()
  529. if isBatch {
  530. url = url + deleteMultiDraftboxUrl
  531. params["draftboxIds"] = draftboxIds ?? ""
  532. } else {
  533. url = url + deleteDraftboxUrl
  534. params["draftboxId"] = draftboxIds ?? ""
  535. }
  536. SWNetRequest.postRequestData(url: url, parames: params) { _, _, error, _ in
  537. completeHander(error == nil, error?.msg)
  538. }
  539. }
  540. /// 复制草稿箱
  541. /// - Parameters:
  542. /// - draftboxId: 草稿箱id
  543. /// - title: 草稿箱标题
  544. /// - copyType: 复制类型(1:复制自己的项目,2:创建副本(复制别人的项目) 3:再创作)
  545. /// - completeHander: <#completeHander description#>
  546. public class func copyDraftbox(draftboxId: String?, title: String, copyType: Int, completeHander: @escaping (_ newDraftboxId: String?, _ msg: String?) -> Void) {
  547. SWNetRequest.postRequestData(url: PQENVUtil.shared.clipapiapi + copyDraftboxUrl, parames: ["draftboxId": draftboxId ?? "", "title": title, "copyType": copyType]) { response, _, error, _ in
  548. if response is NSNull || response == nil {
  549. completeHander(nil, error?.msg)
  550. return
  551. }
  552. completeHander(response as? String, nil)
  553. }
  554. }
  555. /// 更新草稿名称
  556. /// - Parameters:
  557. /// - draftboxId: 草稿id
  558. /// - title: 标题
  559. /// - completeHander: <#completeHander description#>
  560. public class func updateDraftBoxTitle(draftboxId: String?, title: String, completeHander: @escaping (_ newDraftData: PQEditProjectModel?, _ msg: String?) -> Void) {
  561. SWNetRequest.postRequestData(url: PQENVUtil.shared.clipapiapi + updateDraftboxTitleUrl, parames: ["draftboxId": draftboxId ?? "", "title": title]) { response, _, error, _ in
  562. if response is NSNull || response == nil {
  563. completeHander(nil, error?.msg)
  564. return
  565. }
  566. completeHander(Mapper<PQEditProjectModel>().map(JSON: response as! [String: Any]), nil)
  567. }
  568. }
  569. /// 获取草稿箱结构化数据
  570. /// - Parameters:
  571. /// - : <# description#>
  572. /// - completeHander: <#completeHander description#>
  573. public class func draftboxGetSdata(draftboxId: String?, completeHander: @escaping (_ projectModel: PQEditSdataModel?, _ msg: String?) -> Void) {
  574. let params: [String: Any] = ["draftboxId": draftboxId ?? ""]
  575. SWNetRequest.postRequestData(url: PQENVUtil.shared.clipapiapi + draftboxGetSdataUrl, parames: params) { response, _, error, _ in
  576. if response is NSNull || response == nil {
  577. completeHander(nil, error?.msg)
  578. return
  579. }
  580. BFLog(message: "draftboxGetSdata response is \(String(describing: response))")
  581. let oneProjectModel = Mapper<PQEditSdataModel>().map(JSONString: response as! String)
  582. completeHander(oneProjectModel, "请求成功")
  583. }
  584. }
  585. /// 素材上报扩展字段
  586. /// - Parameter materialData: <#materialData description#>
  587. /// - Returns: <#description#>
  588. public class func uploadReportExParams(isDownload: Bool, materialData: PQEditVisionTrackMaterialsModel?) -> [String: Any] {
  589. var params: [String: Any] = ["draftboxId": PQSingletoMemoryUtil.shared.draftboxId ?? "", "materialType": materialData?.type ?? ""]
  590. if !isDownload {
  591. params["materialSource"] = (materialData?.localSearchId != nil && (materialData?.localSearchId ?? "").count > 0) ? "netMaterial" : "localMaterial"
  592. }
  593. if materialData?.id != nil, (materialData?.id ?? 0) > 0 {
  594. params["materialId"] = materialData?.id ?? 0
  595. }
  596. if materialData?.materialUrl != nil, (materialData?.materialUrl.count ?? 0) > 0 {
  597. params["materialUrl"] = materialData?.materialUrl ?? ""
  598. }
  599. if materialData?.locationPath != nil, materialData?.locationPath.count ?? 0 > 0 {
  600. params["materialMD5"] = (contentMD5(path: documensDirectory + (materialData?.locationPath ?? ""), data: nil) ?? "")
  601. }
  602. BFLog(message: "素材上报扩展字段 = \(params),isDownload = \(isDownload)")
  603. return params
  604. }
  605. }