jsonwang vor 3 Jahren
Ursprung
Commit
a509090ccb
49 geänderte Dateien mit 729 neuen und 657 gelöschten Zeilen
  1. 5 5
      BFFramework/Classes/BFModules/BFUtility/PQCreateEmptyWAV.swift
  2. 12 12
      BFFramework/Classes/BFModules/BFUtility/PQPHAssetVideoParaseUtil.swift
  3. 38 38
      BFFramework/Classes/BFModules/BFUtility/PQSingletoRealmUtil.swift
  4. 9 9
      BFFramework/Classes/BFModules/BFUtility/PQSingletoSourcesFileUtil.swift
  5. 7 7
      BFFramework/Classes/BFModules/BFUtility/PQSingletoVideoPlayer.swift
  6. 4 4
      BFFramework/Classes/BFModules/BFUtility/PQVideoSnapshotUtil.swift
  7. 7 7
      BFFramework/Classes/BFModules/BFUtility/PQWeakTimer.swift
  8. 1 1
      BFFramework/Classes/BFModules/BFUtility/SWNetRequest.swift
  9. 92 42
      BFFramework/Classes/Enums/Enums.swift
  10. 2 2
      BFFramework/Classes/EventTrack/Model/PQVideoMakeEventTrackModel.swift
  11. 79 79
      BFFramework/Classes/EventTrack/ViewModel/PQEventTrackViewModel.swift
  12. 21 22
      BFFramework/Classes/PModels/PQDownloadModel.swift
  13. 16 16
      BFFramework/Classes/PModels/PQUploadModel.swift
  14. 4 4
      BFFramework/Classes/PModels/PQUserInfoModel.swift
  15. 2 2
      BFFramework/Classes/PModels/PQVideoListModel.swift
  16. 18 0
      BFFramework/Classes/PModels/editDarftModels/PQAzureStyleModel.swift
  17. 17 17
      BFFramework/Classes/PModels/editDarftModels/PQEditAudioTrackMaterialModel.swift
  18. 9 9
      BFFramework/Classes/PModels/editDarftModels/PQEditAudioTrackModel.swift
  19. 8 8
      BFFramework/Classes/PModels/editDarftModels/PQEditBaseModel.swift
  20. 6 6
      BFFramework/Classes/PModels/editDarftModels/PQEditBgmInfoModel.swift
  21. 8 8
      BFFramework/Classes/PModels/editDarftModels/PQEditFileMergeTable.swift
  22. 7 7
      BFFramework/Classes/PModels/editDarftModels/PQEditMaterialDurationFitModel.swift
  23. 5 5
      BFFramework/Classes/PModels/editDarftModels/PQEditMaterialEffectModel.swift
  24. 3 3
      BFFramework/Classes/PModels/editDarftModels/PQEditMaterialLayerModel.swift
  25. 6 6
      BFFramework/Classes/PModels/editDarftModels/PQEditMaterialPositionModel.swift
  26. 8 8
      BFFramework/Classes/PModels/editDarftModels/PQEditMaterialSizeClipModel.swift
  27. 16 16
      BFFramework/Classes/PModels/editDarftModels/PQEditProduceVoiceConfigModel.swift
  28. 17 17
      BFFramework/Classes/PModels/editDarftModels/PQEditProjectModel.swift
  29. 13 13
      BFFramework/Classes/PModels/editDarftModels/PQEditSdataModel.swift
  30. 6 6
      BFFramework/Classes/PModels/editDarftModels/PQEditSectionExtDataModel.swift
  31. 38 38
      BFFramework/Classes/PModels/editDarftModels/PQEditSectionModel.swift
  32. 8 8
      BFFramework/Classes/PModels/editDarftModels/PQEditSectionTimelineModel.swift
  33. 8 8
      BFFramework/Classes/PModels/editDarftModels/PQEditSubTitleModel.swift
  34. 10 10
      BFFramework/Classes/PModels/editDarftModels/PQEditSubtitleInfoModel.swift
  35. 5 5
      BFFramework/Classes/PModels/editDarftModels/PQEditSystemParamModel.swift
  36. 10 10
      BFFramework/Classes/PModels/editDarftModels/PQEditVideoMetaDataModel.swift
  37. 51 51
      BFFramework/Classes/PModels/editDarftModels/PQEditVisionTrackMaterialsModel.swift
  38. 10 10
      BFFramework/Classes/PModels/editDarftModels/PQEditVisionTrackModel.swift
  39. 29 29
      BFFramework/Classes/PQGPUImage/akfilters/PQMoveInput.swift
  40. 18 18
      BFFramework/Classes/PQGPUImage/akfilters/Tools/PQCompositionExporter.swift
  41. 1 1
      BFFramework/Classes/Stuckpoint/Controller/PQStuckPointMaterialController.swift
  42. 11 11
      BFFramework/Classes/Stuckpoint/Model/PQStuckPointMusicTagsModel.swift
  43. 4 4
      BFFramework/Classes/Stuckpoint/Model/PQStuckPointTimesModel.swift
  44. 37 37
      BFFramework/Classes/Stuckpoint/Model/PQVoiceModel.swift
  45. 20 20
      BFFramework/Classes/Stuckpoint/ViewModel/PQGPUImagePlayerView.swift
  46. 13 13
      BFFramework/Classes/Stuckpoint/ViewModel/PQPlayerViewModel.swift
  47. 1 1
      BFFramework/Classes/Utils/PQConstant.swift
  48. 5 0
      BFFramework/Classes/Utils/PQRequestURLUtil.swift
  49. 4 4
      BFFramework/Classes/Utils/PQSingletoMemoryUtil.swift

+ 5 - 5
BFFramework/Classes/BFModules/BFUtility/PQCreateEmptyWAV.swift

@@ -23,7 +23,7 @@ import UIKit
 
 import AudioToolbox
 import Foundation
-class PQCreateEmptyWAV {
+public class PQCreateEmptyWAV {
     // 采样率
     private var mSampleRate: Double = 44100
 
@@ -33,7 +33,7 @@ class PQCreateEmptyWAV {
     private var mduration: Double = 5.0
     // 采样位数
     private var mbit: Double = 16
-    init(sampleRate: Double = 44100, channel: Double = 1, duration: Double, bit: Double = 16) {
+    public init(sampleRate: Double = 44100, channel: Double = 1, duration: Double, bit: Double = 16) {
         mSampleRate = sampleRate
         mChannel = channel
         mduration = duration
@@ -44,7 +44,7 @@ class PQCreateEmptyWAV {
         BFLog(message: "mSampleRate is\(mSampleRate) mChannel is \(mChannel) mduration is:\(mduration) mbit is \(mbit)")
     }
 
-    func createEmptyWAVFile(url: URL, completeHander: @escaping (_ fileURL: URL?) -> Void) {
+    public  func createEmptyWAVFile(url: URL, completeHander: @escaping (_ fileURL: URL?) -> Void) {
         DispatchQueue.global().async {
             // 数字音频文件大小(Byte) = 采样频率(Hz)× 采样时长(S)×(采样位数 / 8)× 声道数(单声道为1,立体声为2)
 //        BFLog(message: "createEmptyWAVFile 1")
@@ -70,7 +70,7 @@ class PQCreateEmptyWAV {
         }
     }
     
-    func createEmptyWAVFile(url: URL) {
+    public  func createEmptyWAVFile(url: URL) {
  
             // 数字音频文件大小(Byte) = 采样频率(Hz)× 采样时长(S)×(采样位数 / 8)× 声道数(单声道为1,立体声为2)
 //        BFLog(message: "createEmptyWAVFile 1")
@@ -94,7 +94,7 @@ class PQCreateEmptyWAV {
     }
 
 
-    func writewaveFileHeader(output: URL, totalAudioLen: Int64,
+    public  func writewaveFileHeader(output: URL, totalAudioLen: Int64,
                              totalDataLen: Int64,
                              longSampleRate: Int64,
                              channels: Int,

+ 12 - 12
BFFramework/Classes/BFModules/BFUtility/PQPHAssetVideoParaseUtil.swift

@@ -11,7 +11,7 @@ import Photos
 import UIKit
 
 var currentExportSession: AVAssetExportSession?
-class PQPHAssetVideoParaseUtil: NSObject {
+open class PQPHAssetVideoParaseUtil: NSObject {
     static var imagesOptions: PHImageRequestOptions = {
         let imagesOptions = PHImageRequestOptions()
         imagesOptions.isSynchronous = false
@@ -47,7 +47,7 @@ class PQPHAssetVideoParaseUtil: NSObject {
     ///   - asset: <#asset description#>
     ///   - resultHandler: <#resultHandler description#>
     /// - Returns: <#description#>
-    class func parasToAVPlayerItem(phAsset: PHAsset, isHighQuality: Bool = false, resultHandler: @escaping (AVPlayerItem?, Float64, [AnyHashable: Any]?) -> Void) {
+    public class func parasToAVPlayerItem(phAsset: PHAsset, isHighQuality: Bool = false, resultHandler: @escaping (AVPlayerItem?, Float64, [AnyHashable: Any]?) -> Void) {
         PHImageManager().requestPlayerItem(forVideo: phAsset, options: videoRequestOptions) { playerItem, info in
             if isHighQuality, (playerItem?.asset as? AVURLAsset)?.url.absoluteString.components(separatedBy: "/").last?.contains(".medium.") ?? false {
                 let tempVideoOptions = PHVideoRequestOptions()
@@ -76,7 +76,7 @@ class PQPHAssetVideoParaseUtil: NSObject {
     ///   - asset: <#asset description#>
     ///   - resultHandler: <#resultHandler description#>
     /// - Returns: <#description#>
-    class func parasToAVAsset(phAsset: PHAsset, isHighQuality: Bool = true, resultHandler: @escaping (AVAsset?, Int, AVAudioMix?, [AnyHashable: Any]?) -> Void) {
+    public class func parasToAVAsset(phAsset: PHAsset, isHighQuality: Bool = true, resultHandler: @escaping (AVAsset?, Int, AVAudioMix?, [AnyHashable: Any]?) -> Void) {
         PHImageManager.default().requestAVAsset(forVideo: phAsset, options: videoRequestOptions) { avAsset, audioMix, info in
             if isHighQuality, (avAsset as? AVURLAsset)?.url.absoluteString.components(separatedBy: "/").last?.contains(".medium.") ?? false {
                 let tempVideoOptions = PHVideoRequestOptions()
@@ -106,7 +106,7 @@ class PQPHAssetVideoParaseUtil: NSObject {
     ///   - isAdjustRotationAngle: 是否调整旋转角度
     ///   - resultHandler: <#resultHandler description#>
     /// - Returns: <#description#>
-    class func exportPHAssetToMP4(phAsset: PHAsset, isAdjustRotationAngle: Bool = true, isCancelCurrentExport: Bool = false, deliveryMode: PHVideoRequestOptionsDeliveryMode? = .automatic, resultHandler: @escaping (_ phAsset: PHAsset, _ aVAsset: AVAsset?, _ filePath: String?, _ errorMsg: String?) -> Void) {
+    public class func exportPHAssetToMP4(phAsset: PHAsset, isAdjustRotationAngle: Bool = true, isCancelCurrentExport: Bool = false, deliveryMode: PHVideoRequestOptionsDeliveryMode? = .automatic, resultHandler: @escaping (_ phAsset: PHAsset, _ aVAsset: AVAsset?, _ filePath: String?, _ errorMsg: String?) -> Void) {
         BFLog(message: "导出相册视频-开始导出:phAsset = \(phAsset)")
         if isCancelCurrentExport {
             currentExportSession?.cancelExport()
@@ -280,7 +280,7 @@ class PQPHAssetVideoParaseUtil: NSObject {
     ///   - isAdjustRotationAngle: 是否调整旋转角度
     ///   - resultHandler: <#resultHandler description#>
     /// - Returns: <#description#>
-    class func writePHAssetDataToMP4(phAsset: PHAsset, isAdjustRotationAngle _: Bool = true, isCancelCurrentExport: Bool = false, deliveryMode _: PHVideoRequestOptionsDeliveryMode? = .automatic, resultHandler: @escaping (_ phAsset: PHAsset, _ aVAsset: AVAsset?, _ filePath: String?, _ errorMsg: String?) -> Void) {
+    public class func writePHAssetDataToMP4(phAsset: PHAsset, isAdjustRotationAngle _: Bool = true, isCancelCurrentExport: Bool = false, deliveryMode _: PHVideoRequestOptionsDeliveryMode? = .automatic, resultHandler: @escaping (_ phAsset: PHAsset, _ aVAsset: AVAsset?, _ filePath: String?, _ errorMsg: String?) -> Void) {
         BFLog(message: "导出相册视频-开始导出:phAsset = \(phAsset)")
         if isCancelCurrentExport {
             currentExportSession?.cancelExport()
@@ -479,7 +479,7 @@ class PQPHAssetVideoParaseUtil: NSObject {
     ///   - aVAsset: <#aVAsset description#>
     ///   - isAdjustRotationAngle: <#isAdjustRotationAngle description#>
     ///   - resultHandler: <#resultHandler description#>
-    class func exportAVAssetToMP4(aVAsset: AVURLAsset, isAdjustRotationAngle: Bool = true, resultHandler: @escaping (_ aVAsset: AVURLAsset?, _ filePath: String?, _ errorMsg: String?) -> Void) {
+    public class func exportAVAssetToMP4(aVAsset: AVURLAsset, isAdjustRotationAngle: Bool = true, resultHandler: @escaping (_ aVAsset: AVURLAsset?, _ filePath: String?, _ errorMsg: String?) -> Void) {
         currentExportSession?.cancelExport()
         BFLog(message: "开始导出相册视频:url = \(aVAsset.url.absoluteString)")
         // 创建目录
@@ -574,7 +574,7 @@ class PQPHAssetVideoParaseUtil: NSObject {
     /// 获取视频资源的旋转角度
     /// - Parameter assert: <#assert description#>
     /// - Returns: <#description#>
-    class func videoRotationAngle(assert: AVAsset) -> Int {
+    public class func videoRotationAngle(assert: AVAsset) -> Int {
         var rotationAngle: Int = 0
 
         let tracks = assert.tracks(withMediaType: .video)
@@ -601,7 +601,7 @@ class PQPHAssetVideoParaseUtil: NSObject {
     ///   - endTime: 结束时间
     ///   - resultHandler: <#resultHandler description#>
     /// - Returns: <#description#>
-    class func cutAudioToLocal(url: String, startTime: Float, endTime: Float, resultHandler: @escaping (_ url: String, _ filePath: String?, _ startTime: Float, _ endTime: Float, _ errorMsg: String?) -> Void) {
+    public class func cutAudioToLocal(url: String, startTime: Float, endTime: Float, resultHandler: @escaping (_ url: String, _ filePath: String?, _ startTime: Float, _ endTime: Float, _ errorMsg: String?) -> Void) {
         // 创建目录
         createDirectory(path: bgMusicDirectory)
         let filePath = bgMusicDirectory + url.md5 + ".mp3"
@@ -662,7 +662,7 @@ class PQPHAssetVideoParaseUtil: NSObject {
     ///   - sourceFilePath: <#sourceFilePath description#>
     ///   - completeHandle: <#completeHandle description#>
     /// - Returns: <#description#>
-    class func createLocalFile(sourceFilePath: String, completeHandle: (_ isFileExists: Bool, _ isCreateSuccess: Bool, _ filePath: String) -> Void) {
+    public class func createLocalFile(sourceFilePath: String, completeHandle: (_ isFileExists: Bool, _ isCreateSuccess: Bool, _ filePath: String) -> Void) {
         let cLocalPath = NSString(string: NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).first!).appendingPathComponent("\(sourceFilePath.md5).mp4")
         if FileManager.default.fileExists(atPath: cLocalPath) {
             BFLog(message: "文件已经存在:\(cLocalPath)")
@@ -680,7 +680,7 @@ class PQPHAssetVideoParaseUtil: NSObject {
     ///   - itemSize: <#itemSize description#>
     ///   - resultHandler: <#resultHandler description#>
     /// - Returns: <#description#>
-    class func requestAssetImage(asset: PHAsset, itemSize: CGSize, resultHandler: @escaping (UIImage?, [AnyHashable: Any]?) -> Void) {
+    public class func requestAssetImage(asset: PHAsset, itemSize: CGSize, resultHandler: @escaping (UIImage?, [AnyHashable: Any]?) -> Void) {
         PHCachingImageManager().requestImage(for: asset, targetSize: itemSize, contentMode: .aspectFill, options: imagesOptions, resultHandler: { image, info in
             BFLog(message: "info = \(info ?? [:])")
             if info?.keys.contains("PHImageResultIsDegradedKey") ?? false, "\(info?["PHImageResultIsDegradedKey"] ?? "0")" == "0" {
@@ -694,7 +694,7 @@ class PQPHAssetVideoParaseUtil: NSObject {
     ///   - asset: <#asset description#>
     ///   - resultHandler: <#resultHandler description#>
     /// - Returns: <#description#>
-    class func requestAssetOringinImage(asset: PHAsset, resultHandler: @escaping (_ isGIF: Bool, _ data: Data?, UIImage?, [AnyHashable: Any]?) -> Void) {
+    public class func requestAssetOringinImage(asset: PHAsset, resultHandler: @escaping (_ isGIF: Bool, _ data: Data?, UIImage?, [AnyHashable: Any]?) -> Void) {
         PHCachingImageManager().requestImageData(for: asset, options: singleImageOptions) { data, _, _, info in
             var image: UIImage?
             if data != nil {
@@ -714,7 +714,7 @@ class PQPHAssetVideoParaseUtil: NSObject {
     ///   - isRenderingTemplate
     ///   - resultHandler: <#resultHandler description#>
     /// - Returns: <#description#>
-    class func parasGIFImage(data: Data, isRenderingColor: UIColor? = nil, resultHandler: @escaping (_ data: Data, _ images: [UIImage]?, _ duration: Double?) -> Void) {
+    public class func parasGIFImage(data: Data, isRenderingColor: UIColor? = nil, resultHandler: @escaping (_ data: Data, _ images: [UIImage]?, _ duration: Double?) -> Void) {
         let info: [String: Any] = [
             kCGImageSourceShouldCache as String: true,
             kCGImageSourceTypeIdentifierHint as String: kUTTypeGIF,

+ 38 - 38
BFFramework/Classes/BFModules/BFUtility/PQSingletoRealmUtil.swift

@@ -9,9 +9,9 @@
 import RealmSwift
 import UIKit
 
-class PQSingletoRealmUtil: NSObject {
-    var schemaVersion : UInt64 = 32
-    var realmEntry: Realm? {
+public class PQSingletoRealmUtil: NSObject {
+    public  var schemaVersion : UInt64 = 32
+    public var realmEntry: Realm? {
         let config = Realm.Configuration(
             schemaVersion: schemaVersion,
             migrationBlock: { _, oldSchemaVersion in
@@ -29,10 +29,10 @@ class PQSingletoRealmUtil: NSObject {
         return nil
     }
 
-    static let shared = PQSingletoRealmUtil()
+    public static let shared = PQSingletoRealmUtil()
 
     // 根据不同的用户ID 初始化不同的数据库 th1
-    func getDraftDB(uid: String) -> Realm {
+    public func getDraftDB(uid: String) -> Realm {
         let docPath = NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.documentDirectory, FileManager.SearchPathDomainMask.userDomainMask, true)[0] as String
         let dbPath = docPath.appending("/\(uid)Draft.realm")
         BFLog(message: "生成登录人数据库地址\(dbPath)")
@@ -51,7 +51,7 @@ class PQSingletoRealmUtil: NSObject {
     /// 写入单个数据
     /// - Parameter objects: <#objects description#>
     /// - Returns: <#description#>
-    func saveObject(object: Object) {
+    public func saveObject(object: Object) {
         do {
             try realmEntry?.write {
                 realmEntry?.add(object, update: .modified)
@@ -66,7 +66,7 @@ class PQSingletoRealmUtil: NSObject {
     /// 写入多个数据
     /// - Parameter objects: <#objects description#>
     /// - Returns: <#description#>
-    func saveObjects(objects: [Object]) {
+    public func saveObjects(objects: [Object]) {
         do {
             try realmEntry?.write {
                 realmEntry?.add(objects, update: .modified)
@@ -81,7 +81,7 @@ class PQSingletoRealmUtil: NSObject {
     /// 写入本地存储数据
     /// - Parameter objects: <#objects description#>
     /// - Returns: <#description#>
-    func saveLocalSaveObject(uniqueId: String, isSelected: Bool) {
+    public func saveLocalSaveObject(uniqueId: String, isSelected: Bool) {
         let currentObject = queryLocalStoreObjects(uniqueId: uniqueId)
         if (currentObject?.count ?? 0) > 0 {
             do {
@@ -106,20 +106,20 @@ class PQSingletoRealmUtil: NSObject {
 
     /// 查询本地缓存数据
     /// - Returns: <#description#>
-    func queryLocalStoreObjects(uniqueId: String) -> Results<PQBaseModel>? {
+    public func queryLocalStoreObjects(uniqueId: String) -> Results<PQBaseModel>? {
         return queryObjects(PQLocalStoreModel.self, filter: "uniqueId == '\(uniqueId)'")
     }
 
     /// 查询所有未过期视频缓存数据
     /// - Returns: description
-    func queryVideoObjects() -> Results<PQBaseModel>? {
+    public func queryVideoObjects() -> Results<PQBaseModel>? {
         // "isSelected == false AND date >= \(Int(Date.init().timeIntervalSince1970) - 24 * 60)"
         return queryObjects(PQVideoListModel.self, filter: "isSelected == false")
     }
 
     /// 删除已缓存视频数据
     /// - Returns: <#description#>
-    func deleteAllCacheObject() {
+    public func deleteAllCacheObject() {
         guard let deleteObjecs = realmEntry?.objects(PQVideoListModel.self) else {
             BFLog(message: "Realm-删除已缓存为空")
             return
@@ -140,13 +140,13 @@ class PQSingletoRealmUtil: NSObject {
     ///   - type: 类型
     ///   - filter: <#filter description#>
     /// - Returns: <#description#>
-    func queryObjects(_ type: PQBaseModel.Type, filter: String) -> Results<PQBaseModel>? {
+    public func queryObjects(_ type: PQBaseModel.Type, filter: String) -> Results<PQBaseModel>? {
         let puppies = realmEntry?.objects(type).filter(filter)
         BFLog(message: "查询已缓存数据:type = \(type) \(puppies ?? nil)")
         return puppies
     }
 
-    func deleteObject() {
+    public func deleteObject() {
         guard let deleteObjecs = realmEntry?.objects(PQVideoListModel.self).filter("isSelected == true") else { return }
         do {
             try realmEntry?.write {
@@ -161,7 +161,7 @@ class PQSingletoRealmUtil: NSObject {
 
     /// 删除
     /// - Returns: <#description#>
-    func deleteObject(object: PQVideoListModel) {
+    public func deleteObject(object: PQVideoListModel) {
         let videoId: Int = object.videoId
         guard let deleteObjecs = realmEntry?.objects(PQVideoListModel.self).filter("videoId == \(videoId)") else { return }
         do {
@@ -175,7 +175,7 @@ class PQSingletoRealmUtil: NSObject {
         }
     }
 
-    func deleteObject(_ type: PQBaseModel.Type, filter: String) {
+    public func deleteObject(_ type: PQBaseModel.Type, filter: String) {
         guard let deleteObjecs = queryObjects(type, filter: filter) else { return }
         do {
             try realmEntry?.write {
@@ -191,7 +191,7 @@ class PQSingletoRealmUtil: NSObject {
     /// 更新缓存视频是否读取过
     /// - Parameter object: <#object description#>
     /// - Returns: <#description#>
-    func updateObject(object: PQVideoListModel) {
+    public func updateObject(object: PQVideoListModel) {
         guard let newObject = realmEntry?.objects(PQVideoListModel.self).filter("videoId == \(object.videoId)") else { BFLog(message: "更新 newObject 为空")
             return
         }
@@ -211,11 +211,11 @@ class PQSingletoRealmUtil: NSObject {
         super.init()
     }
 
-    override func copy() -> Any {
+    override public func copy() -> Any {
         return self
     }
 
-    override func mutableCopy() -> Any {
+    override public func mutableCopy() -> Any {
         return self
     }
 
@@ -226,7 +226,7 @@ class PQSingletoRealmUtil: NSObject {
     /// 添加一个
     ///
     /// - Parameter object: 添加元素
-    func realmAdd(realm: Realm, object: Object) {
+    public func realmAdd(realm: Realm, object: Object) {
         try! realm.write {
             realm.add(object, update: .modified)
         }
@@ -235,7 +235,7 @@ class PQSingletoRealmUtil: NSObject {
     /// 添加多个
     ///
     /// - Parameter objects: 添加数组
-    func realmAdds(realm: Realm, objects: [Object]) {
+    public func realmAdds(realm: Realm, objects: [Object]) {
         try! realm.write {
             realm.add(objects, update: .modified)
         }
@@ -246,7 +246,7 @@ class PQSingletoRealmUtil: NSObject {
     /// 删除一个
     ///
     /// - Parameter object: 删除元素
-    func realmDelete(realm: Realm, object: Object) {
+    public func realmDelete(realm: Realm, object: Object) {
         try! realm.write {
             realm.delete(object)
         }
@@ -255,7 +255,7 @@ class PQSingletoRealmUtil: NSObject {
     /// 删除多个
     ///
     /// - Parameter objects: 元素数组
-    func realmDeletes(realm: Realm, objects: [Object]) {
+    public func realmDeletes(realm: Realm, objects: [Object]) {
         try! realm.write {
             realm.delete(objects)
         }
@@ -266,7 +266,7 @@ class PQSingletoRealmUtil: NSObject {
     /// - Parameters:
     ///   - object: 元素类型
     ///   - predicate: 条件
-    func realmDeletesWithPredicate(realm: Realm, object: Object.Type, predicate: NSPredicate) {
+    public func realmDeletesWithPredicate(realm: Realm, object: Object.Type, predicate: NSPredicate) {
         let results: [Object] = realmQueryWithParameters(realm: realm, object: object, predicate: predicate)
         if results.count > 0 {
             try! realm.write {
@@ -278,7 +278,7 @@ class PQSingletoRealmUtil: NSObject {
     /// 删除该类型所有
     ///
     /// - Parameter object: 元素类型
-    func realmDeleteTypeList(realm: Realm, object: Object.Type) {
+    public func realmDeleteTypeList(realm: Realm, object: Object.Type) {
         let objListResults = realmQueryWithType(realm: realm, object: object)
         if objListResults.count > 0 {
             try! realm.write {
@@ -288,7 +288,7 @@ class PQSingletoRealmUtil: NSObject {
     }
 
     /// 删除当前数据库所有
-    func realmDeleteAll(realm: Realm) {
+    public func realmDeleteAll(realm: Realm) {
         try! realm.write {
             realm.deleteAll()
         }
@@ -299,7 +299,7 @@ class PQSingletoRealmUtil: NSObject {
     /// 更新元素(元素必须有主键)
     ///
     /// - Parameter object: 要更新的元素
-    func realmUpdte(realm: Realm, object _: Object) {
+    public func realmUpdte(realm: Realm, object _: Object) {
         try! realm.write {
 //             realm.up(object, update: true)
         }
@@ -308,7 +308,7 @@ class PQSingletoRealmUtil: NSObject {
     /// 更新元素集合(元素必须有主键)
     ///
     /// - Parameter objects: 元素集合(集合内元素所有属性都要有值)
-    func realmUpdtes(realm: Realm, objects _: [Object]) {
+    public func realmUpdtes(realm: Realm, objects _: [Object]) {
         try! realm.write {
 //             realm.add(objects, update: true)
         }
@@ -317,7 +317,7 @@ class PQSingletoRealmUtil: NSObject {
     /// 更新操作 -> 对于realm搜索结果集当中的元素,在action当中直接负值即可修改
     ///
     /// - Parameter action:操作
-    func realmUpdateWithTranstion(realm: Realm, action: (Bool) -> Void) {
+    public func realmUpdateWithTranstion(realm: Realm, action: (Bool) -> Void) {
         try! realm.write {
             action(true)
         }
@@ -328,13 +328,13 @@ class PQSingletoRealmUtil: NSObject {
     /// 查询元素
     /// - Parameter type: 元素类型
     /// - Parameter filter: 查询条件
-    func reamlQueryObjects(realm: Realm, _ type: Object.Type, filter: String) -> Results<Object>? {
+    public func reamlQueryObjects(realm: Realm, _ type: Object.Type, filter: String) -> Results<Object>? {
         let puppies = realm.objects(type).filter(filter)
         BFLog(message: "查询已缓存数据:type = \(type) \(puppies)")
         return puppies
     }
 
-    func reamlQueryObjectsV2(realm: Realm, _ type: Object.Type, filter: String) -> String {
+    public func reamlQueryObjectsV2(realm: Realm, _ type: Object.Type, filter: String) -> String {
         var json: String?
         try! realm.write {
             let puppies: Results<Object> = realm.objects(type).filter(filter)
@@ -352,7 +352,7 @@ class PQSingletoRealmUtil: NSObject {
     /// - Parameters:
     ///   - object: 元素类型
     /// - Returns: 查询结果
-    func realmQueryWith(realm: Realm, object: Object.Type) -> [Object] {
+    public func realmQueryWith(realm: Realm, object: Object.Type) -> [Object] {
         let results = realmQueryWithType(realm: realm, object: object)
         var resultsArray = [Object]()
         if results.count > 0 {
@@ -369,7 +369,7 @@ class PQSingletoRealmUtil: NSObject {
     ///   - object: 元素类型
     ///   - predicate: 查询条件
     /// - Returns: 查询结果
-    func realmQueryWithParameters(realm: Realm, object: Object.Type, predicate: NSPredicate) -> [Object] {
+    public func realmQueryWithParameters(realm: Realm, object: Object.Type, predicate: NSPredicate) -> [Object] {
         let results = realmQueryWith(realm: realm, object: object, predicate: predicate)
         var resultsArray = [Object]()
         if results.count > 0 {
@@ -387,7 +387,7 @@ class PQSingletoRealmUtil: NSObject {
     ///   - fromIndex: 起始页
     ///   - pageSize: 每页多少个
     /// - Returns: 查询结果
-    func realmQueryWithParametersPage(realm: Realm, object: Object.Type, fromIndex: Int, pageSize: Int) -> [Object] {
+    public func realmQueryWithParametersPage(realm: Realm, object: Object.Type, fromIndex: Int, pageSize: Int) -> [Object] {
         let results = realmQueryWithType(realm: realm, object: object)
         var resultsArray = [Object]()
         if results.count <= pageSize * (fromIndex - 1) || fromIndex <= 0 {
@@ -409,7 +409,7 @@ class PQSingletoRealmUtil: NSObject {
     ///   - sortedKey: 排序key
     ///   - isAssending: 是否升序
     /// - Returns: 查询结果
-    func realmQueryWithParametersAndSorted(realm: Realm, object: Object.Type, predicate: NSPredicate, sortedKey: String, isAssending: Bool) -> [Object] {
+    public func realmQueryWithParametersAndSorted(realm: Realm, object: Object.Type, predicate: NSPredicate, sortedKey: String, isAssending: Bool) -> [Object] {
         let results = realmQueryWithSorted(realm: realm, object: object, predicate: predicate, sortedKey: sortedKey, isAssending: isAssending)
         var resultsArray = [Object]()
         if results.count > 0 {
@@ -430,7 +430,7 @@ class PQSingletoRealmUtil: NSObject {
     ///   - fromIndex: 起始页
     ///   - pageSize: 每页多少个
     /// - Returns: 查询结果
-    func realmQueryWithParametersAndSortedAndPaged(realm: Realm, object: Object.Type, predicate: NSPredicate, sortedKey: String, isAssending: Bool, fromIndex: Int, pageSize: Int) -> [Object] {
+    public func realmQueryWithParametersAndSortedAndPaged(realm: Realm, object: Object.Type, predicate: NSPredicate, sortedKey: String, isAssending: Bool, fromIndex: Int, pageSize: Int) -> [Object] {
         let results = realmQueryWithSorted(realm: realm, object: object, predicate: predicate, sortedKey: sortedKey, isAssending: isAssending)
         var resultsArray = [Object]()
 
@@ -452,7 +452,7 @@ class PQSingletoRealmUtil: NSObject {
     ///
     /// - Parameter object: 查询元素类型
     /// - Returns: 查询结果
-    private func realmQueryWithType(realm: Realm, object: Object.Type) -> Results<Object> {
+    public func realmQueryWithType(realm: Realm, object: Object.Type) -> Results<Object> {
         return realm.objects(object)
     }
 
@@ -462,7 +462,7 @@ class PQSingletoRealmUtil: NSObject {
     ///   - object: 查询元素类型
     ///   - predicate: 查询条件
     /// - Returns: 查询结果
-    private func realmQueryWith(realm: Realm, object: Object.Type, predicate: NSPredicate) -> Results<Object> {
+    public func realmQueryWith(realm: Realm, object: Object.Type, predicate: NSPredicate) -> Results<Object> {
         return realm.objects(object).filter(predicate)
     }
 
@@ -474,7 +474,7 @@ class PQSingletoRealmUtil: NSObject {
     ///   - sortedKey: 排序key
     ///   - isAssending: 是否升序
     /// - Returns: 查询结果
-    private func realmQueryWithSorted(realm: Realm, object: Object.Type, predicate: NSPredicate, sortedKey: String, isAssending: Bool) -> Results<Object> {
+    public func realmQueryWithSorted(realm: Realm, object: Object.Type, predicate: NSPredicate, sortedKey: String, isAssending: Bool) -> Results<Object> {
         return realm.objects(object).filter(predicate)
             .sorted(byKeyPath: sortedKey, ascending: isAssending)
     }

+ 9 - 9
BFFramework/Classes/BFModules/BFUtility/PQSingletoSourcesFileUtil.swift

@@ -9,12 +9,12 @@
 
 import UIKit
 
-class PQSingletoSourcesFileUtil: NSObject {
-    static let shared = PQSingletoSourcesFileUtil()
+public class PQSingletoSourcesFileUtil: NSObject {
+    static public let shared = PQSingletoSourcesFileUtil()
 
-    let cPlistPath = NSString(string: NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).first!).appendingPathComponent("sourcesFile.plist")
+   public let cPlistPath = NSString(string: NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).first!).appendingPathComponent("sourcesFile.plist")
 
-    func createFile() -> Bool {
+    public func createFile() -> Bool {
         let fm = FileManager.default
         if fm.fileExists(atPath: cPlistPath) {
             return true
@@ -22,7 +22,7 @@ class PQSingletoSourcesFileUtil: NSObject {
         return fm.createFile(atPath: cPlistPath, contents: nil, attributes: nil)
     }
 
-    func writeFile(isString: Bool, key: String, sourceNmae: String) -> Bool {
+    public func writeFile(isString: Bool, key: String, sourceNmae: String) -> Bool {
         // 获取加密文件路径
         var object: String?
         if isString {
@@ -46,7 +46,7 @@ class PQSingletoSourcesFileUtil: NSObject {
         return false
     }
 
-    func readFile(isString: Bool, key: String) -> Any {
+    public func readFile(isString: Bool, key: String) -> Any {
         let oldData = NSDictionary(contentsOfFile: Bundle.main.path(forResource: "sourcesFile.plist", ofType: nil) ?? "")
         BFLog(message: "oldData = \(oldData),key = \(key.md5)")
         let enStr = oldData?.object(forKey: key.md5)
@@ -60,15 +60,15 @@ class PQSingletoSourcesFileUtil: NSObject {
         }
     }
 
-    override private init() {
+    override public init() {
         super.init()
     }
 
-    override func copy() -> Any {
+    public override func copy() -> Any {
         return self
     }
 
-    override func mutableCopy() -> Any {
+    public override func mutableCopy() -> Any {
         return self
     }
 }

+ 7 - 7
BFFramework/Classes/BFModules/BFUtility/PQSingletoVideoPlayer.swift

@@ -12,13 +12,13 @@ import UIKit
 public class PQSingletoVideoPlayer: NSObject {
     public static let shared = PQSingletoVideoPlayer()
     public var isPlayEnd: Bool = false // 是否已播放完成
-    var isRealPlay: Bool = false // 是否已真实播放
-    var isSemiRealPlay: Bool = false // 是否已播放到十秒
-    var isPlayBegin: Bool = false // 是否已缓冲完成开始播放
-    var isFirstFrame: Bool = false // 是否已显示第一帧加载完成
-    var isPlayerError: Bool = false // 是否播放失败
-    var loadingTime: TimeInterval = 0 // 加载时长
-    var playId: String = getUniqueId(desc: "playId") // 播放ID
+    public var isRealPlay: Bool = false // 是否已真实播放
+    public  var isSemiRealPlay: Bool = false // 是否已播放到十秒
+    public var isPlayBegin: Bool = false // 是否已缓冲完成开始播放
+    public var isFirstFrame: Bool = false // 是否已显示第一帧加载完成
+    public var isPlayerError: Bool = false // 是否播放失败
+    public var loadingTime: TimeInterval = 0 // 加载时长
+    public var playId: String = getUniqueId(desc: "playId") // 播放ID
     /// 进度回调
     public var progressBloc: ((_ loadProgress: Float, _ playProgress: Float, _ duration: Float) -> Void)?
     /// 播放状态回调

+ 4 - 4
BFFramework/Classes/BFModules/BFUtility/PQVideoSnapshotUtil.swift

@@ -10,11 +10,11 @@ import AVFoundation
 import AVKit
 import UIKit
 
-class PQVideoSnapshotUtil: NSObject {
+public class PQVideoSnapshotUtil: NSObject {
     /// AVPlayer截屏
     /// - Parameter playerItem: <#playerItem description#>
     /// - Returns: <#description#>
-    class func snapshotImage(avPlayer: AVPlayer, complateHandle: @escaping (_ image: UIImage?) -> Void) {
+    class public  func snapshotImage(avPlayer: AVPlayer, complateHandle: @escaping (_ image: UIImage?) -> Void) {
         guard let playerItem = avPlayer.currentItem else { // playerItem is AVPlayerItem
             complateHandle(nil)
             return
@@ -44,7 +44,7 @@ class PQVideoSnapshotUtil: NSObject {
     ///   - videoURL: 视频地址
     ///   - time: 视频某个时间点
     /// - Returns: <#description#>
-    class func videoSnapshot(videoURL: URL, time: TimeInterval) -> UIImage? {
+    class public  func videoSnapshot(videoURL: URL, time: TimeInterval) -> UIImage? {
         let asset = AVURLAsset(url: videoURL, options: avAssertOptions)
         let assetImageGenerator = AVAssetImageGenerator(asset: asset)
         assetImageGenerator.appliesPreferredTrackTransform = true
@@ -69,7 +69,7 @@ class PQVideoSnapshotUtil: NSObject {
     ///   - duration: 视频时长
     ///   - count: 截取数量
     /// - Returns: <#description#>
-    class func videoSnapshot(videoURL: URL, duration: TimeInterval, count: Int, complateHandle: @escaping ([UIImage]?) -> Void) {
+    class public  func videoSnapshot(videoURL: URL, duration: TimeInterval, count: Int, complateHandle: @escaping ([UIImage]?) -> Void) {
         DispatchQueue.global().async {
             var images: [UIImage]? = Array()
             let asset = AVURLAsset(url: videoURL, options: avAssertOptions)

+ 7 - 7
BFFramework/Classes/BFModules/BFUtility/PQWeakTimer.swift

@@ -8,12 +8,12 @@
 
 import Foundation
 
-final class PQWeakTimer {
-    private weak var timer: Timer?
-    private weak var target: AnyObject?
-    private let action: (Timer) -> Void
+public class PQWeakTimer {
+     public weak var timer: Timer?
+    public weak var target: AnyObject?
+    public let action: (Timer) -> Void
 
-    private init(timeInterval: TimeInterval,
+    public init(timeInterval: TimeInterval,
                  target: AnyObject,
                  repeats: Bool,
                  action: @escaping (Timer) -> Void)
@@ -27,7 +27,7 @@ final class PQWeakTimer {
                                      repeats: repeats)
     }
 
-    class func scheduledTimer(timeInterval: TimeInterval,
+    public class func scheduledTimer(timeInterval: TimeInterval,
                               target: AnyObject,
                               repeats: Bool,
                               action: @escaping (Timer) -> Void) -> Timer
@@ -38,7 +38,7 @@ final class PQWeakTimer {
                            action: action).timer!
     }
 
-    @objc private func fire(timer: Timer) {
+    @objc public func fire(timer: Timer) {
         if target != nil {
             action(timer)
         } else {

+ 1 - 1
BFFramework/Classes/BFModules/BFUtility/SWNetRequest.swift

@@ -64,7 +64,7 @@ public class SWNetRequest: NSObject {
     /// 发送head请求
     /// - Parameter url: <#url description#>
     /// - Returns: <#description#>
-    class func headRequestData(url: String, completionHandler: @escaping (Data?, URLResponse?, Error?) -> Void) {
+    class public func headRequestData(url: String, completionHandler: @escaping (Data?, URLResponse?, Error?) -> Void) {
         BFLog(message: "发起head请求 = \(url)")
         if !isValidURL(url: url) {
             completionHandler(nil, nil, PQError(msg: "url错误", code: 1001))

+ 92 - 42
BFFramework/Classes/Enums/Enums.swift

@@ -1,5 +1,5 @@
 //
-//  Enums.swift
+//  public  enum s.swift
 //  PQSpeed
 //
 //  Created by lieyunye on 2020/5/29.
@@ -11,7 +11,7 @@ import Foundation
 // MARK: - 视频播放页面类型
 
 /// 视频播放页面类型
-enum PQVIDEOPAGETYPE {
+public  enum  PQVIDEOPAGETYPE {
     case PQVIDEOPAGETYPE_Normal // 默认-单个视频详情
     case PQVIDEOPAGETYPE_RECOMM // 默认-推荐
     case PQVIDEOPAGETYPE_ATTEN // 关注
@@ -28,7 +28,7 @@ enum PQVIDEOPAGETYPE {
 // MARK: - 视频播放状态
 
 /// 视频播放状态
-public enum PQVIDEO_PLAY_STATUS {
+public  enum  PQVIDEO_PLAY_STATUS {
     case PQVIDEO_PLAY_STATUS_LOADING // 加载中
     case PQVIDEO_PLAY_STATUS_BEGIN // 开始播放
     case PQVIDEO_PLAY_STATUS_END // 播放结束
@@ -40,7 +40,7 @@ public enum PQVIDEO_PLAY_STATUS {
 // MARK: - 页面场景
 
 /// 页面场景
-public enum PAGESOURCE: String {
+public  enum  PAGESOURCE: String {
     /*************** 视频相关pageSource ***************/
     case sp_category = "speedApp-category" //   首页-单列
     case sp_category_recommend = "speedApp-category_recommend" // 由首页单列右划
@@ -129,7 +129,7 @@ public enum PAGESOURCE: String {
 // MARK: - objectType
 
 /// objectType
-enum objectType: String {
+public  enum  objectType: String {
     /*************** tab点击相关pageSource ***************/
 
     case ot_home_tabBtn = "speedApp-categoryTabButton" //  首页tab
@@ -255,7 +255,7 @@ enum objectType: String {
 // MARK: - 视频上报类型
 
 /// 视频上报类型
-enum businessType: String {
+public  enum  businessType: String {
     /*************** 视频相关businessType ***************/
     case bt_videoView = "videoView" //  视频展示到屏幕,在此APP中 首页中:视频展示但未播放时,用于后端算法相关逻辑 相关推荐:在播放中下部展示出相关推荐的3个视频时,上报这3个视频的videoView。同一次播放下不重复上报3个推荐视频的videoView
     case bt_videoPreView = "videoPreView"
@@ -265,7 +265,7 @@ enum businessType: String {
     case bt_videoPlaySuccessTime = "videoPlaySuccessTime" // 加载时长
     case bt_videoPlayException = "videoPlayException"
     case bt_videoPlay_normal = "videoPlay"
-    enum bt_videoPlay: String {
+    public  enum  bt_videoPlay: String {
         case bt_videoPlay_userSlideSingle = "userSlideSingle" // 用户在沉浸态下滑动切换视频(极速版、爱电影)
         case bt_videoPlay_userClickCover = "userClickCover" // 用户点击封面播放
         case bt_videoPlay_userSlideList = "userSlideList" // 用户在列表中滑动停止导致的播放
@@ -314,12 +314,22 @@ enum businessType: String {
     case bt_draft_uploadMaterialSuccess = "uploadMaterialSuccess" // - 素材上传成功事件
     case bt_draft_uploadMaterial = "uploadMaterial" // - 素材开始上传事件
     case bt_videoCompose_muxAction = "muxAction" // 创作工具「合成成功」添加上报参数
+
+    /*************** 广告相关businessType ***************/
+    case bt_ad_request = "adRequest" // 客户端请求广告
+    case bt_ad_loaded = "adLoaded" // 客户端广告加载成功
+    case bt_ad_view = "adView" // 广告展示到屏幕
+    case bt_ad_click = "adClick" // 广告被点击
+    case bt_ad_loadedError = "adLoadedError" // 客户端广告加载失败-非需求
+    case bt_ad_close = "adClose" // 广告被关闭-非需求
+    case bt_ad_configRequest = "adConfigRequest" // 客户端请求广告配置
+    case bt_ad_configLoaded = "adConfigLoaded" // 客户端请求广告配置成功
 }
 
 // MARK: - autoType 自动动作的类型
 
 /// autoType 自动动作的类型
-public enum autoType: Int {
+public  enum  autoType: Int {
     case AUTO_TYPE_SCROLL_VERTICAL_DOWN = 11 // 用户手动下划触发播放(播上一个视频)
     case AUTO_TYPE_SCROLL_VERTICAL_UP = 12 // 用户手动上划触发播放(播下一个视频)
     case AUTO_TYPE_SCROLL_HORIZON_RIGHT = 13 // 用户手动右划触发播放
@@ -336,7 +346,7 @@ public enum autoType: Int {
 // MARK: - 消息动作:表示该条日志属于某条消息生命周期的哪个漏斗环节
 
 /// 消息动作:表示该条日志属于某条消息生命周期的哪个漏斗环节
-enum actionType: String {
+public  enum  actionType: String {
     case at_msg_backendReturn = "backendReturn" // 后端将消息返回给客户端
     case at_msg_frontendPull = "frontendPull" // 客户端获取到
     case at_msg_view = "view" // 在客户端消息被滑动展示在屏幕上
@@ -346,7 +356,7 @@ enum actionType: String {
 // MARK: - 消息类型
 
 /// 消息类型
-enum messageType: Int {
+public  enum  messageType: Int {
     case mt_nomal = 0 // 未知消息
     case mt_fans = 1 // 粉丝消息
     case mt_like = 2 // 喜欢/赞
@@ -359,7 +369,7 @@ enum messageType: Int {
 }
 
 /// 分享空间二级界面数据请求类型  1,观看 2,分享,3,喜欢 4, 评论
-enum sharePageType: Int {
+public  enum  sharePageType: Int {
     case share_page_play = 1 // 分享空间-播放列表
     case share_page_share = 2 // 分享空间-分享列表
     case share_page_favorite = 3 // 分享空间-收藏列表
@@ -369,7 +379,7 @@ enum sharePageType: Int {
 // MARK: - 消息子类型
 
 /// 消息子类型
-enum messageSubType: Int {
+public  enum  messageSubType: Int {
     case mtsub_nomal = 0 // 未知消息
     case mtsub_fansAtt = 101 // 粉丝-关注
     case mtsub_fansSbs = 102 // 粉丝-订阅
@@ -399,7 +409,7 @@ enum messageSubType: Int {
 // MARK: - 埋点上报消息类型(暂未统一)
 
 /// 埋点上报消息类型(暂未统一)
-enum messagePointType: Int {
+public  enum  messagePointType: Int {
     case mt_point_nomal = 0 // 未知消息
     case mt_point_fans = 1 // 粉丝消息
     case mt_point_praise = 2 // 赞
@@ -415,7 +425,7 @@ enum messagePointType: Int {
 // MARK: - 日志库类型
 
 /// 日志库类型
-enum statisticsLogType: Int {
+public  enum  statisticsLogType: Int {
     case st_log_type_abtestinfo = 10 // abtestinfo-Log ABTEST的 dlog Store
     case st_log_type_operation = 20 // operation-Log 漏斗模型的相关上报
     case st_log_type_simpleevent = 30 // simpleevent-Log 独立事件的相关上报
@@ -427,12 +437,13 @@ enum statisticsLogType: Int {
     case st_log_type_videoCompose = 90 // video-compose-log 创作工具素材搜索日志上报
     case st_log_type_location = 100 // user-location-log 位置信息日志上报
     case st_log_type_videoProduction = 110 // video-production-log 创作工具埋点日志上报
+    case st_log_type_adAction = 120 // ad-action-log 广告埋点日志上报
 }
 
 // MARK: - 冷启动方式
 
 /// coldLaunchType // 冷启动方式。若为热启动,则不用上报该字段
-enum coldLaunchType: String {
+public  enum  coldLaunchType: String {
     case coldLaunchType_userActiveOpen = "userActiveOpen" // 用户主动打开
     case coldLaunchType_appRecall = "appRecall" // 其它APP唤起,包括H5应用宝唤起
     case coldLaunchType_pushRecall = "pushRecall" // 推送唤起
@@ -441,7 +452,7 @@ enum coldLaunchType: String {
 // MARK: - 上报日志类型
 
 /// 上报日志类型
-enum reportLogType {
+public  enum  reportLogType {
     case reportLogType_view // 显示页面
     case reportLogType_realPlay // 真实播放 视频播放到20s或播放到总时长30%,哪个先到为准
     case reportLogType_play // 记录播放的视频
@@ -452,7 +463,7 @@ enum reportLogType {
 // MARK: - 底部tab
 
 /// 底部tab
-public enum TAB_PAGETYPE: String {
+public  enum  TAB_PAGETYPE: String {
     case TAB_PAGETYPE_NORMAL = "nomalTab" // 默认
     case TAB_PAGETYPE_RECOMM = "categoryTab" // 推荐
     case TAB_PAGETYPE_ATTEN = "followTab" // 关注
@@ -464,7 +475,7 @@ public enum TAB_PAGETYPE: String {
 // MARK: - 刷新控件类型
 
 /// 刷新控件类型
-public enum REFRESH_TYPE {
+public  enum  REFRESH_TYPE {
     case REFRESH_TYPE_ALL // 推荐
     case REFRESH_TYPE_HEADER // 头部
     case REFRESH_TYPE_FOOTER // 尾部
@@ -473,7 +484,7 @@ public enum REFRESH_TYPE {
 // MARK: - 刷新控件类型
 
 /// 刷新控件类型
-public enum moveDirection {
+public  enum  moveDirection {
     case moveDirectionNormal
     case moveDirectionUp
     case moveDirectionDown
@@ -484,7 +495,7 @@ public enum moveDirection {
 // MARK: - 关注跟粉丝cell类型
 
 /// 关注跟粉丝cell类型
-enum atttendAndFansCellType {
+public  enum  atttendAndFansCellType {
     case cellType_attend // 关注
     case cellType_fans // 粉丝
     case cellType_banned // 黑名单
@@ -493,7 +504,7 @@ enum atttendAndFansCellType {
 // MARK: - 视频全屏播放操作类型
 
 /// 视频全屏播放操作类型
-enum fullScreenActionType {
+public  enum  fullScreenActionType {
     case volume // 声音
     case brightness // 亮度
     case progress // 进度
@@ -502,7 +513,7 @@ enum fullScreenActionType {
 // MARK: - 活动提示页类型
 
 /// 活动提示页类型
-enum activityRemindType {
+public  enum  activityRemindType {
     case nomal //
     case newUser // 新用户专享
     case yesterDay_finish // 昨日已完成
@@ -513,7 +524,7 @@ enum activityRemindType {
 // MARK: - 制作工具素材搜索msgType
 
 /// 制作工具素材搜索msgType
-enum material_msgType: String {
+public  enum  material_msgType: String {
     case all = "ALL_SEARCH_EVENT" // 搜索所有
     case image = "IMAGE_SEARCH_EVENT" // 图片搜索
     case video = "VIDEO_SEARCH_EVENT" // 视频搜索
@@ -524,7 +535,7 @@ enum material_msgType: String {
 }
 
 // 画布类型
-enum videoCanvasType: Int {
+public  enum  videoCanvasType: Int {
     case origin = 1 // 原始
     case nineToSixteen = 2 // 9:16
     case oneToOne = 3 // 1:1
@@ -532,7 +543,7 @@ enum videoCanvasType: Int {
 }
 
 /// 贴纸类型
-enum StickerType: String {
+public  enum  StickerType: String {
     case UNKONW = "unknow"
     case IMAGE = "image" // 图片
     case VIDEO = "video" // 视频
@@ -542,7 +553,7 @@ enum StickerType: String {
     case SUBTITLE = "subtitle" // 字幕
     /// 获取index
     /// - Returns: description
-    func index() -> Int {
+    public func index() -> Int {
         var fileType: Int = 0
         switch self {
         case .IMAGE:
@@ -565,7 +576,7 @@ enum StickerType: String {
 
     /// 媒体类型
     /// - Returns: <#description#>
-    func mimeType() -> String {
+   public func mimeType() -> String {
         var mimeType: String = "application/octet-stream"
         switch self {
         case .IMAGE:
@@ -584,7 +595,7 @@ enum StickerType: String {
         return mimeType
     }
 
-    func pathExtension() -> String {
+   public func pathExtension() -> String {
         var pathExtension: String = ""
         switch self {
         case .IMAGE:
@@ -607,13 +618,13 @@ enum StickerType: String {
 // MARK: - 贴纸裁剪方式
 
 /// 贴纸裁剪方式
-enum stickerContentModeDef: Int {
+public  enum  stickerContentModeDef: Int {
     case aspectFit = 0 // 自适应
     case aspectFill = 1 // 铺满
 }
 
 /// 贴纸裁剪方式 add by ak v2
-enum stickerContentMode: String {
+public  enum  stickerContentMode: String {
     case aspectFitStr = "complete" // 完整显示(有黑边)
     case aspectFillStr = "full" // 铺满
 }
@@ -621,14 +632,14 @@ enum stickerContentMode: String {
 // MARK: - 适配模式
 
 /// 适配模式
-enum adapterModeDef: Int {
+public  enum  adapterModeDef: Int {
     case speedyAuto = 0 // 快速自适应
     case loopAuto = 1 // 自动循环
     case crop = 2 // 定帧/裁剪
 }
 
 /// 适配模式 add by ak  v2
-enum adapterMode: String {
+public  enum  adapterMode: String {
     case multiple // 快速自适应
     case loopAuto = "loop" // 自动循环
     case staticFrame // 定帧/裁剪
@@ -637,7 +648,7 @@ enum adapterMode: String {
 // MARK: - 上传视频类型
 
 /// 上传视频类型
-enum videoUploadSourceType: String {
+public  enum  videoUploadSourceType: String {
     case videoUpload // 上传
     case videoCompose // 合成制作
     case videoUploadToCompose // 上传转合成制作
@@ -646,7 +657,7 @@ enum videoUploadSourceType: String {
 // MARK: - 进入创作工具入口
 
 /// 素材上传、保存、收藏相关
-public enum videoMakeEntranceType: String {
+public  enum  videoMakeEntranceType: String {
     case entranceMineTabDraft = "draft_metab" // 我的Tab -> 草稿箱列表 -> 创作工具
     case entrancePublicTabDraft = "draft_uploadpopup" // 发布Tab -> 草稿箱列表 -> 创作工具
     case entrancePublicTabCompose = "composeVideo" // 发布Tab -> 视频合成 -> 创作工具
@@ -668,7 +679,7 @@ public enum videoMakeEntranceType: String {
 // MARK: - 段落类型
 
 /// 段落类型
-enum sectionType: String {
+public  enum  sectionType: String {
     case normal // 普通段
     case global // 全局段
 }
@@ -676,7 +687,7 @@ enum sectionType: String {
 // MARK: - 音乐类型
 
 /// 音乐类型
-enum VOICETYPT: String {
+public  enum  VOICETYPT: String {
     case PRODUCE = "produce" // 合成语音
     case BGM = "bgm" // 背景音乐
     case SPEECH = "speech" // 录音
@@ -686,7 +697,7 @@ enum VOICETYPT: String {
 // MARK: - 输入框状态B
 
 /// 输入框状态
-enum inputStatus {
+public  enum  inputStatus {
     case normal // 写故事,可智能配音,自动生成字幕
     case inputing // 输入中
     case recording // 语音识别成文字中…
@@ -698,7 +709,7 @@ enum inputStatus {
 // MARK: - 画面比例
 
 /// 画面比例
-enum aspectRatio {
+public  enum  aspectRatio {
     case origin(width: CGFloat, height: CGFloat) // 原始
     case oneToOne // 1:1
     case sixteenToNine // 16:9
@@ -708,14 +719,14 @@ enum aspectRatio {
 // MARK: - 卡点视频音乐页面类型
 
 /// 卡点视频音乐页面类型
-enum stuckPointMusicContentType {
+public  enum  stuckPointMusicContentType {
     case catagery
     case serach
     case page
 }
 
 // 视频发布来源场景 1:普通上传 2:创作工具,3:普通上传转创作工具,4:后台转换加工,5:卡点视频制作
-public enum videoFromScene: Int {
+public  enum  videoFromScene: Int {
     case UploadNormal = 1 // 普通上传
     case UploadMakeVideo = 2 // 创作工具
     case UploadNormalToMakeVideo = 3 // 普通上传转创作工具
@@ -723,10 +734,49 @@ public enum videoFromScene: Int {
     case stuckPoint = 5 // 卡点视频制作
 }
 
+// MARK: - 广告来源渠道
+
+/// 广告来源渠道
+public  enum  adChannel: String {
+    case wechat // 微信广告
+    case byteDouce = "pangle" // 穿山甲广告(字节跳动)
+    case pdd // 多多进宝广告(拼多多)
+    case gdt = "qq" // 腾讯优量汇
+}
+
+// MARK: - 广告类型
+
+/// 广告类型
+public  enum  adType: Int {
+    case banner = 1 // Banner 广告(即:固定位展示广告)
+    case drawVideo = 2 // 信息流视频广告
+    case preMovie = 3 // 贴片广告(场景举例:暂停贴片广告)
+    case tableScreen = 4 // 插屏广告(场景举例:退出全屏,弹出的插屏广告)
+    case splash = 5 // 开屏广告
+}
+
+// MARK: - 广告投放人群
+
+/// 广告投放人群
+public  enum  adCrowd: Int {
+    case highCrowd = 1 // 高分享人群
+    case mediumCrowd = 2 // 中分享人群
+    case lowCrowd = 3 // 低分享人群
+}
+
+// MARK: - 广告内部位置值
+
+/// 广告内部位置值
+public  enum  adPosition: String {
+    case splashAd // 票圈视频 App 闪屏页广告位
+    case videoFlowAd // 票圈视频 App 视频流广告位
+}
+
+
 // MARK: - 风格
 
 /// 风格
-public enum styleColor: String {
+public  enum  styleColor: String {
     case nomal = "#F1034D"
     case green = "#3DC1C1"
     case red = "#EE0051"
@@ -735,7 +785,7 @@ public enum styleColor: String {
 // MARK: - statusBar
 
 /// statusBar
-public enum statusBarStyle {
+public enum  statusBarStyle {
     case light
     case dark
 }

+ 2 - 2
BFFramework/Classes/EventTrack/Model/PQVideoMakeEventTrackModel.swift

@@ -114,13 +114,13 @@ public class PQVideoMakeEventTrackModel: NSObject {
     public var syncedUpOriginalMaterialDuration: Float64 = 0
     // 卡点视频 视频选用节奏名称(快节奏 1、适中 2、慢节奏 3))
     public var syncedUpRhythmNumber: Int = 2
-    override init() {
+    override public init() {
         super.init()
     }
 
     /// 初始化
     /// - Parameter projectModel: <#projectModel description#>
-    init(projectModel: PQEditProjectModel?, reCreateData: PQReCreateModel?) {
+   public init(projectModel: PQEditProjectModel?, reCreateData: PQReCreateModel?) {
         super.init()
         if projectModel != nil {
             draftId = projectModel?.draftboxId

+ 79 - 79
BFFramework/Classes/EventTrack/ViewModel/PQEventTrackViewModel.swift

@@ -11,7 +11,7 @@ import UIKit
 // MARK: - 埋点数据上报
 
 /// 埋点数据上报
-class PQEventTrackViewModel: NSObject {
+public class PQEventTrackViewModel: NSObject {
     /// 基础埋点上报
     /// - Parameters:
     ///   - logType: 数据库类型
@@ -22,7 +22,7 @@ class PQEventTrackViewModel: NSObject {
     ///   - extParams: extParams 扩展字段,为json对象
     ///   - remindmsg: remindmsg 打印提示信息
     /// - Returns: <#description#>
-    class func baseReportUpload(logType: statisticsLogType = .st_log_type_simpleevent, businessType: businessType?, objectType: objectType?, pageSource: PAGESOURCE?, params: [String: Any]? = nil, eventData: [String: Any]? = nil, extParams: [String: Any]? = nil, remindmsg: String? = "基础") {
+    public class func baseReportUpload(logType: statisticsLogType = .st_log_type_simpleevent, businessType: businessType?, objectType: objectType?, pageSource: PAGESOURCE?, params: [String: Any]? = nil, eventData: [String: Any]? = nil, extParams: [String: Any]? = nil, remindmsg: String? = "基础") {
         DispatchQueue.global().async {
             // LogType
             var tempParams: [String: Any] = params ?? [:]
@@ -64,7 +64,7 @@ class PQEventTrackViewModel: NSObject {
     ///   - videoIds: <#videoIds description#>
     ///   - playId: <#playId description#>
     ///   - headVideoId: <#headVideoId description#>
-    class func videoRelationReportUpload(reportLogType: reportLogType, videoData: PQVideoListModel?, pageSource: PAGESOURCE? = nil, businessType: businessType?, objectType: objectType? = nil, extParams: [String: Any]? = nil, shareId: String? = nil, videoIds: String? = nil, playId: String? = nil, headVideoId: String? = nil) {
+    public class func videoRelationReportUpload(reportLogType: reportLogType, videoData: PQVideoListModel?, pageSource: PAGESOURCE? = nil, businessType: businessType?, objectType: objectType? = nil, extParams: [String: Any]? = nil, shareId: String? = nil, videoIds: String? = nil, playId: String? = nil, headVideoId: String? = nil) {
         var tempExtParams: [String: Any] = extParams ?? [:]
         if videoData?.reCreateVideoData != nil {
             tempExtParams["projectId"] = videoData?.reCreateVideoData?.projectId ?? ""
@@ -101,7 +101,7 @@ class PQEventTrackViewModel: NSObject {
     ///   - businessType: 操作类型
     ///   - targetUid: 视频用户ID
     /// - Returns: <#description#>
-    class func reportVideoPlayUpload(reportLogType: reportLogType, videoId: String, headVideoId: String?, videoIds: String?, pageSource: PAGESOURCE, playId: String, recommendId: String?, recommendLogVO: String?, abInfoData: String?, measureType: Int?, measureId: Int?, businessType: businessType?, targetUid: Int = 0, shareId: String = "", extParams: [String: Any]? = nil, objectType: objectType? = nil) {
+    public class func reportVideoPlayUpload(reportLogType: reportLogType, videoId: String, headVideoId: String?, videoIds: String?, pageSource: PAGESOURCE, playId: String, recommendId: String?, recommendLogVO: String?, abInfoData: String?, measureType: Int?, measureId: Int?, businessType: businessType?, targetUid: Int = 0, shareId: String = "", extParams: [String: Any]? = nil, objectType: objectType? = nil) {
         DispatchQueue.global().async {
             var params: [String: Any] = ["videoId": videoId, "pageSource": pageSource.rawValue, "playId": playId, "targetUid": targetUid]
             if measureType != nil {
@@ -180,76 +180,76 @@ class PQEventTrackViewModel: NSObject {
         }
     }
 
-    /// 分享上报
-    /// - Parameters:
-    ///   - isShareVideo: 是否是分享视频
-    ///   - screenType: 分享场景 1-分享视频/用户 2-分享视频到朋友圈 3-分享视频到好友
-    ///   - videoId: 视频Id
-    ///   - pageSource: 页面枚举
-    ///   - recommendId: <#recommendId description#>
-    ///   - recommendLogVO: <#recommendLogVO description#>
-    ///   - abInfoData: <#abInfoData description#>
-    ///   - measureType: <#measureType description#>
-    ///   - measureId: <#measureId description#>
-    ///   - businessType: <#businessType description#>
-    ///   - targetUid: <#targetUid description#>
-    ///   - shareId: <#shareId description#>
-//    class func shareReportUpload(isShareVideo: Bool = true, screenType: Int = 1, videoId: String, pageSource: PAGESOURCE, recommendId: String?, recommendLogVO: String?, abInfoData: String?, measureType: Int?, measureId: Int?, businessType: businessType?, targetUid: Int?, shareId: String = "") {
-//        DispatchQueue.global().async {
-//            var url: String = PQENVUtil.shared.longvideoapi
-//            switch screenType {
-//            case 1:
-//                url = url + userShareReportUrl
-//            case 2:
-//                url = url + userShareH5ReportUrl
-//            case 3:
-//                url = url + userShareFriendReportUrl
-//            default:
-//                break
-//            }
-//            var params: [String: Any] = ["type": isShareVideo ? "1" : "2", "videoId": videoId, "pageSource": pageSource.rawValue, "playId": PQSingletoVideoPlayer.shared.playId, "targetUid": targetUid ?? 0, "shareDepth": "0"]
-//            if measureType != nil {
-//                params["measureType"] = measureType
-//            }
-//            if measureId != nil {
-//                params["measureId"] = measureId
-//            }
-//            params["shareId"] = shareId
-//            params["rootLaunchShareId"] = shareId
-//            params["parentShareId"] = shareId
-//            params["rootShareId"] = shareId
-//            if !BFLoginUserInfo.shared.openId.isEmpty {
-//                params["shareUi"] = BFLoginUserInfo.shared.openId
-//            }
-//            if pageSource.rawValue.contains("speedApp-category") {
-//                params["pageCategoryId"] = 55
-//            }
-//            if isShareVideo {
-//                params["shareObjectId"] = videoId
-//            } else {
-//                params["shareObjectId"] = targetUid
-//            }
-//            if businessType != nil {
-//                params["businessType"] = businessType?.rawValue
-//            }
-//            if recommendId != nil, !(recommendId?.isEmpty ?? true) {
-//                params["recommendId"] = recommendId
-//            }
-//            if recommendLogVO != nil, !(recommendLogVO?.isEmpty ?? true) {
-//                params["recommendLogVO"] = recommendLogVO
-//            }
-//            if abInfoData != nil, !(abInfoData?.isEmpty ?? true) {
-//                params["abInfoData"] = abInfoData
-//            }
-//            SWNetRequest.postRequestData(url: url, parames: params) { response, _, error, _ in
-//                BFLog(message: "用户点击分享数据上报:\(String(describing: error)),\(response ?? [:])")
-//            }
-//        }
-//    }
+//    / 分享上报
+//    / - Parameters:
+//    /   - isShareVideo: 是否是分享视频
+//    /   - screenType: 分享场景 1-分享视频/用户 2-分享视频到朋友圈 3-分享视频到好友
+//    /   - videoId: 视频Id
+//    /   - pageSource: 页面枚举
+//    /   - recommendId: <#recommendId description#>
+//    /   - recommendLogVO: <#recommendLogVO description#>
+//    /   - abInfoData: <#abInfoData description#>
+//    /   - measureType: <#measureType description#>
+//    /   - measureId: <#measureId description#>
+//    /   - businessType: <#businessType description#>
+//    /   - targetUid: <#targetUid description#>
+//    /   - shareId: <#shareId description#>
+    public class func shareReportUpload(isShareVideo: Bool = true, screenType: Int = 1, videoId: String, pageSource: PAGESOURCE, recommendId: String?, recommendLogVO: String?, abInfoData: String?, measureType: Int?, measureId: Int?, businessType: businessType?, targetUid: Int?, shareId: String = "") {
+        DispatchQueue.global().async {
+            var url: String = PQENVUtil.shared.longvideoapi
+            switch screenType {
+            case 1:
+                url = url + userShareReportUrl
+            case 2:
+                url = url + userShareH5ReportUrl
+            case 3:
+                url = url + userShareFriendReportUrl
+            default:
+                break
+            }
+            var params: [String: Any] = ["type": isShareVideo ? "1" : "2", "videoId": videoId, "pageSource": pageSource.rawValue, "playId": PQSingletoVideoPlayer.shared.playId, "targetUid": targetUid ?? 0, "shareDepth": "0"]
+            if measureType != nil {
+                params["measureType"] = measureType
+            }
+            if measureId != nil {
+                params["measureId"] = measureId
+            }
+            params["shareId"] = shareId
+            params["rootLaunchShareId"] = shareId
+            params["parentShareId"] = shareId
+            params["rootShareId"] = shareId
+            if !BFLoginUserInfo.shared.openId.isEmpty {
+                params["shareUi"] = BFLoginUserInfo.shared.openId
+            }
+            if pageSource.rawValue.contains("speedApp-category") {
+                params["pageCategoryId"] = 55
+            }
+            if isShareVideo {
+                params["shareObjectId"] = videoId
+            } else {
+                params["shareObjectId"] = targetUid
+            }
+            if businessType != nil {
+                params["businessType"] = businessType?.rawValue
+            }
+            if recommendId != nil, !(recommendId?.isEmpty ?? true) {
+                params["recommendId"] = recommendId
+            }
+            if recommendLogVO != nil, !(recommendLogVO?.isEmpty ?? true) {
+                params["recommendLogVO"] = recommendLogVO
+            }
+            if abInfoData != nil, !(abInfoData?.isEmpty ?? true) {
+                params["abInfoData"] = abInfoData
+            }
+            SWNetRequest.postRequestData(url: url, parames: params) { response, _, error, _ in
+                BFLog(message: "用户点击分享数据上报:\(String(describing: error)),\(response ?? [:])")
+            }
+        }
+    }
 
     /// DNS上报
     /// - Returns: <#description#>
-    class func dnsReportUpload() {
+    public class func dnsReportUpload() {
         DispatchQueue.global().async {
             let speedExtParams = parseDNS(hostUrl: "speed.piaoquantv.com")
             let rescdnExtParams = parseDNS(hostUrl: "rescdn.yishihui.com")
@@ -271,7 +271,7 @@ class PQEventTrackViewModel: NSObject {
     ///   - extParams: <#extParams description#>
     ///   - pageSource: <#pageSource description#>
     /// - Returns: <#description#>
-    class func reportStatisticsUpload(isHotLaunch: Bool = false, logType: statisticsLogType, coldLaunchType _: coldLaunchType = .coldLaunchType_userActiveOpen, eventId _: String?, eventData _: String?, pageSource: PAGESOURCE?) {
+     class public func reportStatisticsUpload(isHotLaunch: Bool = false, logType: statisticsLogType, coldLaunchType _: coldLaunchType = .coldLaunchType_userActiveOpen, eventId _: String?, eventData _: String?, pageSource: PAGESOURCE?) {
         DispatchQueue.global().async {
             var params: [String: Any] = ["LogType": logType.rawValue]
             if PQSingletoMemoryUtil.shared.isColdLaunch {
@@ -342,7 +342,7 @@ class PQEventTrackViewModel: NSObject {
     ///   - pushTargetId: pushTargetType == 1 视频ID,pushTargetType == 4 用户ID
     ///   - bizParam 扩展参数
     /// - Returns: <#description#>
-    class func reportPushActionUpload(pushId: String, pushTargetType: Int, pushBrand: String = cPushChannel, pushTargetId: String?,bizParam : [String: Any]? = nil) {
+    public class func reportPushActionUpload(pushId: String, pushTargetType: Int, pushBrand: String = cPushChannel, pushTargetId: String?,bizParam : [String: Any]? = nil) {
         DispatchQueue.global().async {
             var params: [String: Any] = bizParam ?? Dictionary<String,Any>.init()
             if pushTargetId != nil {
@@ -367,7 +367,7 @@ class PQEventTrackViewModel: NSObject {
     /// - Parameter registerId: 设备id
     /// - Parameter deviceToken: <#deviceToken description#>
     /// - Returns: <#description#>
-    class func reportPushDeviceTokenUpload(registerId: String, deviceToken: String, completeHander: @escaping (_ isSuccess: Bool) -> Void) {
+    public class func reportPushDeviceTokenUpload(registerId: String, deviceToken: String, completeHander: @escaping (_ isSuccess: Bool) -> Void) {
         DispatchQueue.global().async {
             SWNetRequest.postRequestData(url: PQENVUtil.shared.longvideoapi + pushDeviceTokenReportUrl, parames: ["registerId": registerId, "deviceToken": deviceToken, "brand": cPushChannel]) { response, _, error, _ in
                 completeHander(error == nil ? true : false)
@@ -383,7 +383,7 @@ class PQEventTrackViewModel: NSObject {
     ///   - searchNumber: 数量
     ///   - reportType: 1 into 2 click 3 show
     /// - Returns: <#description#>
-    class func searchReportUpload(keyWord: String, searchType: Int, searchNumber: Int = 10, reportType: Int = 2) {
+    public class func searchReportUpload(keyWord: String, searchType: Int, searchNumber: Int = 10, reportType: Int = 2) {
         DispatchQueue.global().async {
             let params: [String: Any] = ["keyWord": keyWord, "searchType": searchType, "searchNumber": searchNumber, "reportType": reportType]
             SWNetRequest.postRequestData(url: PQENVUtil.shared.longvideoapi + searchReportUrl, parames: params) { response, _, error, _ in
@@ -399,7 +399,7 @@ class PQEventTrackViewModel: NSObject {
     ///   - ossInfo: <#ossInfo description#>
     ///   - params: <#params description#>
     /// - Returns: <#description#>
-    class func publishReportUpload(projectId: String?, businessType: businessType, ossInfo: [String: Any], params: [String: Any]) {
+    public class func publishReportUpload(projectId: String?, businessType: businessType, ossInfo: [String: Any], params: [String: Any]) {
         DispatchQueue.global().async {
             var extParams: [String: Any] = ["ossInfo": dictionaryToJsonString(ossInfo) ?? "", "params": dictionaryToJsonString(params) ?? ""]
             if projectId != nil {
@@ -417,7 +417,7 @@ class PQEventTrackViewModel: NSObject {
     ///   - businessType: <#businessType description#>
     ///   - materialList: <#materialList description#>
     /// - Returns: <#description#>
-    class func dealWithMaterialSearchReportUpload(businessType: businessType, materialList: [PQEditVisionTrackMaterialsModel]) {
+    public class func dealWithMaterialSearchReportUpload(businessType: businessType, materialList: [PQEditVisionTrackMaterialsModel]) {
         if materialList.count > 0 {
             DispatchQueue.global().async {
                 for item in materialList {
@@ -434,7 +434,7 @@ class PQEventTrackViewModel: NSObject {
     ///   - businessType: <#businessType description#>
     ///   - pageSource: <#pageSource description#>
     /// - Returns: <#description#>
-    class func materialReportUpload(material: PQEditVisionTrackMaterialsModel?, businessType: businessType?, objectType: objectType? = nil) {
+    public class func materialReportUpload(material: PQEditVisionTrackMaterialsModel?, businessType: businessType?, objectType: objectType? = nil) {
         DispatchQueue.global().async {
             var params: [String: Any] = [:]
             var eventData: [String: Any] = [:]
@@ -481,7 +481,7 @@ class PQEventTrackViewModel: NSObject {
     ///   - extParams: 扩展字段 json格式
     ///   - remindmsg: 打印提示信息
     /// - Returns: <#description#>
-    class func messageReportUpload(messageIds: String?, clickId: String?, messageType: messageType?, messageSubType: messageSubType?, actionType: actionType?, objectType: objectType?, pageSource: PAGESOURCE?, readStatus: Int = 1, eventData: [String: Any]? = nil, extParams: [String: Any]? = nil, remindmsg: String? = "基础") {
+    public class func messageReportUpload(messageIds: String?, clickId: String?, messageType: messageType?, messageSubType: messageSubType?, actionType: actionType?, objectType: objectType?, pageSource: PAGESOURCE?, readStatus: Int = 1, eventData: [String: Any]? = nil, extParams: [String: Any]? = nil, remindmsg: String? = "基础") {
         DispatchQueue.global().async {
             var tempParams: [String: Any] = extParams ?? [:]
             if messageType != nil, messageType != .mt_nomal {

+ 21 - 22
BFFramework/Classes/PModels/PQDownloadModel.swift

@@ -11,7 +11,7 @@ import UIKit
 // MARK: - 文件扩展名
 
 /// 文件扩展名
-enum FileExtensionType: String {
+public enum FileExtensionType: String {
     case normal = "" // 无后缀名
     case png // png
     case jpg // jpg
@@ -24,7 +24,7 @@ enum FileExtensionType: String {
     case zip // zip
     /// 文件类型
     /// - Returns: <#description#>
-    func fileType() -> String {
+   public func fileType() -> String {
         var fileType: String = "unknow"
         switch self {
         case .png, .jpg:
@@ -45,11 +45,11 @@ enum FileExtensionType: String {
 // MARK: - 下载model
 
 /// 下载model
-class PQDownloadModel: NSObject {
-    var name: String? // 资源名
-    var fileExtensionType: FileExtensionType? // 文件后缀类型
-    var realFileExtensionType: FileExtensionType? // 真实文件后缀类型
-    var mimeType: String? { // 媒体类型
+public class PQDownloadModel: NSObject {
+    public var name: String? // 资源名
+    public var fileExtensionType: FileExtensionType? // 文件后缀类型
+    public var realFileExtensionType: FileExtensionType? // 真实文件后缀类型
+    public var mimeType: String? { // 媒体类型
         didSet {
 //            if mimeType?.contains("jpeg") ?? false { // image/jpeg
 //                realFileExtensionType = .jpg
@@ -70,31 +70,30 @@ class PQDownloadModel: NSObject {
         }
     }
 
-    var sourceURL: String? // 源地址
-    var filePath: String? // 下载到本地地址
-    var imageURL: String? // 图片地址
-    var totalLength: Int64? // 总大小
-    var downloadLength: Int64? // 已下载大小
-    var task: URLSessionDataTask? // 下载任务
-    var progress: Float? // 下载进度
-    var state: downloadState? // 下载状态
-    var progressHandle: ProgressHandle? // 进度的回调
-    var stateHandle: StateHandle? // 状态回调
-    var fileHandle: FileHandle? // 文件句柄
+    public var sourceURL: String? // 源地址
+    public  var filePath: String? // 下载到本地地址
+    public var imageURL: String? // 图片地址
+    public  var totalLength: Int64? // 总大小
+    public var downloadLength: Int64? // 已下载大小
+    public var task: URLSessionDataTask? // 下载任务
+    public var progress: Float? // 下载进度
+    public var state: downloadState? // 下载状态
+    public var progressHandle: ProgressHandle? // 进度的回调
+    public var stateHandle: StateHandle? // 状态回调
+    public var fileHandle: FileHandle? // 文件句柄
 }
 
 // MARK: - 下载状态
 
 /// 下载状态
-enum downloadState: Int {
+public enum downloadState: Int {
     case downloading = 0 // 下载中
     case compelte = 1 // 下载完成
     case error = 2 // 下载失败
     case pause = 3 // 暂停下载
     case cancel = 4 // 取消下载
 }
-
 // 进度的回调
-typealias ProgressHandle = (_ progress: Float, _ downloadLength: Int64?, _ totalLength: Int64?) -> Void
+public typealias  ProgressHandle = (_ progress: Float, _ downloadLength: Int64?, _ totalLength: Int64?) -> Void
 // 状态回调
-typealias StateHandle = (_ state: downloadState, _ url: String, _ localPath: String?, _ error: PQError?) -> Void
+public typealias StateHandle = (_ state: downloadState, _ url: String, _ localPath: String?, _ error: PQError?) -> Void

+ 16 - 16
BFFramework/Classes/PModels/PQUploadModel.swift

@@ -10,22 +10,22 @@
 import Photos
 import UIKit
 
-class PQUploadModel: PQBaseModel {
-    var image: UIImage? // 图片
-    var localPath: String? // 地址
-    var duration: TimeInterval = 0 // 时间
-    var asset: PHAsset? // 视频资源
-    var videoBucketKey: String? // 上传视频功能
-    var imageBucketKey: String? // 上传图片地址
-    var assetCollection: PHAssetCollection? // 相簿
-    var categoryList: PHFetchResult<PHAsset> = PHFetchResult<PHAsset>.init() // 子相册集合
-    var assetList: [PHAsset] = Array<PHAsset>.init() // 子相册集合
-    var uploadID: String? // 上传ID
-    var videoWidth: CGFloat = 0 // 视频宽
-    var videoHeight: CGFloat = 0 // 视频高
-    var contentMode: UIView.ContentMode = .scaleAspectFill
-    var stsToken: [String: Any]? // 上传信息
+open class PQUploadModel: PQBaseModel {
+   public var image: UIImage? // 图片
+   public var localPath: String? // 地址
+   public var duration: TimeInterval = 0 // 时间
+   public var asset: PHAsset? // 视频资源
+   public var videoBucketKey: String? // 上传视频功能
+   public var imageBucketKey: String? // 上传图片地址
+   public var assetCollection: PHAssetCollection? // 相簿
+   public var categoryList: PHFetchResult<PHAsset> = PHFetchResult<PHAsset>.init() // 子相册集合
+   public var assetList: [PHAsset] = Array<PHAsset>.init() // 子相册集合
+   public var uploadID: String? // 上传ID
+   public var videoWidth: CGFloat = 0 // 视频宽
+   public var videoHeight: CGFloat = 0 // 视频高
+   public var contentMode: UIView.ContentMode = .scaleAspectFill
+   public var stsToken: [String: Any]? // 上传信息
 
     // add by ak 上传来源类型
-    var videoFromScene: videoFromScene = .UploadNormal
+   public var videoFromScene: videoFromScene = .UploadNormal
 }

+ 4 - 4
BFFramework/Classes/PModels/PQUserInfoModel.swift

@@ -8,7 +8,7 @@
 
 import UIKit
 
-public class PQUserInfoModel: PQBaseModel {
+open class PQUserInfoModel: PQBaseModel {
     public  var avatarUrl: String? // 头像地址
     public var backgroundImage: String? // 背景图
 
@@ -49,11 +49,11 @@ public class PQUserInfoModel: PQBaseModel {
     public var isBanned: Bool = false // 是否被拉黑
     public var tab_pageType: TAB_PAGETYPE = .TAB_PAGETYPE_NORMAL // 0-推荐 1-关注
 
-    required init() {
+    required public init() {
         super.init()
     }
 
-    override init(jsonDict: [String: Any]) {
+    public override init(jsonDict: [String: Any]) {
         super.init()
         if jsonDict.keys.contains("avatarUrl") {
             avatarUrl = "\(jsonDict["avatarUrl"] ?? "")"
@@ -161,7 +161,7 @@ public class PQUserInfoModel: PQBaseModel {
 
     /// 创建虚拟用户数据
     /// - Parameter virtual: <#virtual description#>
-    init(avatarIcon: String?, userName: String?) {
+   public init(avatarIcon: String?, userName: String?) {
         super.init()
         avatarUrl = avatarIcon
         nickName = userName

+ 2 - 2
BFFramework/Classes/PModels/PQVideoListModel.swift

@@ -8,8 +8,8 @@
 
 import UIKit
 
-public class PQVideoListModel: PQBaseModel {
-    @objc required init() {
+open class PQVideoListModel: PQBaseModel {
+    @objc required public init() {
         super.init()
     }
 

+ 18 - 0
BFFramework/Classes/PModels/editDarftModels/PQAzureStyleModel.swift

@@ -0,0 +1,18 @@
+//
+//  PQAzureStyleModel.swift
+//  PQSpeed
+//
+//  Created by ak on 2021/4/22.
+//  Copyright © 2021 BytesFlow. All rights reserved.
+//
+
+import Foundation
+
+public class PQAzureStyleModel: NSObject {
+    public var name: String = ""
+    public var style: String = ""
+    // 是否被选中
+    public var isSelected: Bool = false
+
+    public var showWith: CGFloat = 0.0
+}

+ 17 - 17
BFFramework/Classes/PModels/editDarftModels/PQEditAudioTrackMaterialModel.swift

@@ -10,7 +10,7 @@ import Foundation
 import ObjectMapper
 import RealmSwift
 
-class PQEditAudioTrackMaterialModel: PQEditBaseModel {
+public class PQEditAudioTrackMaterialModel: PQEditBaseModel {
     /**
      @objc dynamic var id: Int64 = 0
      @objc dynamic var materialUrl: String = ""
@@ -28,25 +28,25 @@ class PQEditAudioTrackMaterialModel: PQEditBaseModel {
          }
      }
      **/
-    @objc dynamic var id: Int64 = 0
-    @objc dynamic var type: String = ""
+    @objc dynamic public var id: Int64 = 0
+    @objc dynamic public var type: String = ""
     // 音频类型(bgm:背景音乐,produce:合成语音,speech:录音,local : 本地文件)
-    @objc dynamic var voiceType: String = ""
-    @objc dynamic var duration: Float64 = 0
-    @objc dynamic var timelineIn: Float64 = 0
-    @objc dynamic var timelineOut: Float64 = 0
-    @objc dynamic var model_in: Float64 = 0
-    @objc dynamic var out: Float64 = 0
+    @objc dynamic public var voiceType: String = ""
+    @objc dynamic public var duration: Float64 = 0
+    @objc dynamic public var timelineIn: Float64 = 0
+    @objc dynamic public var timelineOut: Float64 = 0
+    @objc dynamic public var model_in: Float64 = 0
+    @objc dynamic public var out: Float64 = 0
     // 音量增益,保留一位小数,取值范围 0.0 - 10.0,大于1,表示音量增强。小于1,表示音量减小。0.0 表示静音
-    @objc dynamic var volumeGain: Float64 = 0
-    @objc dynamic var materialDurationFit: PQEditmaterialDurationFitModel?
-    @objc dynamic var produceVoiceConfig: PQEditProduceVoiceConfigModel?
-    @objc dynamic var bgmInfo: PQEditBgmInfoModel?
-    @objc dynamic var materialUrl: String = ""
-    var status: inputStatus = .normal
+    @objc dynamic public var volumeGain: Float64 = 0
+    @objc dynamic public var materialDurationFit: PQEditmaterialDurationFitModel?
+    @objc dynamic public var produceVoiceConfig: PQEditProduceVoiceConfigModel?
+    @objc dynamic public var bgmInfo: PQEditBgmInfoModel?
+    @objc dynamic public var materialUrl: String = ""
+    public var status: inputStatus = .normal
     // add by ak 业务逻辑添加的属性 声音文件的本地址
     // 音频文件本地地址 URI
-    @objc dynamic var locationPath: String = "" {
+    @objc dynamic public var locationPath: String = "" {
         didSet {
             BFLog(message: "音频的:locationPath\(locationPath)")
         }
@@ -56,7 +56,7 @@ class PQEditAudioTrackMaterialModel: PQEditBaseModel {
         self.init()
     }
 
-    override func mapping(map: Map) {
+    override public func mapping(map: Map) {
         id <- map["id"]
         type <- map["type"]
         voiceType <- map["voiceType"]

+ 9 - 9
BFFramework/Classes/PModels/editDarftModels/PQEditAudioTrackModel.swift

@@ -15,20 +15,20 @@ import Foundation
 
 import ObjectMapper
 import RealmSwift
-class PQEditAudioTrackModel: PQEditBaseModel {
-    var audioTrackMaterials: List<PQEditAudioTrackMaterialModel> = List<PQEditAudioTrackMaterialModel>.init()
-    @objc dynamic var count: Int = 0
-    @objc dynamic var duration: Float64 = 0
+public class PQEditAudioTrackModel: PQEditBaseModel {
+    public var audioTrackMaterials: List<PQEditAudioTrackMaterialModel> = List<PQEditAudioTrackMaterialModel>.init()
+    @objc dynamic public var count: Int = 0
+    @objc dynamic public var duration: Float64 = 0
 
-    required convenience init?(map _: Map) {
+    required convenience public init?(map _: Map) {
         self.init()
     }
 
-    required init() {
+    required public  init() {
         super.init()
     }
 
-    override func mapping(map: Map) {
+    override public func mapping(map: Map) {
         audioTrackMaterials <- (map["audioTrackMaterials"], PQListTransform<PQEditAudioTrackMaterialModel>())
         count <- map["count"]
         duration <- (map["duration"], timeTransform)
@@ -37,7 +37,7 @@ class PQEditAudioTrackModel: PQEditBaseModel {
     /// 根据 VoiceType 取音轨信息
     /// - Parameter voiceType: voiceType  音频类型(bgm:背景音乐,produce:合成语音,speech:录音,local : 本地文件)
     /// - Returns: PQEditAudioTrackMaterialModel
-    func getAudioTrackModel(voiceType: String) -> PQEditAudioTrackMaterialModel? {
+   public  func getAudioTrackModel(voiceType: String) -> PQEditAudioTrackMaterialModel? {
         BFLog(message: "查询 voiceType is \(voiceType)")
         var audioTrackMaterialModel: PQEditAudioTrackMaterialModel?
         for materialModel in audioTrackMaterials {
@@ -49,7 +49,7 @@ class PQEditAudioTrackModel: PQEditBaseModel {
     }
 
     // 添加录音文件 如果原来有先删除旧数据
-    func addSpeechAudioTrackMaterialModel(_ audioTrackMaterialModel: PQEditAudioTrackMaterialModel) {
+   public  func addSpeechAudioTrackMaterialModel(_ audioTrackMaterialModel: PQEditAudioTrackMaterialModel) {
         // 1 找出声音转文字的对应段落
         let sesscionIdex = audioTrackMaterials.firstIndex(where: { (audioTrack) -> Bool in
             audioTrack.voiceType == VOICETYPT.SPEECH.rawValue

+ 8 - 8
BFFramework/Classes/PModels/editDarftModels/PQEditBaseModel.swift

@@ -10,7 +10,7 @@ import ObjectMapper
 import RealmSwift
 
 // 自定义时长转换协议,服务单位为微秒,我们使用 S
-let timeTransform = TransformOf<Float64, Float64>(fromJSON: { (value: Float64?) -> Float64? in
+public let timeTransform = TransformOf<Float64, Float64>(fromJSON: { (value: Float64?) -> Float64? in
     // transform value from String? to Int?
     (value ?? 0) / 1_000_000
 }, toJSON: { (value: Float64?) -> Float64? in
@@ -22,7 +22,7 @@ let timeTransform = TransformOf<Float64, Float64>(fromJSON: { (value: Float64?)
 })
 
 // 自定义音量转换协议,服务器单位0.0-1.0,我们使用 0-100
-let volumeGainTransform = TransformOf<Float64, Float64>(fromJSON: { (value: Float64?) -> Float64? in
+public let volumeGainTransform = TransformOf<Float64, Float64>(fromJSON: { (value: Float64?) -> Float64? in
     BFLog(message: "value is \(value)")
     return (value ?? 0.0) * 100.0
 }, toJSON: { (value: Float64?) -> Float64? in
@@ -32,7 +32,7 @@ let volumeGainTransform = TransformOf<Float64, Float64>(fromJSON: { (value: Floa
     return nil
 })
 // 自定义 sectionIndex 转换协议服务器是从 1 开始,我们是从0开始
-let sectionIndexTransform = TransformOf<Int, Int>(fromJSON: { (value: Int?) -> Int? in
+public let sectionIndexTransform = TransformOf<Int, Int>(fromJSON: { (value: Int?) -> Int? in
     (value ?? 0) - 1
 }, toJSON: { (value: Int?) -> Int? in
     if let value = value {
@@ -41,15 +41,15 @@ let sectionIndexTransform = TransformOf<Int, Int>(fromJSON: { (value: Int?) -> I
     return nil
 })
 
-class PQEditBaseModel: Object, Mappable {
-    @objc dynamic var uniqueId: String = getUniqueId(desc: "uniqueId")
-    func mapping(map _: Map) {}
+open class PQEditBaseModel: Object, Mappable {
+    @objc dynamic public var uniqueId: String = getUniqueId(desc: "uniqueId")
+    public func mapping(map _: Map) {}
 
-    required convenience init?(map _: Map) {
+    required convenience public init?(map _: Map) {
         self.init()
     }
 
-    override required init() {
+    override required public init() {
         super.init()
     }
 }

+ 6 - 6
BFFramework/Classes/PModels/editDarftModels/PQEditBgmInfoModel.swift

@@ -8,19 +8,19 @@
 
 import ObjectMapper
 import RealmSwift
-class PQEditBgmInfoModel: PQEditBaseModel {
-    @objc dynamic var musicId: String = ""
-    @objc dynamic var originType: Int = 0
+public class PQEditBgmInfoModel: PQEditBaseModel {
+    @objc dynamic public var musicId: String = ""
+    @objc dynamic public var originType: Int = 0
     // 选择的声音类型,1:原声 ,2:背景声
-    @objc dynamic var selectVoiceType: Int = 1
+    @objc dynamic public var selectVoiceType: Int = 1
     // 卡点音乐节奏速度(1:快节奏,2:适中,3:慢节奏)
-    @objc dynamic var rhythmMusicSpeed: Int = 1
+    @objc dynamic public var rhythmMusicSpeed: Int = 1
 
     required convenience init?(map _: Map) {
         self.init()
     }
 
-    override func mapping(map: Map) {
+    override public func mapping(map: Map) {
         musicId <- map["musicId"]
         originType <- map["originType"]
         selectVoiceType <- map["selectVoiceType"]

+ 8 - 8
BFFramework/Classes/PModels/editDarftModels/PQEditFileMergeTable.swift

@@ -8,26 +8,26 @@
 
 import RealmSwift
 import UIKit
-class PQEditFileMergeTable: Object {
+public class PQEditFileMergeTable: Object {
     // 草稿箱ID 服务端生成
-    @objc dynamic var draftboxId: String = ""
+    @objc dynamic public var draftboxId: String = ""
     // 上传成功后,服务器返回的素材 ID
-    @objc dynamic var id: Int64 = 0
+    @objc dynamic public var id: Int64 = 0
 
     // 唯一值
-    @objc dynamic var unid: String = ""
+    @objc dynamic public var unid: String = ""
 
     // 素材的本地路径 为 URI
-    @objc dynamic var fileLocalPath: String = ""
+    @objc dynamic public var fileLocalPath: String = ""
 
     // 素材的外网 URL 我方服务器的外网地址 就是上传后的 URL
-    @objc dynamic var materialUrl: String = ""
-    override required init() {
+    @objc dynamic public var materialUrl: String = ""
+    override public required init() {
         super.init()
         unid = getUniqueId(desc: "PQEditFileMergeTable")
     }
 
-    override static func primaryKey() -> String? {
+    override static public func primaryKey() -> String? {
         return "unid"
     }
 }

+ 7 - 7
BFFramework/Classes/PModels/editDarftModels/PQEditMaterialDurationFitModel.swift

@@ -10,20 +10,20 @@ import Foundation
 import ObjectMapper
 import RealmSwift
 
-class PQEditmaterialDurationFitModel: PQEditBaseModel {
-    @objc dynamic var fitType: String = ""
-    @objc dynamic var multipleValue: Float = 0.0
-    @objc dynamic var loopValue: Int = 0
+public class PQEditmaterialDurationFitModel: PQEditBaseModel {
+    @objc dynamic public var fitType: String = ""
+    @objc dynamic public var multipleValue: Float = 0.0
+    @objc dynamic public var loopValue: Int = 0
 
-    required convenience init?(map _: Map) {
+    required convenience  public init?(map _: Map) {
         self.init()
     }
 
-    required init() {
+    required  public init() {
         super.init()
     }
 
-    override func mapping(map: Map) {
+    public override  func mapping(map: Map) {
         fitType <- map["fitType"]
         multipleValue <- map["multipleValue"]
         loopValue <- map["loopValue"]

+ 5 - 5
BFFramework/Classes/PModels/editDarftModels/PQEditMaterialEffectModel.swift

@@ -14,15 +14,15 @@
 import Foundation
 import ObjectMapper
 import RealmSwift
-class PQEditMaterialEffectModel: PQEditBaseModel {
-    @objc dynamic var type: String = ""
-    @objc dynamic var params: String = ""
+public class PQEditMaterialEffectModel: PQEditBaseModel {
+    @objc dynamic public var type: String = ""
+    @objc dynamic public var params: String = ""
 
-    required convenience init?(map _: Map) {
+    required convenience public init?(map _: Map) {
         self.init()
     }
 
-    override func mapping(map: Map) {
+    public override func mapping(map: Map) {
         type <- map["type"]
         params <- map["params"]
     }

+ 3 - 3
BFFramework/Classes/PModels/editDarftModels/PQEditMaterialLayerModel.swift

@@ -15,13 +15,13 @@ import Foundation
 import ObjectMapper
 import RealmSwift
 
-class PQEditMaterialLayerModel: PQEditBaseModel {
-    @objc dynamic var layer: Int = 0
+public class PQEditMaterialLayerModel: PQEditBaseModel {
+    @objc dynamic public var layer: Int = 0
     required convenience init?(map _: Map) {
         self.init()
     }
 
-    override func mapping(map: Map) {
+    public   override func mapping(map: Map) {
         layer <- map["layer"]
     }
 }

+ 6 - 6
BFFramework/Classes/PModels/editDarftModels/PQEditMaterialPositionModel.swift

@@ -10,17 +10,17 @@ import ObjectMapper
 import RealmSwift
 import UIKit
 
-class PQEditMaterialPositionModel: PQEditBaseModel {
-    @objc dynamic var x: Int = 0
-    @objc dynamic var y: Int = 0
-    @objc dynamic var width: Int = 0
-    @objc dynamic var height: Int = 0
+public class PQEditMaterialPositionModel: PQEditBaseModel {
+    @objc dynamic public var x: Int = 0
+    @objc dynamic public var y: Int = 0
+    @objc dynamic public var width: Int = 0
+    @objc dynamic public var height: Int = 0
 
     required convenience init?(map _: Map) {
         self.init()
     }
 
-    override func mapping(map: Map) {
+    public  override func mapping(map: Map) {
         x <- map["x"]
         y <- map["y"]
         width <- map["width"]

+ 8 - 8
BFFramework/Classes/PModels/editDarftModels/PQEditMaterialSizeClipModel.swift

@@ -9,19 +9,19 @@
 import ObjectMapper
 import RealmSwift
 
-class PQEditMaterialSizeClipModel: PQEditBaseModel {
-    @objc dynamic var x: Int = 0
-    @objc dynamic var y: Int = 0
-    @objc dynamic var width: Int = 0
-    @objc dynamic var height: Int = 0
-    @objc dynamic var scale: Int = 0
-    @objc dynamic var rotate: Int = 0
+public class PQEditMaterialSizeClipModel: PQEditBaseModel {
+    @objc dynamic public var x: Int = 0
+    @objc dynamic public var y: Int = 0
+    @objc dynamic public var width: Int = 0
+    @objc dynamic public var height: Int = 0
+    @objc dynamic public var scale: Int = 0
+    @objc dynamic public var rotate: Int = 0
 
     required convenience init?(map _: Map) {
         self.init()
     }
 
-    override func mapping(map: Map) {
+    public  override func mapping(map: Map) {
         x <- map["x"]
         y <- map["y"]
         width <- map["width"]

+ 16 - 16
BFFramework/Classes/PModels/editDarftModels/PQEditProduceVoiceConfigModel.swift

@@ -11,37 +11,37 @@ import ObjectMapper
 import RealmSwift
 import UIKit
 
-class PQEditProduceVoiceConfigModel: PQEditBaseModel {
+public class PQEditProduceVoiceConfigModel: PQEditBaseModel {
     //阿里云参数
-    @objc dynamic var channel: String = ""
-    @objc dynamic var voice: String = ""
-    @objc dynamic var volume: Int = 100
-    @objc dynamic var speechRate: Int = 0
-    @objc dynamic var pitchRate: Int = 0
+    @objc dynamic public var channel: String = ""
+    @objc dynamic public var voice: String = ""
+    @objc dynamic public var volume: Int = 100
+    @objc dynamic public var speechRate: Int = 0
+    @objc dynamic public var pitchRate: Int = 0
     
     //深音科技
-    @objc dynamic var deepsoundVolume: String = "" // deepsound音量(取值范围0.0-1.0,默认1.0表示最大音量)
-    @objc dynamic var deepsoundSpeechRate: String = ""
-    @objc dynamic var deepsoundPitchRate: String = ""
+    @objc dynamic public var deepsoundVolume: String = "" // deepsound音量(取值范围0.0-1.0,默认1.0表示最大音量)
+    @objc dynamic public var deepsoundSpeechRate: String = ""
+    @objc dynamic public var deepsoundPitchRate: String = ""
     
     //微软语音参数
     // 音量,以从 0.0 到 150.0(从最安静到最大声), 默认值为 100.0。
-    @objc dynamic var azureVolume:String = "100"
+    @objc dynamic public var azureVolume:String = "100"
     // 语速,取值为0.00-3.00,默认为1.00,如果值为 1,则速率不会变化。 如果值为 0.5,则速率会减慢一半。 如果值为 3,则速率为三倍。
-    @objc dynamic var azureSpeechRate:String = "1.00"
+    @objc dynamic public var azureSpeechRate:String = "1.00"
     // 语调,取值为-50%-50%,默认为0%
-    @objc dynamic var azurePitchRate:String = "0%"
+    @objc dynamic public var azurePitchRate:String = "0%"
     // 语音风格,默认为 general
-    @objc dynamic var azureStyle:String = "general"
+    @objc dynamic public var azureStyle:String = "general"
     // 句末停顿时间,默认500ms
-    @objc dynamic var azureEndBreakTime:String = "0ms"
+    @objc dynamic public var azureEndBreakTime:String = "0ms"
     
 
-    required convenience init?(map _: Map) {
+    required convenience public init?(map _: Map) {
         self.init()
     }
 
-    override func mapping(map: Map) {
+    public  override func mapping(map: Map) {
         channel <- map["channel"]
         voice <- map["voice"]
         volume <- map["volume"]

+ 17 - 17
BFFramework/Classes/PModels/editDarftModels/PQEditProjectModel.swift

@@ -26,44 +26,44 @@
 import Foundation
 import ObjectMapper
 import RealmSwift
-class PQEditProjectModel: PQEditBaseModel {
+public class PQEditProjectModel: PQEditBaseModel {
     // 大 JSON 结构化数据
-    @objc dynamic var sData: PQEditSdataModel?
-    @objc dynamic var isSelected: Bool = false // 是否选中
-    @objc var coverUrl: String? // 图片
-    @objc dynamic var dataVersionCode: Int = 0 // 数据版本号
-    var cacheDataVersionCode: Int = -1 // 缓存版本号
-    @objc var draftboxId: String = "" // 草稿id
-    @objc dynamic var projectId: String = "" // 项目id
-    @objc dynamic var title: String = "" // 标题
-    @objc dynamic var updateTimestamp: Int = 0 { // 更新时间
+    @objc dynamic public var sData: PQEditSdataModel?
+    @objc dynamic public var isSelected: Bool = false // 是否选中
+    @objc public var coverUrl: String? // 图片
+    @objc dynamic public var dataVersionCode: Int = 0 // 数据版本号
+    public var cacheDataVersionCode: Int = -1 // 缓存版本号
+    @objc public var draftboxId: String = "" // 草稿id
+    @objc dynamic public var projectId: String = "" // 项目id
+    @objc dynamic public var title: String = "" // 标题
+    @objc dynamic public var updateTimestamp: Int = 0 { // 更新时间
         didSet {
             updateTimestampDes = timeIntervalToDateString(timeInterval: TimeInterval(updateTimestamp / 1000))
         }
     }
 
-    var updateTimestampDes: String? // 更新时间描述
-    @objc var duration: Float64 = 0 { // 时长
+    public var updateTimestampDes: String? // 更新时间描述
+    @objc public var duration: Float64 = 0 { // 时长
         didSet {
             durationDes = duration.formatDurationToHMS()
         }
     }
 
-    var durationDes: String = "00:00" // 时长描述
-    required convenience init?(map _: Map) {
+    public var durationDes: String = "00:00" // 时长描述
+    required convenience public  init?(map _: Map) {
         self.init()
     }
 
-    required init() {
+    required public init() {
         super.init()
         sData = PQEditSdataModel()
     }
 
-    override static func primaryKey() -> String? {
+    public override static func primaryKey() -> String? {
         return "draftboxId"
     }
 
-    override func mapping(map: Map) {
+    public  override func mapping(map: Map) {
         sData <- map["sData"]
         coverUrl <- map["coverUrl"]
         dataVersionCode <- map["dataVersionCode"]

+ 13 - 13
BFFramework/Classes/PModels/editDarftModels/PQEditSdataModel.swift

@@ -9,28 +9,28 @@
 import ObjectMapper
 import RealmSwift
 import UIKit
-class PQEditSdataModel: PQEditBaseModel {
-    @objc dynamic var systemParam: PQEditSystemParamModel?
-    @objc dynamic var videoMetaData: PQEditVideoMetaDataModel?
-    var sections: List<PQEditSectionModel> = List()
+public class PQEditSdataModel: PQEditBaseModel {
+    @objc dynamic public var systemParam: PQEditSystemParamModel?
+    @objc dynamic public var videoMetaData: PQEditVideoMetaDataModel?
+    public var sections: List<PQEditSectionModel> = List()
 
-    required convenience init?(map _: Map) {
+    required convenience public init?(map _: Map) {
         self.init()
     }
 
-    required init() {
+    required public  init() {
         super.init()
         systemParam = PQEditSystemParamModel()
         videoMetaData = PQEditVideoMetaDataModel()
     }
 
-    override func mapping(map: Map) {
+    public  override func mapping(map: Map) {
         systemParam <- map["systemParam"]
         videoMetaData <- map["videoMetaData"]
         sections <- (map["sections"], PQListTransform<PQEditSectionModel>())
     }
 
-    func deleteBGM() {
+   public  func deleteBGM() {
         var selectBGMIndex: Int = -1
         for (i, section) in sections.enumerated() {
             if section.sectionType == "global" {
@@ -44,7 +44,7 @@ class PQEditSdataModel: PQEditBaseModel {
     }
 
     // 添加背景音乐
-    func addBGM(audioMix: PQVoiceModel) {
+   public  func addBGM(audioMix: PQVoiceModel) {
         // 1,如果已经选择过就先删除一次
         deleteBGM()
 
@@ -99,7 +99,7 @@ class PQEditSdataModel: PQEditBaseModel {
     }
 
     // 取背景音乐的 session
-    func getBGMSession() -> PQEditSectionModel? {
+   public  func getBGMSession() -> PQEditSectionModel? {
         var BGMSession: PQEditSectionModel?
         if sections.count > 0 {
             for section in sections {
@@ -113,7 +113,7 @@ class PQEditSdataModel: PQEditBaseModel {
     }
 
     // 取有效素材的段落剔除 global BGM 的 session  , type is normal
-    func getVoisonSessions() -> List<PQEditSectionModel> {
+   public  func getVoisonSessions() -> List<PQEditSectionModel> {
         let voisonArray = List<PQEditSectionModel>.init()
         for section in sections {
             if section.sectionType == "normal" {
@@ -125,11 +125,11 @@ class PQEditSdataModel: PQEditBaseModel {
     }
 
     ///
-    func deleteDisableSaveMaterials() {}
+   public  func deleteDisableSaveMaterials() {}
 
     // 删除无效的素材
     /// - Parameter isSaveDraft: 只能在保存项目API 调用前使用COPY 的 sdata 设TRUE ,恢复项目时设置 false
-    func deleteDisableMaterials(isSaveDraft: Bool = false) {
+   public  func deleteDisableMaterials(isSaveDraft: Bool = false) {
         for section in sections {
             // 视觉素材sr
             let visionTrackMaterialsTemp = List<PQEditVisionTrackMaterialsModel>.init()

+ 6 - 6
BFFramework/Classes/PModels/editDarftModels/PQEditSectionExtDataModel.swift

@@ -14,16 +14,16 @@
 import Foundation
 import ObjectMapper
 import RealmSwift
-class PQEditSectionExtDataModel: PQEditBaseModel {
-    @objc dynamic var audioDuration: Float64 = 0
-    @objc dynamic var coverUrl: String = ""
-    @objc dynamic var isSpeech: Bool = false
+public class PQEditSectionExtDataModel: PQEditBaseModel {
+    @objc dynamic public var audioDuration: Float64 = 0
+    @objc dynamic public var coverUrl: String = ""
+    @objc dynamic public var isSpeech: Bool = false
 
-    required convenience init?(map _: Map) {
+    required convenience public init?(map _: Map) {
         self.init()
     }
 
-    override func mapping(map: Map) {
+    public  override func mapping(map: Map) {
         audioDuration <- (map["audioDuration"], timeTransform)
         coverUrl <- map["coverUrl"]
         isSpeech <- map["isSpeech"]

+ 38 - 38
BFFramework/Classes/PModels/editDarftModels/PQEditSectionModel.swift

@@ -15,55 +15,55 @@ import Foundation
 import AVFoundation
 import ObjectMapper
 import RealmSwift
-class PQEditSectionModel: PQEditBaseModel {
-    @objc dynamic var addAutoEffect: Int = 0
-    @objc dynamic var sectionDuration: Float64 = 0 {
+public class PQEditSectionModel: PQEditBaseModel {
+    @objc dynamic public var addAutoEffect: Int = 0
+    @objc dynamic public var sectionDuration: Float64 = 0 {
         didSet {
             BFLog(message: "sectionDuration == \(sectionDuration)")
         }
     }
 
-    @objc dynamic var projectTimelineIn: Float64 = 0
-    @objc dynamic var projectTimelineOut: Float64 = 0
+    @objc dynamic public var projectTimelineIn: Float64 = 0
+    @objc dynamic public var projectTimelineOut: Float64 = 0
     // 段落序号globle 全是0  nomoal 从1开始++ XXXXXX(已经通过TransformOf处理过,代码中使用时都是从0开始就 OK )
-    @objc dynamic var sectionIndex: Int = 0 {
+    @objc dynamic public var sectionIndex: Int = 0 {
         didSet {
             BFLog(message: "sectionIndex is \(sectionIndex)")
         }
     }
 
-    @objc dynamic var sectionText: String = "" {
+    @objc dynamic public var sectionText: String = "" {
         didSet {
           BFLog(message: "文字发生了改变")
   
         }
     }
 
-    @objc dynamic var sectionTimeline: PQEditSectionTimelineModel? {
+    @objc dynamic public var sectionTimeline: PQEditSectionTimelineModel? {
         didSet {}
     }
 
-    @objc dynamic var sectionType: String = "normal"
+    @objc dynamic public var sectionType: String = "normal"
 
     // pc
-    @objc dynamic var sectionExtData: PQEditSectionExtDataModel?
+    @objc dynamic public var sectionExtData: PQEditSectionExtDataModel?
 
     // add by ak 业务逻辑层要使用的属性 -----------
-    var textIsChane: Bool = false
+    public var textIsChane: Bool = false
 
     // 是否为选中状态 选中状态有三种,0未选中状态 1 设置状态 2,播放状态
-    var isSelected: Int = 0
+    public var isSelected: Int = 0
     // 是否为可设置状态
-    var enabledSetting: Bool = true
+    public var enabledSetting: Bool = true
     // 是否可添加段
-    var enableAdd: Bool = true
+    public var enableAdd: Bool = true
     // 当前段选择的发音人数据
-    var selectVoice: PQVoiceModel?
+    public var selectVoice: PQVoiceModel?
 
     // 每一段的封面
-    var coverImage: UIImage?
+    public var coverImage: UIImage?
     // 声音文件地址
-    var audioFilePath: String = "" {
+    public var audioFilePath: String = "" {
         didSet {
             if (sectionTimeline?.visionTrack?.getEnableVisionTrackMaterials().count ?? 0) > 0 {
                 sectionDuration = allStickerAptDuration()
@@ -77,41 +77,41 @@ class PQEditSectionModel: PQEditBaseModel {
     }
 
     // 谁长用谁功能,如果视觉长会拼接空音频文件,这个是拼接后的地址
-    var mixEmptyAuidoFilePath: String = ""
+    public var mixEmptyAuidoFilePath: String = ""
 
-    var subTitles = List<PQEditSubTitleModel>()
+    public var subTitles = List<PQEditSubTitleModel>()
 
     // 背景音乐数据(可能每一段都会有背景音)
     public var bgmData: PQVoiceModel?
 
     // 录音人头像,在恢复项目时会有值
-    var audioAvatarUrl: String = ""
+    public var audioAvatarUrl: String = ""
 
     // MARK: - 录音相关属性,不保存sadata 不入库
 
     // 保存每一个段落所有分段的录音记录
-    var cacheRecorderFiles: [URL] = Array()
+    public var cacheRecorderFiles: [URL] = Array()
     // 录制的小段数
-    var cacheRecorderCount: Int = 0
+    public var cacheRecorderCount: Int = 0
     // 合并后的地址 并已经转成 MP3  mp3 file path
-    var compliteMP3AudioFile: String = ""
+    public var compliteMP3AudioFile: String = ""
     // 录音声音分贝值
-    var audioPowers: [Int] = Array()
+    public var audioPowers: [Int] = Array()
     
     //是否正在文字转换中。。
-    var isConverding: Bool = false
+    public var isConverding: Bool = false
 
-    required convenience init?(map _: Map) {
+    required convenience public init?(map _: Map) {
         self.init()
     }
 
-    required init() {
+    required public init() {
         super.init()
 
         sectionTimeline = PQEditSectionTimelineModel()
     }
 
-    override func mapping(map: Map) {
+    public override func mapping(map: Map) {
         addAutoEffect <- map["addAutoEffect"]
         sectionDuration <- (map["duration"], timeTransform)
         projectTimelineIn <- (map["projectTimelineIn"], timeTransform)
@@ -137,7 +137,7 @@ class PQEditSectionModel: PQEditBaseModel {
     }
 
     // 计算所有贴纸的时间 aptDuration 已经是根据有无配音计算好的 可直接使用
-    func allStickerAptDuration() -> Float64 {
+   public  func allStickerAptDuration() -> Float64 {
         var stickerAptDuration: Float64 = 0
         if sectionTimeline?.visionTrack?.getEnableVisionTrackMaterials().count ?? 0 > 0 {
             for sticker in (sectionTimeline!.visionTrack?.getEnableVisionTrackMaterials())! {
@@ -148,7 +148,7 @@ class PQEditSectionModel: PQEditBaseModel {
     }
 
     // 所有内贴纸的时长未4舍5入的
-    func allStickerAptDurationNoRound() -> Float64 {
+   public  func allStickerAptDurationNoRound() -> Float64 {
         var stickerAptDuration: Float64 = 0
         if sectionTimeline?.visionTrack?.getEnableVisionTrackMaterials().count ?? 0 > 0 {
             for sticker in (sectionTimeline!.visionTrack?.getEnableVisionTrackMaterials())! {
@@ -159,14 +159,14 @@ class PQEditSectionModel: PQEditBaseModel {
     }
 
     /// 是否已经设置过一个发音人,voice 会在选择时给值,取消选择时清空 init
-    func haveSelectVoice() -> Bool {
+   public  func haveSelectVoice() -> Bool {
         BFLog(message: "voice?.avatarUrl \(String(describing: selectVoice?.avatarUrl))")
         return selectVoice?.avatarUrl.count ?? 0 > 0
     }
 
     /// 判断素材是否下载完成,如果本地址没有,就应该是有问题或没有下载完成
     /// - Returns: <#description#>
-    func matrialIsDownloaded() -> Bool {
+   public  func matrialIsDownloaded() -> Bool {
         var isDownloaded: Bool = true // 素材是否下载完成
         for sticker in (sectionTimeline!.visionTrack?.getEnableVisionTrackMaterials())! {
             if sticker.locationPath.count == 0 {
@@ -178,7 +178,7 @@ class PQEditSectionModel: PQEditBaseModel {
     }
 
     //  添加字幕信息
-    func addSubtitleMatraislInfo(subtitls: List<PQEditVisionTrackMaterialsModel>) {
+   public  func addSubtitleMatraislInfo(subtitls: List<PQEditVisionTrackMaterialsModel>) {
         deleteSubtitleMatraislInfo()
 
         // 2,添加新的一组字幕
@@ -186,14 +186,14 @@ class PQEditSectionModel: PQEditBaseModel {
     }
 
     // 删除字幕
-    func deleteSubtitleMatraislInfo() {
+   public  func deleteSubtitleMatraislInfo() {
         // 1,确保每一个段落只有一组字幕 先移除老的一组字幕如果有, 只设置有效的素材
         let otherEnableVision = sectionTimeline!.visionTrack?.getEnableVisionTrackMaterials()
         sectionTimeline!.visionTrack?.visionTrackMaterials = otherEnableVision ?? List<PQEditVisionTrackMaterialsModel>.init()
     }
 
     // 判断当前段落是否有有效素材,1, 有视觉素材,2,有声音数据1)录音2)配音-- audioFilePath (如果是空的声音不算) 3,字幕 1)输入的的 2)录音转的
-    func haveRes() -> Bool {
+   public  func haveRes() -> Bool {
         var have: Bool = false
         if subTitles.count > 0 || (sectionTimeline?.visionTrack?.getEnableVisionTrackMaterials().count ?? 0) > 0 || (audioFilePath.count > 0 && !audioFilePath.contains("empty")) || sectionTimeline?.visionTrack?.getSubtitleMatraislInfo().count ?? 0 > 0 || sectionText.count > 0 {
             have = true
@@ -209,7 +209,7 @@ class PQEditSectionModel: PQEditBaseModel {
      这个情况 P1 还没有生成空的文件会导致所有时长不对,贴纸在选择加入的时候已经处理,这里只处理这种 PART 的空声音文件
 
      */
-    func generateEmptyAuido() {
+   public  func generateEmptyAuido() {
         var stickerTotalDuration: Float64 = 0
         // 没有选择发声音人,只有纯视觉的情况
         if sectionText.count == 0, audioFilePath.count == 0, mixEmptyAuidoFilePath.count == 0 {
@@ -242,7 +242,7 @@ class PQEditSectionModel: PQEditBaseModel {
     }
 
     // 生成输入状态的可使用的文字信息
-    func getInputSubtitle() -> String {
+   public  func getInputSubtitle() -> String {
         var text: String = ""
         if sectionTimeline?.visionTrack?.getSubtitleMatraislInfo() != nil {
             for subTitleModel in sectionTimeline!.visionTrack!.getSubtitleMatraislInfo() {
@@ -255,7 +255,7 @@ class PQEditSectionModel: PQEditBaseModel {
     }
 
     /// 删除录音的缓存 文件,在删除段落时调用
-    func deleteCacheAudioFiles(isDeleteMergeFile: Bool = false) {
+   public  func deleteCacheAudioFiles(isDeleteMergeFile: Bool = false) {
         let fileManger = FileManager.default
         // 删除临时音频文件数据
         // file:///var/mobile/Containers/Data/Application/176BE83D-F514-49EA-8710-8A077CFCFA72/Documents/Resource/ExportAudios/recorder_1614170151.815164_noise.wav

+ 8 - 8
BFFramework/Classes/PModels/editDarftModels/PQEditSectionTimelineModel.swift

@@ -15,27 +15,27 @@ import Foundation
 import ObjectMapper
 import RealmSwift
 
-class PQEditSectionTimelineModel: PQEditBaseModel {
-    @objc dynamic var audioTrack: PQEditAudioTrackModel?
-    @objc dynamic var visionTrack: PQEditVisionTrackModel?
+public class PQEditSectionTimelineModel: PQEditBaseModel {
+    @objc dynamic public var audioTrack: PQEditAudioTrackModel?
+    @objc dynamic public var visionTrack: PQEditVisionTrackModel?
 
-    required convenience init?(map _: Map) {
+    required convenience public init?(map _: Map) {
         self.init()
     }
 
-    required init() {
+    required public init() {
         super.init()
         audioTrack = PQEditAudioTrackModel()
         visionTrack = PQEditVisionTrackModel()
     }
 
-    override func mapping(map: Map) {
+    public  override func mapping(map: Map) {
         audioTrack <- map["audioTrack"]
         visionTrack <- map["visionTrack"]
     }
 
     // 添加发声音人数据
-    func addVoice(audioMix: PQVoiceModel) {
+   public  func addVoice(audioMix: PQVoiceModel) {
         deleteVoice()
         BFLog(message: "添加发声音人数据 \(audioMix.voice)")
         let audioTrackMaterial = PQEditAudioTrackMaterialModel()
@@ -64,7 +64,7 @@ class PQEditSectionTimelineModel: PQEditBaseModel {
     }
 
     // 删除发声音人,目前只有一个,配音
-    func deleteVoice() {
+   public  func deleteVoice() {
         BFLog(message: "删除一个发声音人")
         audioTrack?.audioTrackMaterials.removeAll()
     }

+ 8 - 8
BFFramework/Classes/PModels/editDarftModels/PQEditSubTitleModel.swift

@@ -8,28 +8,28 @@
 // 字幕信息以每一段为单位,都会有一个这样的信息
 import ObjectMapper
 import RealmSwift
-class PQEditSubTitleModel: PQEditBaseModel {
+open class PQEditSubTitleModel: PQEditBaseModel {
     // 开始时间
-    var timelineIn: Float64 = 0
+    public var timelineIn: Float64 = 0
     // 结束时间
-    var timelineOut: Float64 = 0
+    public var timelineOut: Float64 = 0
     // 显示每一句字幕
-    var text: String = ""
-    required init() {
+    public var text: String = ""
+    required public init() {
         super.init()
     }
 
-    required convenience init?(map _: Map) {
+    required convenience public init?(map _: Map) {
         self.init()
     }
 
-    override func mapping(map: Map) {
+    public  override func mapping(map: Map) {
         timelineIn <- map["timelineIn"]
         timelineOut <- map["timelineOut"]
         text <- map["text"]
     }
 
-    init(jsonDict: [String: Any]) {
+    public init(jsonDict: [String: Any]) {
         super.init()
         if jsonDict.keys.contains("beginTime") {
             timelineIn = Float64("\(jsonDict["beginTime"] ?? "0")") ?? 0

+ 10 - 10
BFFramework/Classes/PModels/editDarftModels/PQEditSubtitleInfoModel.swift

@@ -9,9 +9,9 @@
 import ObjectMapper
 import RealmSwift
 import UIKit
-class PQEditSubtitleInfoModel: PQEditBaseModel {
-    @objc dynamic var layoutType: String = ""
-    @objc dynamic var text: String = "" {
+public class PQEditSubtitleInfoModel: PQEditBaseModel {
+    @objc dynamic public var layoutType: String = ""
+    @objc dynamic public var text: String = "" {
         didSet {
             itemHeigth = sizeWithText(text: text, font: UIFont.systemFont(ofSize: 17), size: CGSize(width: cScreenWidth - cDefaultMargin * 9, height: CGFloat.greatestFiniteMagnitude)).height
             if itemHeigth < cDefaultMargin * 2 {
@@ -21,22 +21,22 @@ class PQEditSubtitleInfoModel: PQEditBaseModel {
         }
     }
 
-    @objc dynamic var font: String = ""
-    @objc dynamic var fontColor: String = ""
-    @objc dynamic var bgColor: String = ""
-    @objc dynamic var fontSize: Int = 0
+    @objc dynamic public var font: String = ""
+    @objc dynamic public var fontColor: String = ""
+    @objc dynamic public var bgColor: String = ""
+    @objc dynamic public var fontSize: Int = 0
     // cell高度
-    var itemHeigth: CGFloat = 20
+    public var itemHeigth: CGFloat = 20
     required convenience init?(map _: Map) {
         self.init()
     }
 
     // 过滤itemHeigth
-    override class func ignoredProperties() -> [String] {
+    public override class func ignoredProperties() -> [String] {
         return ["itemHeigth"]
     }
 
-    override func mapping(map: Map) {
+    public  override func mapping(map: Map) {
         layoutType <- map["layoutType"]
         text <- map["text"]
         font <- map["font"]

+ 5 - 5
BFFramework/Classes/PModels/editDarftModels/PQEditSystemParamModel.swift

@@ -14,19 +14,19 @@
 import Foundation
 import ObjectMapper
 import RealmSwift
-class PQEditSystemParamModel: PQEditBaseModel {
+public class PQEditSystemParamModel: PQEditBaseModel {
     // 版本号,注意:这里是视频结构化数据格式版本,当前版本 2
-    @objc dynamic var versionCode: Int = 2
+    @objc dynamic public var versionCode: Int = 2
     // 平台:ios/android/pc
-    @objc dynamic var platform: String = "ios"
+    @objc dynamic public var platform: String = "ios"
     // 产品代号
-    @objc dynamic var appType: Int = 13
+    @objc dynamic public var appType: Int = 13
 
     required convenience init?(map _: Map) {
         self.init()
     }
 
-    override func mapping(map: Map) {
+    public  override func mapping(map: Map) {
         versionCode <- map["versionCode"]
         platform <- map["platform"]
         appType <- map["appType"]

+ 10 - 10
BFFramework/Classes/PModels/editDarftModels/PQEditVideoMetaDataModel.swift

@@ -14,26 +14,26 @@
 import Foundation
 import ObjectMapper
 import RealmSwift
-class PQEditVideoMetaDataModel: PQEditBaseModel {
+public class PQEditVideoMetaDataModel: PQEditBaseModel {
     // 是否添加片尾(1:是,0:否)
-    @objc dynamic var appendTailStatus: Int = 0
-    @objc dynamic var coverUrl: String = ""
-    @objc dynamic var duration: Float64 = 0
-    @objc dynamic var title: String = ""
+    @objc dynamic public var appendTailStatus: Int = 0
+    @objc dynamic public var coverUrl: String = ""
+    @objc dynamic public var duration: Float64 = 0
+    @objc dynamic public var title: String = ""
     // 输出视频的最终画布宽高,和canvasType 保持一致,只有在用户操作时设置时,其它地方都是只读
-    @objc dynamic var videoHeight: Int = 1080
-    @objc dynamic var videoWidth: Int = 1080
+    @objc dynamic public var videoHeight: Int = 1080
+    @objc dynamic public var videoWidth: Int = 1080
     // 画布类型(1:原始,2:9比16,3:1比1,4:16比9)
-    @objc dynamic var canvasType: Int = 1
+    @objc dynamic public var canvasType: Int = 1
 
     // 素材文件总大小
-    @objc dynamic var materialTotalSize: Float64 = 0
+    @objc dynamic public var materialTotalSize: Float64 = 0
 
     required convenience init?(map _: Map) {
         self.init()
     }
 
-    override func mapping(map: Map) {
+    public  override func mapping(map: Map) {
         appendTailStatus <- map["appendTailSftatus"]
         coverUrl <- map["coverUrl"]
         duration <- (map["duration"], timeTransform)

+ 51 - 51
BFFramework/Classes/PModels/editDarftModels/PQEditVisionTrackMaterialsModel.swift

@@ -19,50 +19,50 @@ import Photos
 import ObjectMapper
 import RealmSwift
 
-class PQEditVisionTrackMaterialsModel: PQEditBaseModel {
-    @objc dynamic var width: Float = 0
-    @objc dynamic var height: Float = 0
-    @objc var itemWidth: Float = 0
-    @objc var itemHeight: Float = 0
+public class PQEditVisionTrackMaterialsModel: PQEditBaseModel {
+    @objc dynamic public var width: Float = 0
+    @objc dynamic public var height: Float = 0
+    @objc public var itemWidth: Float = 0
+    @objc public var itemHeight: Float = 0
     // 搜索素材来源
-    @objc dynamic var sourceType: Int = 0
-    @objc dynamic var type: String = ""
-    @objc dynamic var canvasFillType: String = ""
+    @objc dynamic public var sourceType: Int = 0
+    @objc dynamic public var type: String = ""
+    @objc dynamic public var canvasFillType: String = ""
 
-    @objc dynamic var materialType: String = ""
+    @objc dynamic public var materialType: String = ""
 
     // 选择素材的时候会给值,这里是素材的真实时长
-    @objc dynamic var duration: Float64 = 0
+    @objc dynamic public var duration: Float64 = 0
     // 公式计算出来的逻辑显示时长
-    @objc var aptDuration: Float64 = 0
+    @objc public var aptDuration: Float64 = 0
 
-    @objc dynamic var id: Int64 = 0
-    @objc dynamic var materialLayer: PQEditMaterialLayerModel?
-    @objc dynamic var materialEffect: PQEditMaterialEffectModel?
+    @objc dynamic public var id: Int64 = 0
+    @objc dynamic public var materialLayer: PQEditMaterialLayerModel?
+    @objc dynamic public var materialEffect: PQEditMaterialEffectModel?
     
     //整体时间线中显示的开始和结束时间 (showtime) e.g. 10s - 20s
-    @objc dynamic var timelineIn: Float64 = 0
-    @objc dynamic var timelineOut: Float64 = 0
+    @objc dynamic public var timelineIn: Float64 = 0
+    @objc dynamic public var timelineOut: Float64 = 0
     //取原视频素材的截取时间(cliptime) e.g.  5s - 10s
-    @objc dynamic var model_in: Float64 = 0
-    @objc dynamic var out: Float64 = 0
+    @objc dynamic public var model_in: Float64 = 0
+    @objc dynamic public var out: Float64 = 0
     
-    @objc dynamic var volumeGain: Float64 = 0
-    @objc dynamic var subtitleInfo: PQEditSubtitleInfoModel?
-    @objc dynamic var materialDurationFit: PQEditmaterialDurationFitModel?
-    @objc dynamic var materialSizeClip: PQEditMaterialSizeClipModel?
-    @objc dynamic var materialPosition: PQEditMaterialPositionModel?
+    @objc dynamic public var volumeGain: Float64 = 0
+    @objc dynamic public var subtitleInfo: PQEditSubtitleInfoModel?
+    @objc dynamic public var materialDurationFit: PQEditmaterialDurationFitModel?
+    @objc dynamic public var materialSizeClip: PQEditMaterialSizeClipModel?
+    @objc dynamic public var materialPosition: PQEditMaterialPositionModel?
 
     // -----------------------地址相关属性 本地地址都是 URI
     // 素材的外网 URL 我方服务器的外网地址 ,客户端不会赋值 会在 getDraftInfo API 中返回,是服务器自动拼接生成的。XXXXXX 素材封面都是根据这个地址现取的
-    @objc dynamic var materialUrl: String = ""
+    @objc dynamic public var materialUrl: String = ""
 
     // 这个是给网络素材库用的下载地址,其它地方都使用 materialUrl
-    var netResUrl: String = ""
-    var netResCoverImageURL: String?
+    public var netResUrl: String = ""
+    public var netResCoverImageURL: String?
 
     // 文件本地地址 URI
-    @objc dynamic var locationPath: String = "" {
+    @objc dynamic public var locationPath: String = "" {
         didSet {
             BFLog(message: "如果是全路径就有问题XXXX 设置了新值为:locationPath\(locationPath)")
         }
@@ -72,38 +72,38 @@ class PQEditVisionTrackMaterialsModel: PQEditBaseModel {
 
     // add by ak 业务逻辑扩展字段
     // 是否为网络素材本地
-    var isNetworkMaterial: Bool = false
-    var isSelected: Bool = false // 是否被选中
+    public var isNetworkMaterial: Bool = false
+    public var isSelected: Bool = false // 是否被选中
 
     // 这里不会给值了
-    var asset: PHAsset? // 视频资源
-    var PHImageRequestID : Int32?
-    var selectedIndex: Int = 1 // 选中的index
+    public var asset: PHAsset? // 视频资源
+    public var PHImageRequestID : Int32?
+    public var selectedIndex: Int = 1 // 选中的index
     // 图片 和GIF 原数据 这里可能不在使用了
-    var originalData: Data?
+    public var originalData: Data?
     // 封面 仅本地相册显示封面使用
-    var coverImageUI: UIImage?
-    var downloadState: downloadState = .downloading
-    var localSearchId: String? // 本地每次搜索ID
-    var sliceId: String? // 搜索素材视频id
-    var searchId: String? // 每次搜索ID
-    var searchResourceId: String? // 搜索资源ID
-    var outSideChannel: String = ""
-    var outSideVideoId: String = ""
-    var status: inputStatus = .recordSuccess
-
-    required init() {
+    public var coverImageUI: UIImage?
+    public var downloadState: downloadState = .downloading
+    public var localSearchId: String? // 本地每次搜索ID
+    public var sliceId: String? // 搜索素材视频id
+    public var searchId: String? // 每次搜索ID
+    public var searchResourceId: String? // 搜索资源ID
+    public var outSideChannel: String = ""
+    public var outSideVideoId: String = ""
+    public var status: inputStatus = .recordSuccess
+
+   public required init() {
         super.init()
         materialDurationFit = PQEditmaterialDurationFitModel()
         materialSizeClip = PQEditMaterialSizeClipModel()
         materialPosition = PQEditMaterialPositionModel()
     }
 
-    required convenience init?(map _: Map) {
+    required convenience public init?(map _: Map) {
         self.init()
     }
 
-    override func mapping(map: Map) {
+    public  override func mapping(map: Map) {
         width <- map["width"]
         height <- map["height"]
         sourceType <- map["sourceType"]
@@ -137,12 +137,12 @@ class PQEditVisionTrackMaterialsModel: PQEditBaseModel {
     }
 
     // 视频素材有无裁剪过,时长计算就不一样了
-    func videoIsCrop() -> Bool {
+   public  func videoIsCrop() -> Bool {
         return (type == StickerType.VIDEO.rawValue && (model_in != 0 || out != 0))
     }
 
     // 生成默认值
-    func generateDefaultValues() {
+   public  func generateDefaultValues() {
         if materialDurationFit?.fitType.count == 0 {
             materialDurationFit?.fitType = adapterMode.loopAuto.rawValue
         }
@@ -154,7 +154,7 @@ class PQEditVisionTrackMaterialsModel: PQEditBaseModel {
 
     /// 初始化
     /// - Parameter jsonDict: <#jsonDict description#>
-    convenience init(jsonDict: [String: Any]) {
+   public convenience init(jsonDict: [String: Any]) {
         self.init()
         if jsonDict.keys.contains("width") {
             width = Float(CGFloat(Double("\(jsonDict["width"] ?? "")") ?? 0))
@@ -206,7 +206,7 @@ class PQEditVisionTrackMaterialsModel: PQEditBaseModel {
     /// 素材是否相等
     /// - Parameter newMaterial: <#newMaterial description#>
     /// - Returns: <#description#>
-    func isEqualMaterial(newMaterial: PQEditVisionTrackMaterialsModel?) -> Bool {
+   public  func isEqualMaterial(newMaterial: PQEditVisionTrackMaterialsModel?) -> Bool {
         if newMaterial == nil {
             BFLog(message: "素材对比为空:material = \(String(describing: newMaterial))")
             return false
@@ -227,7 +227,7 @@ class PQEditVisionTrackMaterialsModel: PQEditBaseModel {
         return false
     }
 
-    func getCoverImage() -> UIImage? {
+   public  func getCoverImage() -> UIImage? {
         if coverImageUI != nil {
             BFLog(message: "已经有封面了")
             return coverImageUI

+ 10 - 10
BFFramework/Classes/PModels/editDarftModels/PQEditVisionTrackModel.swift

@@ -14,23 +14,23 @@
 import Foundation
 import ObjectMapper
 import RealmSwift
-class PQEditVisionTrackModel: PQEditBaseModel {
-    @objc dynamic var count: Int = 0
-    @objc dynamic var duration: Float64 = 0
-    var visionTrackMaterials = List<PQEditVisionTrackMaterialsModel>.init()
+public class PQEditVisionTrackModel: PQEditBaseModel {
+    @objc dynamic public var count: Int = 0
+    @objc dynamic public var duration: Float64 = 0
+    public var visionTrackMaterials = List<PQEditVisionTrackMaterialsModel>.init()
 
     required convenience init?(map _: Map) {
         self.init()
     }
 
-    override func mapping(map: Map) {
+    public  override func mapping(map: Map) {
         count <- map["count"]
         duration <- (map["duration"], timeTransform)
         visionTrackMaterials <- (map["visionTrackMaterials"], PQListTransform<PQEditVisionTrackMaterialsModel>())
     }
 
     // 取到指定类型素材 "image" "video" "gif"
-    func getEnableVisionTrackMaterials(type:String) -> List<PQEditVisionTrackMaterialsModel> {
+   public  func getEnableVisionTrackMaterials(type:String) -> List<PQEditVisionTrackMaterialsModel> {
         let visionTrackMaterialsTemp = List<PQEditVisionTrackMaterialsModel>.init()
 
 
@@ -43,7 +43,7 @@ class PQEditVisionTrackModel: PQEditBaseModel {
     }
     
     // 取到有效的素材 image video gif
-    func getEnableVisionTrackMaterials() -> List<PQEditVisionTrackMaterialsModel> {
+   public  func getEnableVisionTrackMaterials() -> List<PQEditVisionTrackMaterialsModel> {
         let visionTrackMaterialsTemp = List<PQEditVisionTrackMaterialsModel>.init()
 
 //        BFLog(message: "visionTrackMaterials 总数\(visionTrackMaterials.count)")
@@ -62,7 +62,7 @@ class PQEditVisionTrackModel: PQEditBaseModel {
     /// - Parameters:
     ///   - at: 原位置
     ///   - to: 目标位
-    func updateVisionTrackMaterialsIndex(at: Int, to: Int) {
+   public  func updateVisionTrackMaterialsIndex(at: Int, to: Int) {
         // 如果有字幕缓存字幕,交换位置后在恢复原数组
         let subtitlesTemp = List<PQEditVisionTrackMaterialsModel>.init()
         for subtitle in getSubtitleMatraislInfo() {
@@ -84,7 +84,7 @@ class PQEditVisionTrackModel: PQEditBaseModel {
 
     /// 取录音有效字幕数据
     /// - Returns:
-    func getSubtitleMatraislInfo() -> List<PQEditVisionTrackMaterialsModel> {
+   public  func getSubtitleMatraislInfo() -> List<PQEditVisionTrackMaterialsModel> {
         let visionTrackMaterialsTemp = List<PQEditVisionTrackMaterialsModel>.init()
 
         BFLog(message: "visionTrackMaterials 总数\(visionTrackMaterials.count)")
@@ -99,7 +99,7 @@ class PQEditVisionTrackModel: PQEditBaseModel {
 
     /// 删除某个视觉素材,不包括字幕
     /// - Parameter materialsModel: GIF . IMAGE, video 类型的
-    func deleteMatraislInfo(materialsModel: PQEditVisionTrackMaterialsModel?) {
+   public  func deleteMatraislInfo(materialsModel: PQEditVisionTrackMaterialsModel?) {
         if materialsModel == nil {
             BFLog(message: "要删除的素材为空 操作不成功!")
             return

+ 29 - 29
BFFramework/Classes/PQGPUImage/akfilters/PQMoveInput.swift

@@ -33,20 +33,20 @@ public class PQMoveInput: ImageSource {
         }
     }
 
-    let yuvConversionShader: ShaderProgram
-    let asset: AVAsset
-    let videoComposition: AVVideoComposition?
-    var playAtActualSpeed: Bool
+    public  let yuvConversionShader: ShaderProgram
+    public  let asset: AVAsset
+    public   let videoComposition: AVVideoComposition?
+    public  var playAtActualSpeed: Bool
 
     // Time in the video where it should start.
 //    var requestedStartTime: CMTime?
     //播放器初始播放的开始和结束时间
-    var playeTimeRange:CMTimeRange = CMTimeRange.init(start: .zero, duration: .positiveInfinity)
+    public  var playeTimeRange:CMTimeRange = CMTimeRange.init(start: .zero, duration: .positiveInfinity)
     
     // Time in the video where it started.
-    var startTime: CMTime?
+    public  var startTime: CMTime?
     // Time according to device clock when the video started.
-    var actualStartTime: DispatchTime?
+    public  var actualStartTime: DispatchTime?
     // Last sample time that played. 当前的帧的时间戳,两个驱动方式取值方法不一样
     public private(set) var currentTime: CMTime = .zero
 
@@ -71,54 +71,54 @@ public class PQMoveInput: ImageSource {
         }
     }
 
-    let conditionLock = NSCondition()
-    var readingShouldWait = false
-    var videoInputStatusObserver: NSKeyValueObservation?
-    var audioInputStatusObserver: NSKeyValueObservation?
+    public  let conditionLock = NSCondition()
+    public  var readingShouldWait = false
+    public   var videoInputStatusObserver: NSKeyValueObservation?
+    public var audioInputStatusObserver: NSKeyValueObservation?
 
     public var useRealtimeThreads = false
-    var timebaseInfo = mach_timebase_info_data_t()
+    public  var timebaseInfo = mach_timebase_info_data_t()
 
-    var totalFramesSent = 0
-    var totalFrameTimeDuringCapture: Double = 0.0
+    public  var totalFramesSent = 0
+    public  var totalFrameTimeDuringCapture: Double = 0.0
 
-    var audioSettings: [String: Any]?
+    public  var audioSettings: [String: Any]?
 
-    var movieFramebuffer: Framebuffer?
+    public  var movieFramebuffer: Framebuffer?
     // 播放状态
     public var isPlay: Bool = false
 
     // 时间驱动对象
-    var displayLink: CADisplayLink?
+    public  var displayLink: CADisplayLink?
 
     // 时间驱动时的开始时间,保存currentTime 从0开始
-    var beginTime: CFTimeInterval = 0
+    public  var beginTime: CFTimeInterval = 0
 
-    let audioMix: AVAudioMix?
+    public  let audioMix: AVAudioMix?
 
     // 图片纹理
-    var imageTexture: GLuint = 0
+    public  var imageTexture: GLuint = 0
 
-    var imageFramebuffer: Framebuffer!
+    public  var imageFramebuffer: Framebuffer!
 
-    var readerVideoTrackOutput: AVAssetReaderOutput?
-    var readerAudioTrackOutput: AVAssetReaderOutput?
+    public  var readerVideoTrackOutput: AVAssetReaderOutput?
+    public  var readerAudioTrackOutput: AVAssetReaderOutput?
 
-    var assetReader: AVAssetReader!
+    public  var assetReader: AVAssetReader!
  
 
-    var mFreeBuffer: Bool = false
+    public  var mFreeBuffer: Bool = false
 
     // 是否自动暂停 要定到首帧,不是才播放出声音
-    var mAutoPause: Bool = false
+    public  var mAutoPause: Bool = false
 
     /// Use serial queue to ensure that the picture is smooth
-    var seekQueue: DispatchQueue!
+    public  var seekQueue: DispatchQueue!
 
     // 是否为导出模式
-    var mIsExport: Bool = false
+    public   var mIsExport: Bool = false
      // 画布的大小 注意要是偶数 要不在 IOS 13上会有绿边 自动放大到偶数
-    var mShowVidoSize: CGSize = cVideoCannvasSizeOneToOne {
+   public var mShowVidoSize: CGSize = cVideoCannvasSizeOneToOne {
         didSet {
             BFLog(message: "mShowVidoSize is move input  \(mShowVidoSize)")
             do {

+ 18 - 18
BFFramework/Classes/PQGPUImage/akfilters/Tools/PQCompositionExporter.swift

@@ -16,28 +16,28 @@ public class PQCompositionExporter {
 
     public var completion: ((_ url: URL) -> Void)?
 
-    let asset: AVAsset
-    let videoComposition: AVVideoComposition?
-    let audioMix: AVAudioMix?
-    let filters: [ImageProcessingOperation]?
-    var mStickers:[PQEditVisionTrackMaterialsModel]?
-    let animationTool: AVVideoCompositionCoreAnimationTool?
-    let exportURL: URL
-
-    var input: PQMoveInput?
-    var output: MovieOutput?
-
-    let tmpExportURL: URL?
+    public let asset: AVAsset
+    public let videoComposition: AVVideoComposition?
+    public let audioMix: AVAudioMix?
+    public let filters: [ImageProcessingOperation]?
+    public var mStickers:[PQEditVisionTrackMaterialsModel]?
+    public let animationTool: AVVideoCompositionCoreAnimationTool?
+    public let exportURL: URL
+
+    public var input: PQMoveInput?
+    public var output: MovieOutput?
+
+    public let tmpExportURL: URL?
     
-    var usedGroupCreateFilter:Bool = false
+    public var usedGroupCreateFilter:Bool = false
     
     //最后一次显示的 sticker
-    var lastshowSticker:PQEditVisionTrackMaterialsModel?
+    public var lastshowSticker:PQEditVisionTrackMaterialsModel?
     
     //是否显示高斯
-    var showGaussianBlur:Bool = false
+    public var showGaussianBlur:Bool = false
 
-     init(asset: AVAsset, videoComposition: AVVideoComposition? = nil, audioMix: AVAudioMix? = nil, filters: [ImageProcessingOperation]? = nil,stickers:[PQEditVisionTrackMaterialsModel]? = nil, animationTool: AVVideoCompositionCoreAnimationTool? = nil, exportURL: URL) {
+    public init(asset: AVAsset, videoComposition: AVVideoComposition? = nil, audioMix: AVAudioMix? = nil, filters: [ImageProcessingOperation]? = nil,stickers:[PQEditVisionTrackMaterialsModel]? = nil, animationTool: AVVideoCompositionCoreAnimationTool? = nil, exportURL: URL) {
         self.asset = asset
         self.videoComposition = videoComposition
         self.audioMix = audioMix
@@ -136,7 +136,7 @@ public class PQCompositionExporter {
         return true
     }
     
-    func findShowStikcer(currTime:Float64)  {
+   public  func  findShowStikcer(currTime:Float64)  {
          
         if(mStickers?.count ?? 0 == 0){
             BFLog(message: "mStickers data is error")
@@ -240,7 +240,7 @@ public class PQCompositionExporter {
         output?.finishRecording()
     }
 
-    private func handleCaption(for asset: AVAsset) {
+    public func handleCaption(for asset: AVAsset) {
         guard let animationTool = animationTool else { return }
         guard let assetVideoTrack = asset.tracks(withMediaType: .video).first else { return }
         guard let assetAudioTrack = asset.tracks(withMediaType: .audio).first else { return }

+ 1 - 1
BFFramework/Classes/Stuckpoint/Controller/PQStuckPointMaterialController.swift

@@ -264,7 +264,7 @@ public class PQStuckPointMaterialController: PQBaseViewController {
         }
     }
 
-    override func backBtnClick() {
+    public override func backBtnClick() {
         super.backBtnClick()
         if isPresent {
             postNotification(name: cFinishedPublishedNotiKey)

+ 11 - 11
BFFramework/Classes/Stuckpoint/Model/PQStuckPointMusicTagsModel.swift

@@ -8,22 +8,22 @@
 
 import UIKit
 
-class PQStuckPointMusicTagsModel: NSObject {
-    var parentTagId: Int64? // 父级 ID(如果是第一层,值为 0) ,
-    var rankScore: Int64 = 0 // 排序分数 ,
-    var tagColor: String? // 标签颜色(16进制格式,例如 #FF0000) ,
-    var tagEmoji: String? // 标签emoji表情 ,
-    var tagId: Int64? // 标签ID ,
-    var tagName: String? // 标签名
-    var isSelected: Bool = false // 是否被选中
+public class PQStuckPointMusicTagsModel: NSObject {
+    public var parentTagId: Int64? // 父级 ID(如果是第一层,值为 0) ,
+    public var rankScore: Int64 = 0 // 排序分数 ,
+    public var tagColor: String? // 标签颜色(16进制格式,例如 #FF0000) ,
+    public var tagEmoji: String? // 标签emoji表情 ,
+    public var tagId: Int64? // 标签ID ,
+    public var tagName: String? // 标签名
+    public var isSelected: Bool = false // 是否被选中
     // 标签大小
-    var tagSize: CGSize = CGSize(width: cDefaultMargin * 6, height: cDefaultMargin * 3)
+    public var tagSize: CGSize = CGSize(width: cDefaultMargin * 6, height: cDefaultMargin * 3)
 
-    override init() {
+    public override init() {
         super.init()
     }
 
-    init(jsonDict: [String: Any]) {
+    public init(jsonDict: [String: Any]) {
         super.init()
         if jsonDict.keys.contains("parentTagId") {
             parentTagId = Int64("\(jsonDict["parentTagId"] ?? "")") ?? 0

+ 4 - 4
BFFramework/Classes/Stuckpoint/Model/PQStuckPointTimesModel.swift

@@ -8,15 +8,15 @@
 
 import UIKit
 
-class PQStuckPointTimesModel: NSObject {
-    var rhythmType: Int = 0 // 卡点类型
-    var pointTimes: [Int64] = Array<Int64>.init() // 卡点时间-单位:微秒
+public class PQStuckPointTimesModel: NSObject {
+    public var rhythmType: Int = 0 // 卡点类型
+    public var pointTimes: [Int64] = Array<Int64>.init() // 卡点时间-单位:微秒
 
     override init() {
         super.init()
     }
 
-    init(jsonDict: [String: Any]) {
+    public init(jsonDict: [String: Any]) {
         super.init()
         if jsonDict.keys.contains("rhythmType") {
             rhythmType = Int("\(jsonDict["rhythmType"] ?? "0")") ?? 0

+ 37 - 37
BFFramework/Classes/Stuckpoint/Model/PQVoiceModel.swift

@@ -15,7 +15,7 @@ public enum voiceStatue: Int {
     case isSelected = 3 // 选中状态,有红框 字红色 ,别的都没有
 }
 
-public class PQVoiceModel: NSObject, NSCopying {
+open class PQVoiceModel: NSObject, NSCopying {
     public var name: String = ""
     // 对应接口的 KEY
     public var voice: String = ""
@@ -27,7 +27,7 @@ public class PQVoiceModel: NSObject, NSCopying {
     // 是否为精品
     public var qualityFlag: Int = 0
     // 微软语音设置
-//    public var azureStyleConfig: [PQAzureStyleModel] = Array()
+    public var azureStyleConfig: [PQAzureStyleModel] = Array()
     // 声音文件沙盒位置 是 URI
     public var wavFilePath: String!
 
@@ -43,45 +43,45 @@ public class PQVoiceModel: NSObject, NSCopying {
     public var pitchRate: Float = 0
     public var azureStyle: String = "general"
 
-    var isSelected: Bool = false // 是否被选中
-    var isPlaying: Bool = false // 是否在播放
-    var itemWidth: CGFloat = 0 // 元素宽度
-    var materialUrl: String? // 播放地址
-    var localPath: String? // 本地存储地址
-    var duration: String? // 时长
-    var currentTime: Float64? // 当前已播放时长
-    var uniqueId: Int = 0 // 背景音乐ID
-    var materialId: String? // 保存发音人后素材IDmaterialUrl
-    var volume: Int = 0 // 0-100 素材音量
-    var startTime: Float64 = 0 // 开始时间
-    var endTime: Float64 = 0 // 结束时间
-    var createTimestamp: Int64 = 0 // 创建时间
-    var voiceType: String = VOICETYPT.PRODUCE.rawValue // 音乐类型
-    var accompanimentPath: String? // 伴奏地址
-    var musicId: String? // 音乐ID
-    var musicLabels: String? // 标签
-    var musicName: String? // 歌名
-    var musicPath: String? // 音乐地址
-    var musicSinger: String? // 歌手
-    var originType: Int = 1 // 音乐来源: 1上传, 2爬取
-    var sortNum: Int = 0 // 排序值
-    var vodAccompanimentMediaId: String? // 伴奏vod mediaId
-    var vodMusicMediaId: String? // 音乐vod mediaId
+    public var isSelected: Bool = false // 是否被选中
+    public  var isPlaying: Bool = false // 是否在播放
+    public var itemWidth: CGFloat = 0 // 元素宽度
+    public var materialUrl: String? // 播放地址
+    public var localPath: String? // 本地存储地址
+    public var duration: String? // 时长
+    public var currentTime: Float64? // 当前已播放时长
+    public var uniqueId: Int = 0 // 背景音乐ID
+    public var materialId: String? // 保存发音人后素材IDmaterialUrl
+    public var volume: Int = 0 // 0-100 素材音量
+    public var startTime: Float64 = 0 // 开始时间
+    public var endTime: Float64 = 0 // 结束时间
+    public var createTimestamp: Int64 = 0 // 创建时间
+    public var voiceType: String = VOICETYPT.PRODUCE.rawValue // 音乐类型
+    public  var accompanimentPath: String? // 伴奏地址
+    public var musicId: String? // 音乐ID
+    public var musicLabels: String? // 标签
+    public var musicName: String? // 歌名
+    public var musicPath: String? // 音乐地址
+    public var musicSinger: String? // 歌手
+    public var originType: Int = 1 // 音乐来源: 1上传, 2爬取
+    public var sortNum: Int = 0 // 排序值
+    public var vodAccompanimentMediaId: String? // 伴奏vod mediaId
+    public var vodMusicMediaId: String? // 音乐vod mediaId
     // add by ak json 结构化数据传值使用
-    var wavfileDuration: Float64 = 0
-    var selectVoiceType: Int = 1 // 选择的声音类型,1:原声 ,2:背景声
+    public var wavfileDuration: Float64 = 0
+    public var selectVoiceType: Int = 1 // 选择的声音类型,1:原声 ,2:背景声
     // 卡点视频-分类信息
-    var tagsInfo: PQStuckPointMusicTagsModel?
+    public var tagsInfo: PQStuckPointMusicTagsModel?
     // 卡点视频-卡点时间数据
-    var rhythmSdata: [PQStuckPointTimesModel] = Array<PQStuckPointTimesModel>.init()
+    public var rhythmSdata: [PQStuckPointTimesModel] = Array<PQStuckPointTimesModel>.init()
     // 卡点视频-默认卡点速度(1:快节奏,2:适中,3:慢节奏) ,
-    var speed: Int = 2
+    public var speed: Int = 2
     // 卡点视频-卡点音乐入点
-    var rhythmMusicIn: Float64 = 0
+    public var rhythmMusicIn: Float64 = 0
     // 卡点视频-卡点音乐出点
-    var rhythmMusicOut: Float64 = 0
+    public var rhythmMusicOut: Float64 = 0
     // 卡点视频-源项目ID(从那个项目做同款)
-    var originProjectId: String?
+    public var originProjectId: String?
     public func copy(with _: NSZone? = nil) -> Any {
         let voice = PQVoiceModel()
         voice.name = name
@@ -129,11 +129,11 @@ public class PQVoiceModel: NSObject, NSCopying {
         return voice
     }
 
-    override init() {
+   public override init() {
         super.init()
     }
 
-    init(jsonDict: [String: Any]) {
+    public init(jsonDict: [String: Any]) {
         super.init()
         if jsonDict.keys.contains("name"), "\(jsonDict["name"] ?? "")" != "<null>" {
             name = "\(jsonDict["name"] ?? "")"
@@ -265,7 +265,7 @@ public class PQVoiceModel: NSObject, NSCopying {
     ///   - videoCount: 视频个数
     ///   - imageCount: 图片个数
     /// - Returns: <#description#>
-    func stuckPointCuttingTime(videoCount _: Int, imageCount: Int, totalDuration: Float64) -> Float64 {
+    public func stuckPointCuttingTime(videoCount _: Int, imageCount: Int, totalDuration: Float64) -> Float64 {
         if totalDuration <= 0 {
             return 0
         }

+ 20 - 20
BFFramework/Classes/Stuckpoint/ViewModel/PQGPUImagePlayerView.swift

@@ -52,13 +52,13 @@ public class PQGPUImagePlayerView: UIView, RenderViewDelegate {
         }
     }
 
-    var mCanverSize: Size = Size(width: 0, height: 0)
+    public var mCanverSize: Size = Size(width: 0, height: 0)
 
     // 自动隐藏边框
-    var isAutoHiden: Bool = false
+    public var isAutoHiden: Bool = false
 
     // 是否显示边框
-    var isShowLine: Bool = true
+    public  var isShowLine: Bool = true
 
     // 播放进度
     public var playbackTimeChangeClosure: ((_ time: TimeInterval) -> Void)?
@@ -66,7 +66,7 @@ public class PQGPUImagePlayerView: UIView, RenderViewDelegate {
     public var progress: ((Double, Double, Double) -> Void)?
 
     /// 预览区域点击回调
-    var renderViewOnClickHandle: (() -> Void)?
+    public  var renderViewOnClickHandle: (() -> Void)?
 
     public private(set) var asset: AVAsset?
 
@@ -125,36 +125,36 @@ public class PQGPUImagePlayerView: UIView, RenderViewDelegate {
     /// Add filters to this array and call updateAsset(_:) method
     public var filters: [ImageProcessingOperation] = []
 
-    var movie: PQMoveInput?
+   public var movie: PQMoveInput?
 
-    var speaker: SpeakerOutput?
+    public var speaker: SpeakerOutput?
 
     /// Volumn of original sounds in AVAsset
     public var originVolumn: Float = 1.0 {
         didSet {}
     }
 
-    var playerLayer: AVPlayerLayer?
-    var player: AVPlayer?
+    public var playerLayer: AVPlayerLayer?
+    public var player: AVPlayer?
 
-    var playerEmptyView: UIImageView!
+    public var playerEmptyView: UIImageView!
 
-    var borderLayer: CAShapeLayer?
+    public var borderLayer: CAShapeLayer?
 
-    var mPlayeTimeRange: CMTimeRange?
+    public var mPlayeTimeRange: CMTimeRange?
 
-    var mStickers: [PQEditVisionTrackMaterialsModel]?
+    public  var mStickers: [PQEditVisionTrackMaterialsModel]?
 
     // 最后一次显示的sticker
-    var lastshowSticker: PQEditVisionTrackMaterialsModel?
+    public  var lastshowSticker: PQEditVisionTrackMaterialsModel?
 
     // 是否显示时间条
-    var showProgressLab: Bool = true
+    public  var showProgressLab: Bool = true
 
-    var cacheFilters: [PQBaseFilter] = Array()
+    public   var cacheFilters: [PQBaseFilter] = Array()
     
     //是否显示高斯
-    var showGaussianBlur:Bool = false
+    public  var showGaussianBlur:Bool = false
 
     // 渲染区view
     private lazy var renderView: RenderView = {
@@ -207,11 +207,11 @@ public class PQGPUImagePlayerView: UIView, RenderViewDelegate {
 
     }()
 
-    required init?(coder _: NSCoder) {
+    required public init?(coder _: NSCoder) {
         fatalError("init(coder:) has not been implemented")
     }
 
-    override init(frame: CGRect) {
+    override public init(frame: CGRect) {
         super.init(frame: frame)
 
         addSubview(renderView)
@@ -270,7 +270,7 @@ public class PQGPUImagePlayerView: UIView, RenderViewDelegate {
     }
 
     // 设置画布比例
-    func resetCanvasFrame(frame: CGRect) {
+   public func resetCanvasFrame(frame: CGRect) {
         if self.frame.equalTo(frame) {
             BFLog(message: "新老值一样,不重置")
             return
@@ -325,7 +325,7 @@ public class PQGPUImagePlayerView: UIView, RenderViewDelegate {
     }
 
     /// XXXX 这里的 URL 使用的是全路径 ,如果不是全的会 crash ,方便复用 (不用处理业务的文件放在哪里)
-    func updateAsset(_ url: URL, videoComposition: AVVideoComposition? = nil, audioMixModel: PQVoiceModel? = nil, videoStickers: [PQEditVisionTrackMaterialsModel]? = nil) {
+   public func updateAsset(_ url: URL, videoComposition: AVVideoComposition? = nil, audioMixModel: PQVoiceModel? = nil, videoStickers: [PQEditVisionTrackMaterialsModel]? = nil) {
         // 每次初始化的时候设置初始值 为 nIl
         var audioMix: AVMutableAudioMix?
         var composition: AVMutableComposition?

+ 13 - 13
BFFramework/Classes/Stuckpoint/ViewModel/PQPlayerViewModel.swift

@@ -9,10 +9,10 @@
 import RealmSwift
 import UIKit
 
-class PQPlayerViewModel: NSObject {
+open class PQPlayerViewModel: NSObject {
     /// 根据贴纸信息转成种 fitler ,编辑 ,总览,导出共用
     /// - Parameter parts: filter 组
-    class func partModelToFilters(sections: [PQEditSectionModel], inputSize: CGSize = .zero) -> ([ImageProcessingOperation], [URL]) {
+    public class func partModelToFilters(sections: [PQEditSectionModel], inputSize: CGSize = .zero) -> ([ImageProcessingOperation], [URL]) {
         // 所有段的声音位置
         var audioFiles: Array = Array<URL>.init()
         // 所有滤镜数组
@@ -150,7 +150,7 @@ class PQPlayerViewModel: NSObject {
         return (filters, audioFiles)
     }
 
-    class func calculationStickAptDurationReal(currentPart: PQEditSectionModel, completeHander: @escaping (_ returnPart: PQEditSectionModel?) -> Void) {
+    public class func calculationStickAptDurationReal(currentPart: PQEditSectionModel, completeHander: @escaping (_ returnPart: PQEditSectionModel?) -> Void) {
         // XXXXXX如果 没有选择发音人 就算有自动的转的声音文件也不按声音时长计算,都是素材原有时长
 //        let audioTotalDuration: Float64 = Float64(currentPart.sectionDuration)
         // 1,计算贴纸所有原始时长
@@ -272,7 +272,7 @@ class PQPlayerViewModel: NSObject {
     }
 
     // 计算所有贴纸的逻辑时长
-    class func calculationStickAptDuration(currentPart: PQEditSectionModel, createFirst: Bool = true, completeHander: @escaping (_ returnPart: PQEditSectionModel?) -> Void) {
+    public class func calculationStickAptDuration(currentPart: PQEditSectionModel, createFirst: Bool = true, completeHander: @escaping (_ returnPart: PQEditSectionModel?) -> Void) {
         if currentPart.sectionType == "global" {
             BFLog(message: "音频段落不处理计算")
             return
@@ -336,7 +336,7 @@ class PQPlayerViewModel: NSObject {
     /// 合并声音
     /// - Parameter urls: 所有音频的URL  是全路径方便复用
     /// - Parameter completeHander: 返回的 URL 全路径的 URL 如果要保存替换掉前缀
-    class func mergeAudios(urls: [URL], completeHander: @escaping (_ fileURL: URL?) -> Void) {
+    public class func mergeAudios(urls: [URL], completeHander: @escaping (_ fileURL: URL?) -> Void) {
         let timeInterval: TimeInterval = Date().timeIntervalSince1970
         let composition = AVMutableComposition()
         var totalDuration: CMTime = .zero
@@ -415,7 +415,7 @@ class PQPlayerViewModel: NSObject {
     ///   - editProjectModel: 项目数据
     ///   - showType: 显示类型 1, 编辑界面  2,总览界面
     /// - Returns: 显示的坐标和位置
-    class func getShowCanvasRect(editProjectModel: PQEditProjectModel?, showType: Int, playerViewHeight: CGFloat = 216 / 667 * cScreenHeigth) -> CGRect {
+    public class func getShowCanvasRect(editProjectModel: PQEditProjectModel?, showType: Int, playerViewHeight: CGFloat = 216 / 667 * cScreenHeigth) -> CGRect {
         if editProjectModel == nil {
             BFLog(message: "editProjectModel is error")
             return CGRect()
@@ -519,7 +519,7 @@ class PQPlayerViewModel: NSObject {
     /// sdata json canvastype 转到 UI 所使用类型
     /// - Parameter projectModel: project sdata
     /// - Returns: UI 使用类型
-    class func videoCanvasTypeToAspectRatio(projectModel: PQEditProjectModel?) -> aspectRatio? {
+    public class func videoCanvasTypeToAspectRatio(projectModel: PQEditProjectModel?) -> aspectRatio? {
         // add by ak 给素材详情界面传比例参数如果是原始大小的要传 size
         var aspectRatioTemp: aspectRatio?
         if projectModel?.sData?.videoMetaData?.canvasType == videoCanvasType.origin.rawValue {
@@ -547,7 +547,7 @@ class PQPlayerViewModel: NSObject {
         return aspectRatioTemp
     }
 
-    class func getCanvasBtnName(canvasType: videoCanvasType) -> (String, String) {
+    public class func getCanvasBtnName(canvasType: videoCanvasType) -> (String, String) {
         var btnText: String = "自适应"
         var btnImageName: String = "settingZoom_origin_h"
 
@@ -580,7 +580,7 @@ extension PQPlayerViewModel {
     ///   - bgmData: 背景音乐
     ///   - videoStickers: 视频素材
     /// - Returns: <#description#>
-    class func setupAudioMix(originAsset: AVURLAsset, bgmData: PQVoiceModel?, videoStickers: [PQEditVisionTrackMaterialsModel]?) -> (AVMutableAudioMix, AVMutableComposition) {
+    public class func setupAudioMix(originAsset: AVURLAsset, bgmData: PQVoiceModel?, videoStickers: [PQEditVisionTrackMaterialsModel]?) -> (AVMutableAudioMix, AVMutableComposition) {
         let composition = AVMutableComposition()
         let audioMix = AVMutableAudioMix()
         var tempParameters: [AVMutableAudioMixInputParameters] = [AVMutableAudioMixInputParameters].init()
@@ -621,7 +621,7 @@ extension PQPlayerViewModel {
     ///   - stickerModel: <#stickerModel description#>
     ///   - composition: <#composition description#>
     /// - Returns: <#description#>
-    class func dealWithBGMTrack(bgmData: PQVoiceModel, totalDuration: Float64, composition: AVMutableComposition) -> [AVMutableAudioMixInputParameters] {
+    public class func dealWithBGMTrack(bgmData: PQVoiceModel, totalDuration: Float64, composition: AVMutableComposition) -> [AVMutableAudioMixInputParameters] {
         var tempParameters: [AVMutableAudioMixInputParameters] = [AVMutableAudioMixInputParameters].init()
         let bgmAsset = AVURLAsset(url: URL(fileURLWithPath: bgmData.localPath ?? ""), options: avAssertOptions)
         let volume = Float(bgmData.volume) / 100.0
@@ -667,7 +667,7 @@ extension PQPlayerViewModel {
     ///   - stickerModel: <#stickerModel description#>
     ///   - composition: <#composition description#>
     /// - Returns: <#description#>
-    class func dealWithMaterialTrack(stickerModel: PQEditVisionTrackMaterialsModel, composition: AVMutableComposition) -> [AVMutableAudioMixInputParameters] {
+    public class func dealWithMaterialTrack(stickerModel: PQEditVisionTrackMaterialsModel, composition: AVMutableComposition) -> [AVMutableAudioMixInputParameters] {
         var tempParameters: [AVMutableAudioMixInputParameters] = [AVMutableAudioMixInputParameters].init()
         let audioAsset = AVURLAsset(url: URL(fileURLWithPath: documensDirectory + stickerModel.locationPath), options: avAssertOptions)
         let volume = Float(stickerModel.volumeGain) / 100
@@ -721,7 +721,7 @@ extension PQPlayerViewModel {
     ///   - volume:音轨音量
     ///   - composition: <#composition description#>
     /// - Returns: <#description#>
-    class func mixAudioTrack(audioAsset: AVURLAsset, startTime: CMTime = CMTime.zero, trackTimeRange: CMTimeRange, volume: Float = 1, composition: AVMutableComposition) -> AVMutableAudioMixInputParameters? {
+    public class func mixAudioTrack(audioAsset: AVURLAsset, startTime: CMTime = CMTime.zero, trackTimeRange: CMTimeRange, volume: Float = 1, composition: AVMutableComposition) -> AVMutableAudioMixInputParameters? {
         BFLog(message: "startTime = \(startTime),trackTimeRange = \(trackTimeRange)")
         // 第一个音轨
         // let assetTrack : AVAssetTrack? = audioAsset.tracks(withMediaType: .audio).first
@@ -748,7 +748,7 @@ extension PQPlayerViewModel {
     // 导出音频
     /// - Parameter comosition: <#comosition description#>
     /// - Returns: <#description#>
-    class func exportAudio(comosition: AVAsset) {
+    public class func exportAudio(comosition: AVAsset) {
         let outPutFilePath = URL(fileURLWithPath: tempDirectory + "/temp.mp4")
         // 删除以创建地址
         try? FileManager.default.removeItem(at: outPutFilePath)

+ 1 - 1
BFFramework/Classes/Utils/PQConstant.swift

@@ -94,7 +94,7 @@ public let cBubbleRemindViewTag: Int = 100_017
 /// 素材推荐提示tag
 public let cRecommendMaterialViewTag: Int = 100_018
 /// 气泡提示视图tag
-public let cPageMaterialGuidTag: Inst = 100_019
+public let cPageMaterialGuidTag: Int = 100_019
 /// 信息流视频广告tag
 public let cAdDrawVideoViewTag: Int = 100_020
 /****************** 私有key ***************/

+ 5 - 0
BFFramework/Classes/Utils/PQRequestURLUtil.swift

@@ -375,3 +375,8 @@ public let stuckPointMusicDetailUrl = "/producevideo/music/getRhythmMusicData"
 // 获取项目的卡点音乐信息
 public let stuckPointProjectMusicInfoUrl = "/producevideo/getProjectRhythmMusicInfo"
 
+
+// ***************** 广告相关地址 **********************//
+
+// 获取广告配置信息
+public let adPositionInfoUrl = "ad/position/info"

+ 4 - 4
BFFramework/Classes/Utils/PQSingletoMemoryUtil.swift

@@ -87,7 +87,7 @@ public class PQSingletoMemoryUtil: NSObject {
 
     /// 创建sessionId
     /// - Returns: <#description#>
-    func createSesstionId() {
+   public func createSesstionId() {
         sessionId = getUniqueId(desc: "sessionId")
         subSessionid = sessionId
         BFLog(message: "生成的sessionId = \(sessionId)")
@@ -95,14 +95,14 @@ public class PQSingletoMemoryUtil: NSObject {
 
     /// 创建subSessionid
     /// - Returns: <#description#>
-    func createSubSesstionId() {
+    public func createSubSesstionId() {
         subSessionid = getUniqueId(desc: "subSessionid")
         BFLog(message: "生成的subSessionid = \(String(describing: subSessionid))")
     }
 
     /// 制作视频项目Id
     /// - Returns: <#description#>
-    func createMakeVideoProjectId() {
+    public func createMakeVideoProjectId() {
         makeVideoProjectId = cProjectIdPrefix + getUniqueId(desc: "makeVideoProjectId")
         BFLog(message: "生成的projectId = \(String(describing: makeVideoProjectId))")
     }
@@ -110,7 +110,7 @@ public class PQSingletoMemoryUtil: NSObject {
     /// 解析abInfoData
     /// - Parameter abInfo: <#abInfo description#>
     /// - Returns: description
-    func parasABinfoData(abInfo: String?) {
+    public func parasABinfoData(abInfo: String?) {
         if abInfo != nil, (abInfo?.count ?? 0) > 0, abInfo != "{}" {
             guard let infoDic = jsonStringToDictionary(abInfo!) else { return }
             abInfoData.merge(infoDic, uniquingKeysWith: { (key, _) -> Any in