PQVideoListModel.swift 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466
  1. //
  2. // PQRecommVideoModel.swift
  3. // PQSpeed
  4. //
  5. // Created by SanW on 2020/5/26.
  6. // Copyright © 2020 BytesFlow. All rights reserved.
  7. //
  8. import BFCommonKit
  9. import UIKit
  10. public protocol BFVideoItemProtocol {
  11. dynamic var uniqueId: String? { get set } // 唯一ID
  12. dynamic var videoId: Int { get set } // 视频ID
  13. dynamic var id: UInt64 { get set } // 视频ID
  14. dynamic var eventId: String? { get set } // 事件ID
  15. dynamic var title: String? { get set } // 标题
  16. dynamic var attributedTitle: NSMutableAttributedString? { get set } // 富文本标题
  17. dynamic var summary: String? { get set } // 描述
  18. dynamic var imageUrl: String { get set } // 图片地址
  19. dynamic var selectedImage: String { get set } // 图片地址
  20. dynamic var isSelected: Bool { get set }
  21. dynamic var recommendLogVO: String? { get set } // 推荐日志对象
  22. dynamic var abInfoData: String? { get set } // AB
  23. dynamic var pageCategoryId: Int { get set } // 页面分类ID
  24. dynamic var version: String { get set } // 版本号
  25. dynamic var mid: String { get set } // 设备ID
  26. dynamic var date: Int { get set } // 当前时间戳 Float64(Date.init().timeIntervalSince1970) * 1000
  27. var headVideoId: String? { get set } // 当前的相关推荐视频是属于哪个视频的相关推荐,值为那个头部视频的videoId
  28. var auditStatus: Int { get set } // 审核状态 1 审核中,2 不通过 3 待修改,4 自己可见 5 通过 ,
  29. var barrageCount: Int { get set } // 弹幕数量
  30. var barrageSwitch: Int { get set } // 是否打开弹幕 1打开 -1关闭 ,
  31. var auditReason: String? { get set } // 审核不通过或者待修改的原因
  32. var barrage: Any? { get set } // 弹幕集合
  33. var chargeDetail: [String: Any]? { get set } // 收费的相关信息
  34. var commentCount: Int { get set } // 评论数量
  35. var coverImg: [String: Any]? { get set } // 封面对象 ,
  36. var cutVoStr: String? { get set } // h5剪切板内容 ,
  37. var descr: String? { get set } // 视频简介 ,
  38. var encryption: Int { get set } // 是否加密视频:0是1不是 ,
  39. var favorited: Bool { get set } // 是否收藏 ,
  40. var favoriteds: Int { get set } // 收藏数 ,
  41. var fileExtensions: String? { get set } // 视频后缀 ,
  42. var firstPicture: Bool { get set } // 封面是否是第一帧,false不是true是 ,
  43. var gmtCreate: String? { get set } // 创建时间 ,
  44. var gmtCreateDescr: String? { get set } // 发视频时间描述 ,
  45. var gmtCreateTimestamp: Int { get set } // 创建时间戳 ,
  46. var gmtModifie: String? { get set } // 修改时间 ,
  47. var gmtModifiedTimestamp: Int { get set } // 修改时间戳 ,
  48. var h5ShareImgPath: String? { get set } // h5分享图URL ,
  49. var hasShareSpaceData: Bool { get set } // 是否有分享空间数据,
  50. var isRecommendShare: Int { get set } // 是否有分发推荐的封面和标题 1 有 0 无 传空或者不传默认为0,
  51. var lastTimestamp: Int { get set } // 时间戳 ,
  52. // liteVideoData (LiteVideoDataVO, optional): lite数据,
  53. var measure: Int { get set }
  54. var measureId: Int { get set }
  55. var measureType: Int { get set } // 0 非流量池 1曝光池2普通推荐测试池3待推荐测试池 ,
  56. var playBeforeDay: Int { get set } // 播放时间距离今天的天数 ,
  57. var playCount: Int { get set } // 播放次数 ,
  58. var playCountFormatStr: String? { get set } // 用户视频总播放数,格式化后的值,前端直接显示 ,
  59. var playCountTotal: Int { get set } // 总播放次数 ,
  60. var playTime: Int { get set } // 播放时间 ,
  61. var processShareHeadLab: [String: Any]? { get set } // 视频分享片尾数据 ,
  62. var processShareTailLab: [String: Any]? { get set } // 视频分享片尾数据 ,
  63. var pwd: String? { get set } // 视频密码 ,
  64. var recommendId: String? { get set } // 推荐链路ID ,
  65. var recommendSource: Int { get set } // 0 默认 1 第四范式
  66. var recommendStatus: Int { get set } // 推荐状态 ,
  67. var rotate: Int { get set } // 旋转角度 ,
  68. var sampleJobId: String? { get set }
  69. var sampleRequestId: String? { get set }
  70. var sampleTotalTime: Int { get set }
  71. var sampleTranscodeStatus: Int { get set }
  72. var sampleTransedVideoPath: String? { get set }
  73. var sendBeforeDay: Int { get set } // 发视频距离今天的天数 ,
  74. var sensitiveMsg: String? { get set } // 敏感提示信息 ,
  75. var sensitiveStatus: Int { get set } // 内容敏感状态(0:未检验,1:不敏感,2:敏感,3:敏感已审) ,
  76. var shareCount: Int { get set } // 分享到朋友圈次数 ,
  77. var shareId: String? { get set } // 分享的 ID
  78. var shareCountFriend: Int { get set } // 分享到微信好友 ,
  79. var shareImgPath: String? { get set } // 分享图URL ,
  80. var shareLinkType: Int { get set } // 分享到微信好友的图片的链接的类型 ,
  81. var sharePageType: Int { get set } // 0 综合模块 1 feed流 ,
  82. var shareTitle: String? { get set } // 分享到微信好友的图片的title ,
  83. var showHotRecommend: Bool { get set } // 是否需要显示热门推荐 ,
  84. var size: Int { get set } // 大小 ,
  85. var status: Int { get set } // 数据状态,1 有效,2 已删除,3 已屏蔽,4 关注可见,5 分享可见 6 自己可见 ,
  86. var tabShareImgPath: String? { get set } // 转发分享图URL ,
  87. var thumbnailImagePath: String? { get set } // 缩略图URL ,
  88. var totalTime: Int { get set } // 视频时长 ,
  89. var totalTimeParas: String? { get set } // 视频时长十分秒 ,
  90. var transcodeStatus: Int { get set } // 转码状态:1-不需转码 2-转码中 3-转码完成 4-转码失败 ,
  91. var transcodeVOList: [Any]? { get set } // 多码率数据 ,
  92. var uid: Int { get set } // 视频的用户ID ,
  93. var user: [String: Any]? { get set } // 用户对象 ,
  94. var videoCollectionId: Int { get set } // 视频所在的视频集ID ,
  95. var videoCoverSnapshotPath: String? { get set } // 原始封面图片 ,
  96. var videoPath: String? { get set } // 视频地址 ,
  97. var videoReportMeta: String? { get set } // 视频上报数据,上报时原样返回 ,
  98. var videoShareJumpModel: [String: Any]? { get set } // 分享页跳转的信息 ,
  99. var playProgress: Float64 { get set } // 已播放时长
  100. var duration: Float64 { get set } // 视频总时长
  101. var tab_pageType: TAB_PAGETYPE { get set } // 0-推荐 1-关注
  102. var pageSource: PAGESOURCE { get set }
  103. var isVerticality: Bool { get set }
  104. var isShareList: Bool { get set } // 是否是分享列表
  105. var uplpadBucketKey: String? { get set } // 上传视频地址
  106. var uplpadStatus: Int { get set } // 上传视频状态 1-上传中 2-上传完成 3-上传失败 4-发布中 4-发布完成
  107. var uplpadRequest: OSSMultipartUploadRequest? { get set }
  108. var stsToken: [String: Any]? { get set } // 上传信息
  109. var localPath: String? { get set } // 地址
  110. var progress: Float { get set }
  111. var projectId: String? { get set } // 项目ID-发布创作的视频时必传,会在进入创作工具页时生成,以app_no_projectdata为前缀
  112. var autoType: autoType? { get set } // autoType 自动动作的类型
  113. // 发布视频来源类型
  114. var videoFromScene: videoFromScene { get set }
  115. }
  116. open class PQVideoListModel: PQBaseModel, BFVideoItemProtocol {
  117. @objc public required init() {
  118. super.init()
  119. }
  120. public var id: UInt64 = 0
  121. public var headVideoId: String? // 当前的相关推荐视频是属于哪个视频的相关推荐,值为那个头部视频的videoId
  122. public var auditStatus: Int = 0 // 审核状态 1 审核中,2 不通过 3 待修改,4 自己可见 5 通过 ,
  123. public var barrageCount: Int = 0 // 弹幕数量
  124. public var barrageSwitch: Int = 0 // 是否打开弹幕 1打开 -1关闭 ,
  125. public var auditReason: String? // 审核不通过或者待修改的原因
  126. public var barrage: Any? // 弹幕集合
  127. public var chargeDetail: [String: Any]? // 收费的相关信息
  128. public var commentCount: Int = 0 // 评论数量
  129. public var coverImg: [String: Any]? // 封面对象 ,
  130. public var cutVoStr: String? // h5剪切板内容 ,
  131. public var descr: String? // 视频简介 ,
  132. public var encryption: Int = 0 // 是否加密视频:0是1不是 ,
  133. public var favorited: Bool = false // 是否收藏 ,
  134. public var favoriteds: Int = 0 // 收藏数 ,
  135. public var fileExtensions: String? // 视频后缀 ,
  136. public var firstPicture: Bool = false // 封面是否是第一帧,false不是true是 ,
  137. public var gmtCreate: String? // 创建时间 ,
  138. public var gmtCreateDescr: String? // 发视频时间描述 ,
  139. public var gmtCreateTimestamp: Int = 0 // 创建时间戳 ,
  140. public var gmtModifie: String? // 修改时间 ,
  141. public var gmtModifiedTimestamp: Int = 0 // 修改时间戳 ,
  142. public var h5ShareImgPath: String? // h5分享图URL ,
  143. public var hasShareSpaceData: Bool = false // 是否有分享空间数据,
  144. public var height: CGFloat = 0 // 视频高 ,
  145. public var isRecommendShare: Int = 0 // 是否有分发推荐的封面和标题 1 有 0 无 传空或者不传默认为0,
  146. public var lastTimestamp: Int = 0 // 时间戳 ,
  147. // liteVideoData (LiteVideoDataVO, optional): lite数据,
  148. public var measure: Int = 0
  149. public var measureId: Int = 0
  150. public var measureType: Int = 0 // 0 非流量池 1曝光池2普通推荐测试池3待推荐测试池 ,
  151. public var playBeforeDay: Int = 0 // 播放时间距离今天的天数 ,
  152. public var playCount: Int = 0 // 播放次数 ,
  153. public var playCountFormatStr: String? // 用户视频总播放数,格式化后的值,前端直接显示 ,
  154. public var playCountTotal: Int = 0 // 总播放次数 ,
  155. public var playTime: Int = 0 // 播放时间 ,
  156. public var processShareHeadLab: [String: Any]? // 视频分享片尾数据 ,
  157. public var processShareTailLab: [String: Any]? // 视频分享片尾数据 ,
  158. public var pwd: String? // 视频密码 ,
  159. public var recommendId: String? // 推荐链路ID ,
  160. public var recommendSource: Int = 0 // 0 默认 1 第四范式
  161. public var recommendStatus: Int = 0 // 推荐状态 ,
  162. public var rotate: Int = 0 // 旋转角度 ,
  163. public var sampleJobId: String?
  164. public var sampleRequestId: String?
  165. public var sampleTotalTime: Int = 0
  166. public var sampleTranscodeStatus: Int = 0
  167. public var sampleTransedVideoPath: String?
  168. public var sendBeforeDay: Int = 0 // 发视频距离今天的天数 ,
  169. public var sensitiveMsg: String? // 敏感提示信息 ,
  170. public var sensitiveStatus: Int = 0 // 内容敏感状态(0:未检验,1:不敏感,2:敏感,3:敏感已审) ,
  171. public var shareCount: Int = 0 // 分享到朋友圈次数 ,
  172. // add by ak 个人中心里我分享的视频列表返回的参数 e.g. 78C10B44-6892-42A8-AE69-F1B35F9E676F-534530
  173. public var shareId: String? // 分享的 ID
  174. public var shareCountFriend: Int = 0 // 分享到微信好友 ,
  175. public var shareImgPath: String? // 分享图URL ,
  176. public var shareLinkType: Int = 0 // 分享到微信好友的图片的链接的类型 ,
  177. public var sharePageType: Int = 0 // 0 综合模块 1 feed流 ,
  178. public var shareTitle: String? // 分享到微信好友的图片的title ,
  179. public var showHotRecommend: Bool = false // 是否需要显示热门推荐 ,
  180. public var size: Int = 0 // 大小 ,
  181. public var status: Int = 0 // 数据状态,1 有效,2 已删除,3 已屏蔽,4 关注可见,5 分享可见 6 自己可见 ,
  182. public var tabShareImgPath: String? // 转发分享图URL ,
  183. public var thumbnailImagePath: String? // 缩略图URL ,
  184. public var totalTime: Int = 0 // 视频时长 ,
  185. public var totalTimeParas: String? // 视频时长十分秒 ,
  186. public var transcodeStatus: Int = 0 // 转码状态:1-不需转码 2-转码中 3-转码完成 4-转码失败 ,
  187. public var transcodeVOList: [Any]? // 多码率数据 ,
  188. public var uid: Int = 0 // 视频的用户ID ,
  189. public var user: [String: Any]? // 用户对象 ,
  190. public var userInfo: PQUserInfoModel? // 用户对象 ,
  191. public var videoCollectionId: Int = 0 // 视频所在的视频集ID ,
  192. public var videoCoverSnapshotPath: String? // 原始封面图片 ,
  193. public var videoPath: String? // 视频地址 ,
  194. public var videoURL: String? // 视频地址 ,
  195. public var videoReportMeta: String? // 视频上报数据,上报时原样返回 ,
  196. public var videoShareJumpModel: [String: Any]? // 分享页跳转的信息 ,
  197. public var width: CGFloat = 0 // 视频宽
  198. public var itemHeight: CGFloat = 0 // 个人中心cell高
  199. public var originImageH: CGFloat = 0 // 原始图片的宽
  200. public var originImageW: CGFloat = 0 // 原始图片的高
  201. public var imageH: CGFloat = 0 // 图片的高
  202. public var imageW: CGFloat = 0 // 图片的宽
  203. public var titleH: CGFloat = 0 // 标题的高
  204. public var descH: CGFloat = 0 // 描述的高
  205. public var titleFontSize: CGFloat = 0 // add by ak 标题字号
  206. public var usnameW: CGFloat = 0 // add by ak 用户名宽度
  207. public var rotationH: CGFloat = 0 // add by ak 三个推荐视频高度包括标题
  208. public var watchInfoH: CGFloat = 0 // add by ak watch info 高度
  209. public var watchInfoY: CGFloat = 0 // add by ak watch info Y 值
  210. public var relationData: [PQVideoListModel]?
  211. public var playProgress: Float64 = 0 // 已播放时长
  212. public var duration: Float64 = 0 // 视频总时长
  213. public var tab_pageType: TAB_PAGETYPE = .TAB_PAGETYPE_NORMAL // 0-推荐 1-关注
  214. public var pageSource: PAGESOURCE = .sp_category
  215. public var isVerticality: Bool = false
  216. public var isShareList: Bool = false // 是否是分享列表
  217. public var funcH: CGFloat = cDefaultMargin * 33
  218. public var funcW: CGFloat = cDefaultMargin * 5
  219. public var uplpadImage: UIImage? // 上传的图片封面
  220. public var uplpadBucketKey: String? // 上传视频地址
  221. public var uplpadStatus: Int = 0 // 上传视频状态 1-上传中 2-上传完成 3-上传失败 4-发布中 4-发布完成
  222. public var uplpadRequest: OSSMultipartUploadRequest?
  223. public var stsToken: [String: Any]? // 上传信息
  224. public var localPath: String? // 地址
  225. public var progress: Float = 0
  226. public var projectId: String? // 项目ID-发布创作的视频时必传,会在进入创作工具页时生成,以app_no_projectdata为前缀
  227. public var reCreateVideoData: PQReCreateModel? // 再创作数据
  228. // 视频创作埋点数据
  229. public var eventTrackData: PQVideoMakeEventTrackModel?
  230. public var autoType: autoType? // autoType 自动动作的类型
  231. // add by ak 发布视频来源类型
  232. public var videoFromScene: videoFromScene = .UploadNormal
  233. // 视频分类
  234. public var categoryName: String = ""
  235. // 视频分类图
  236. public var categoryImage: String?
  237. public var topicInfo: Dictionary<String,Any>?
  238. override public init(jsonDict: [String: Any]) {
  239. super.init(jsonDict: jsonDict)
  240. if jsonDict.keys.contains("videoPath") {
  241. videoPath = "\(jsonDict["videoPath"] ?? "")"
  242. videoURL = videoPath
  243. if videoPath?.contains(".m3u8") ?? false {
  244. videoURL = videoPath?.components(separatedBy: "?").first
  245. }
  246. }
  247. if jsonDict.keys.contains("videoCoverSnapshotPath") {
  248. videoCoverSnapshotPath = "\(jsonDict["videoCoverSnapshotPath"] ?? "")"
  249. if (videoCoverSnapshotPath?.count ?? 0) > 0, !(videoCoverSnapshotPath?.contains("http") ?? false) {
  250. videoCoverSnapshotPath = "https://rescdn.yishihui.com/" + videoCoverSnapshotPath!
  251. }
  252. }
  253. if jsonDict.keys.contains("thumbnailImagePath") {
  254. thumbnailImagePath = "\(jsonDict["thumbnailImagePath"] ?? "")"
  255. }
  256. if jsonDict.keys.contains("rotate") {
  257. rotate = Int("\(jsonDict["rotate"] ?? "0")") ?? 0
  258. }
  259. if jsonDict.keys.contains("descr") {
  260. descr = "\(jsonDict["descr"] ?? "")"
  261. if descr != nil, (descr?.count ?? 0) > 2, descr?.hasSuffix("\n") ?? false {
  262. descr = String(descr?.prefix((descr?.count ?? 2) - 2) ?? "")
  263. }
  264. }
  265. if jsonDict.keys.contains("favorited") {
  266. favorited = jsonDict["favorited"] as! Bool
  267. }
  268. if jsonDict.keys.contains("firstPicture") {
  269. firstPicture = jsonDict["firstPicture"] as! Bool
  270. }
  271. if jsonDict.keys.contains("shareImgPath") {
  272. shareImgPath = "\(jsonDict["shareImgPath"] ?? "")"
  273. }
  274. if jsonDict.keys.contains("coverImg") {
  275. coverImg = jsonDict["coverImg"] as? [String: Any]
  276. }
  277. if jsonDict.keys.contains("user") {
  278. user = jsonDict["user"] as? [String: Any]
  279. userInfo = PQUserInfoModel(jsonDict: user!)
  280. }
  281. if jsonDict.keys.contains("shareCountFriend") {
  282. shareCountFriend = Int("\(jsonDict["shareCountFriend"] ?? "0")") ?? 0
  283. }
  284. if jsonDict.keys.contains("shareId") {
  285. shareId = "\(jsonDict["shareId"] ?? "")"
  286. }
  287. if jsonDict.keys.contains("shareCount") {
  288. shareCount = Int("\(jsonDict["shareCount"] ?? "0")") ?? 0
  289. }
  290. if jsonDict.keys.contains("favoriteds") {
  291. favoriteds = Int("\(jsonDict["favoriteds"] ?? "0")") ?? 0
  292. }
  293. if jsonDict.keys.contains("uid") {
  294. uid = Int("\(jsonDict["uid"] ?? "0")") ?? 0
  295. }
  296. if jsonDict.keys.contains("lastTimestamp") {
  297. lastTimestamp = Int("\(jsonDict["lastTimestamp"] ?? "0")") ?? 0
  298. }
  299. if jsonDict.keys.contains("auditStatus") {
  300. auditStatus = Int("\(jsonDict["auditStatus"] ?? "0")") ?? 0
  301. }
  302. if jsonDict.keys.contains("status") {
  303. status = Int("\(jsonDict["status"] ?? "0")") ?? 0
  304. }
  305. if jsonDict.keys.contains("auditReason") {
  306. auditReason = "\(jsonDict["auditReason"] ?? "")"
  307. }
  308. if jsonDict.keys.contains("transcodeStatus") {
  309. transcodeStatus = Int("\(jsonDict["transcodeStatus"] ?? "0")") ?? 0
  310. }
  311. if jsonDict.keys.contains("playCountTotal") {
  312. playCountTotal = Int("\(jsonDict["playCountTotal"] ?? "0")") ?? 0
  313. }
  314. if jsonDict.keys.contains("measure") {
  315. measure = Int("\(jsonDict["measure"] ?? "0")") ?? 0
  316. }
  317. if jsonDict.keys.contains("measureId") {
  318. measureId = Int("\(jsonDict["measureId"] ?? "0")") ?? 0
  319. }
  320. if jsonDict.keys.contains("measureType") {
  321. measureType = Int("\(jsonDict["measureType"] ?? "0")") ?? 0
  322. }
  323. if jsonDict.keys.contains("playCountFormatStr") {
  324. playCountFormatStr = "\(jsonDict["playCountFormatStr"] ?? "")"
  325. }
  326. if jsonDict.keys.contains("recommendId") {
  327. recommendId = "\(jsonDict["recommendId"] ?? "")"
  328. }
  329. if jsonDict.keys.contains("abInfoData") {
  330. abInfoData = "\(jsonDict["abInfoData"] ?? "")"
  331. }
  332. if jsonDict.keys.contains("totalTime") {
  333. totalTime = Int("\(jsonDict["totalTime"] ?? "0")") ?? 0
  334. totalTimeParas = Float64(totalTime).formatDurationToHMS()
  335. }
  336. if jsonDict.keys.contains("width") {
  337. width = CGFloat(Int("\(jsonDict["width"] ?? 0)") ?? 0)
  338. if rotate > 0 {
  339. originImageH = CGFloat(Int("\(jsonDict["width"] ?? 0)") ?? 0)
  340. } else {
  341. originImageW = CGFloat(Int("\(jsonDict["width"] ?? 0)") ?? 0)
  342. }
  343. }
  344. if jsonDict.keys.contains("height") {
  345. height = CGFloat(Int("\(jsonDict["height"] ?? 0)") ?? 0)
  346. if rotate > 0 {
  347. originImageW = CGFloat(Int("\(jsonDict["height"] ?? 0)") ?? 0)
  348. } else {
  349. originImageH = CGFloat(Int("\(jsonDict["height"] ?? 0)") ?? 0)
  350. }
  351. }
  352. if jsonDict.keys.contains("produceProjectDataV2"), ((jsonDict["produceProjectDataV2"] as? [String: Any])?.keys.count ?? 0) > 0 {
  353. reCreateVideoData = PQReCreateModel(jsonDict: jsonDict["produceProjectDataV2"] as! [String: Any])
  354. if reCreateVideoData?.canReproduce == 1 {
  355. funcH = funcH + cDefaultMargin * 7
  356. }
  357. reCreateVideoData?.videoId = uniqueId
  358. }
  359. if coverImg != nil, coverImg?.count ?? 0 > 0 {
  360. imageW = cScreenWidth
  361. imageH = imageW * originImageH / originImageW
  362. isVerticality = originImageH > originImageW
  363. if imageH > cScreenHeigth {
  364. imageH = cScreenHeigth
  365. imageW = imageH * originImageW / originImageH
  366. }
  367. }
  368. // 计算个人中心高度
  369. var tempTitleH: CGFloat = -cDefaultMargin
  370. if title != nil, (title?.count ?? 0) > 0 {
  371. tempTitleH = sizeWithText(text: title ?? "", font: UIFont.systemFont(ofSize: 16), size: CGSize(width: (cScreenWidth - cDefaultMargin * 3) / 2, height: cDefaultMargin * 4)).height
  372. }
  373. itemHeight = (cScreenWidth - cDefaultMargin * 3) / 2 * originImageH / originImageW + tempTitleH + cDefaultMargin * 4.5
  374. if title != nil, (title?.count ?? 0) > 0 {
  375. titleH = sizeWithText(text: title ?? "", font: UIFont.systemFont(ofSize: 26, weight: .medium), size: CGSize(width: cScreenWidth - cDefaultMargin * 2, height: CGFloat.greatestFiniteMagnitude)).height + cDefaultMargin
  376. }
  377. if titleH > 70 {
  378. titleH = 70
  379. titleFontSize = cScreenWidth <= 320 ? 19 : 21
  380. } else {
  381. titleFontSize = 25
  382. }
  383. BFLog(message: "title \(String(describing: title)) titleH :\(titleH) titleFontSize :\(titleFontSize)")
  384. var isFollowed: Bool = false
  385. if tab_pageType == .TAB_PAGETYPE_RECOMM {
  386. isFollowed = userInfo?.followed != 1
  387. } else {
  388. isFollowed = true
  389. }
  390. let attM: CGFloat = cDefaultMargin * 4.5
  391. usnameW = sizeWithText(text: userInfo?.nickName ?? "", font: UIFont.systemFont(ofSize: 16, weight: .medium), size: CGSize(width: !isFollowed ? (cScreenWidth - cDefaultMargin * 8) : (cScreenWidth - cDefaultMargin * 9 - attM), height: cDefaultMargin * 2)).width + cDefaultMargin * 2
  392. BFLog(message: "nickname is \(userInfo?.nickName ?? "") ' 'usnameW is \(usnameW) isFollowed is \(isFollowed)")
  393. updateReommendAgent()
  394. watchInfoY = -cDefaultMargin
  395. BFLog(message: "watchInfoY11111 is \(watchInfoY)")
  396. }
  397. public func updateReommendAgent() {
  398. // 计算相关推荐高度
  399. var itemH: CGFloat = 0
  400. var verticality: Bool = false
  401. var haveTitle: Bool = false
  402. if (relationData?.count ?? 0) > 0 {
  403. for item in (relationData)! {
  404. if item.imageH > item.imageW {
  405. verticality = true
  406. break
  407. }
  408. BFLog(message: "item.title \(String(describing: item.title))")
  409. if item.title != nil, (item.title?.count ?? 0) > 0 {
  410. haveTitle = true
  411. break
  412. }
  413. }
  414. }
  415. itemH = verticality ? 130 : (haveTitle ? 90 : 55)
  416. itemH = (relationData?.count ?? 0) > 0 ? itemH : 0
  417. BFLog(message: "itemH is: \(itemH) sss \(String(describing: relationData?.count))")
  418. rotationH = itemH
  419. // 描述部分
  420. if (relationData?.count ?? 0) > 0, tab_pageType != .TAB_PAGETYPE_ATTEN {
  421. watchInfoY = (isVerticality ? -cDefaultMargin : -(cDefaultMargin * 2 + rotationH))
  422. } else {
  423. watchInfoY = -cDefaultMargin
  424. }
  425. BFLog(message: "watchInfoY2222 is \(watchInfoY)")
  426. let nomalH: CGFloat = cDefaultMargin * 1.5
  427. // let likeH: CGFloat = favoriteds <= 0 ? 0 : nomalH
  428. let likeH: CGFloat = 0
  429. watchInfoH = cDefaultMargin * 2 + nomalH + likeH + cDefaultMargin
  430. if reCreateVideoData != nil, reCreateVideoData?.canReproduce == 1 {
  431. watchInfoH = watchInfoH + ((reCreateVideoData?.rhythmMusicFlag != 1 && (reCreateVideoData?.parentVideoId != nil)) ? cDefaultMargin * 8 : 43)
  432. }
  433. if descr != nil, !(descr?.isEmpty ?? true) {
  434. if Thread.isMainThread {
  435. descH = sizeTextFits(attributedText: NSMutableAttributedString(string: descr ?? ""), text: nil, numberOfLines: 5, font: UIFont.systemFont(ofSize: 14), maxSize: CGSize(width: cScreenWidth - funcW - cDefaultMargin * 3, height: CGFloat.greatestFiniteMagnitude)).height
  436. watchInfoH = watchInfoH + descH
  437. } else {
  438. DispatchQueue.main.async { [weak self] in
  439. self?.descH = sizeTextFits(attributedText: NSMutableAttributedString(string: (self?.descr)!), text: nil, numberOfLines: 5, font: UIFont.systemFont(ofSize: 14), maxSize: CGSize(width: cScreenWidth - (self?.funcW ?? 0) - cDefaultMargin * 3, height: CGFloat.greatestFiniteMagnitude)).height
  440. self?.watchInfoH = (self?.watchInfoH ?? 0) + (self?.descH ?? 0)
  441. }
  442. }
  443. }
  444. }
  445. }