Jelajahi Sumber

修改1.9(3)bug

100Years 1 Minggu lalu
induk
melakukan
68e7cb2a18

+ 4 - 2
AIRingtone.xcodeproj/project.pbxproj

@@ -1375,11 +1375,12 @@
 				ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
 				CLANG_ENABLE_MODULES = YES;
 				CODE_SIGN_STYLE = Automatic;
-				CURRENT_PROJECT_VERSION = 1;
+				CURRENT_PROJECT_VERSION = 4;
 				DEVELOPMENT_TEAM = 65UD255J84;
 				GENERATE_INFOPLIST_FILE = YES;
 				INFOPLIST_FILE = AIRingtone/Info.plist;
 				INFOPLIST_KEY_CFBundleDisplayName = Ringtones;
+				INFOPLIST_KEY_NSCameraUsageDescription = "Allows us to access camera permissions to handle audio clips.";
 				INFOPLIST_KEY_NSContactsUsageDescription = "Allow \"Contacts\" permission to set contact photo";
 				INFOPLIST_KEY_NSPhotoLibraryUsageDescription = "Allow us to access Photos in order to save wallpapers to your device.";
 				INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES;
@@ -1417,11 +1418,12 @@
 				ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
 				CLANG_ENABLE_MODULES = YES;
 				CODE_SIGN_STYLE = Automatic;
-				CURRENT_PROJECT_VERSION = 1;
+				CURRENT_PROJECT_VERSION = 4;
 				DEVELOPMENT_TEAM = 65UD255J84;
 				GENERATE_INFOPLIST_FILE = YES;
 				INFOPLIST_FILE = AIRingtone/Info.plist;
 				INFOPLIST_KEY_CFBundleDisplayName = Ringtones;
+				INFOPLIST_KEY_NSCameraUsageDescription = "Allows us to access camera permissions to handle audio clips.";
 				INFOPLIST_KEY_NSContactsUsageDescription = "Allow \"Contacts\" permission to set contact photo";
 				INFOPLIST_KEY_NSPhotoLibraryUsageDescription = "Allow us to access Photos in order to save wallpapers to your device.";
 				INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES;

+ 12 - 1
AIRingtone/Business/Data/TSUserDefaultData.swift

@@ -87,7 +87,6 @@ class TSBaseHistoryManager<ModelType: TSBaseModel> {
         listModels.remove(at: index)
         saveHistory()
     }
-
     
     func replaceModel(oldID: Int, newModel: ModelType){
         if let index = findModelID(modelID: oldID) {
@@ -101,6 +100,18 @@ class TSBaseHistoryManager<ModelType: TSBaseModel> {
         saveHistory()
     }
     
+    func replaceAndSaveModel(saveModel:ModelType,compareBlock:(ModelType,ModelType)->Bool){
+        if let index = listModels.firstIndex(where: { model in
+            compareBlock(saveModel,model)
+        }){
+            dePrint("\(Self.self).listModels Model replaced at index \(index)")
+           listModels[index] = saveModel
+            saveHistory()
+        }else{
+            self.saveModel(model: saveModel)
+        }
+    }
+    
     func dePrintAllModel() {
         dePrint("=======================结果查询开始======================")
         dePrint("\(Self.self).listModels.count=\(listModels.count)")

+ 29 - 0
AIRingtone/Business/TSAIRintoneVC/TSAIRintoneVC/TSAIRintoneVC.swift

@@ -13,6 +13,14 @@ class TSAIRintoneVC: TSBaseVC {
         return viewModel
     }()
 
+    lazy var redDot: UIView = {
+        let redDot = UIView()
+        redDot.backgroundColor = .themeColor
+        redDot.cornerRadius = 3
+        redDot.isHidden = true
+        return redDot
+    }()
+    
     lazy var navBarView: TSBaseNavContentBarView = {
         let navBarView = TSBaseNavContentBarView()
 
@@ -24,6 +32,26 @@ class TSAIRintoneVC: TSBaseVC {
             make.height.equalTo(48)
         }
 
+        let rightBtn = UIButton.createButton(image: UIImage(named: "ring_folder")){[weak self]  in
+            guard let self = self else { return }
+            kPushVC(target: self, modelVC: TSRingDownVC())
+        }
+        navBarView.barView.addSubview(rightBtn)
+        rightBtn.snp.makeConstraints { make in
+            make.trailing.equalTo(-16)
+            make.centerY.equalToSuperview()
+            make.width.equalTo(24)
+            make.height.equalTo(24)
+        }
+        
+        rightBtn.addSubview(redDot)
+        redDot.snp.makeConstraints { make in
+            make.trailing.equalTo(2)
+            make.top.equalTo(1)
+            make.width.equalTo(6)
+            make.height.equalTo(6)
+        }
+        
         return navBarView
     }()
 
@@ -108,6 +136,7 @@ class TSAIRintoneVC: TSBaseVC {
 
     override func viewWillAppear(_ animated: Bool) {
         super.viewWillAppear(animated)
+        redDot.isHidden = !TSMineRintoneHistory.shared.isHaveNew
         viewModel.updateRecentData()
         updateListView()
     }

+ 9 - 1
AIRingtone/Business/TSAIRintoneVC/TSAIRintoneVC/View/TSAIRintoneHistoryCell.swift

@@ -335,7 +335,15 @@ extension TSAIRintoneHistoryCell {
                         documentPath = savePath.path
                     }
                     ringModel.documentPath = documentPath.documentLastURLString
-                    TSMineRintoneHistory.shared.saveModel(model: ringModel)
+                    TSMineRintoneHistory.shared.replaceAndSaveModel(saveModel: ringModel) { ringModel, model in
+                        if model.title == ringModel.title,
+                           model.audioUrl == ringModel.audioUrl,
+                           model.categoryId == ringModel.categoryId,
+                           model.documentPath == ringModel.documentPath{
+                            return true
+                        }
+                        return false
+                    }
                 }
             }
         }

+ 6 - 1
AIRingtone/Business/TSDiscoverVC/TSRingDownVC/TSRingDownVC.swift

@@ -157,6 +157,11 @@ extension TSRingDownVC: SwipeCollectionViewCellDelegate {
                 if let sectionModel = self.viewModel.modelList.safeObj(At: indexPath.section),
                 let model = sectionModel.list.safeObj(At: indexPath.item){
                     if let model = model as? TSRingModel {
+                        
+                        if TSBusinessAudioPlayer.shared.isPlayURLString(string: model.audioUrl,localURL:model.documentPath.fillDocumentURL) {
+                            TSBusinessAudioPlayer.shared.stop()
+                        }
+                        
                         collectionView.performBatchUpdates({
                             self.viewModel.removeModel(model: model)
                             if sectionModel.list.count == 0 {
@@ -165,7 +170,7 @@ extension TSRingDownVC: SwipeCollectionViewCellDelegate {
                                 collectionView.deleteItems(at: [indexPath])
                             }
                         })
-                        TSBusinessAudioPlayer.shared.stop()
+
                         self.nullView.isHidden = self.viewModel.modelList.count > 0
                     }
                 }

+ 47 - 22
AIRingtone/Business/TSEditAudioVideoVC/TSEditAudioVC.swift

@@ -74,7 +74,7 @@ class TSEditAudioVC: TSEditAudioVideoBaseVC , ZHCroppedDelegate, ZHWaveformViewD
         
         nameLabel.snp.makeConstraints { make in
             make.leading.equalToSuperview()
-            make.width.greaterThanOrEqualTo(220*kDesignScale)
+            make.width.lessThanOrEqualTo(220*kDesignScale)
             make.height.equalTo(23)
             make.top.bottom.equalTo(0)
         }
@@ -285,9 +285,9 @@ class TSEditAudioVC: TSEditAudioVideoBaseVC , ZHCroppedDelegate, ZHWaveformViewD
         let outputVolumeSliderView = TSEditAudioSliderView()
         outputVolumeSliderView.leftLabel.text = "Output Volume".localized
         outputVolumeSliderView.rightLabel.text = "100%"
-        outputVolumeSliderView.slider.minimumValue = 1.0
+        outputVolumeSliderView.slider.minimumValue = 0.2
         outputVolumeSliderView.slider.maximumValue = 2.0
-//        outputVolumeSliderView.slider.value = 1.5
+        outputVolumeSliderView.slider.value = 1.0
         return outputVolumeSliderView
     }()
     lazy var outputVolumeSlider: UISlider = {
@@ -412,8 +412,6 @@ class TSEditAudioVC: TSEditAudioVideoBaseVC , ZHCroppedDelegate, ZHWaveformViewD
         }
 
         timeLabel.text = ringDuration.mmss
-        cutButton.setBtnEnabled(isEnabled: false)
-        doneButton.setBtnEnabled(isEnabled: false)
     }
 
 
@@ -438,8 +436,6 @@ class TSEditAudioVC: TSEditAudioVideoBaseVC , ZHCroppedDelegate, ZHWaveformViewD
     lazy var startCropRate: CGFloat = 0 {
         didSet {
             let time = startDuration
-            cutButton.setBtnEnabled(isEnabled: true)
-            doneButton.setBtnEnabled(isEnabled: true)
             
             //            print("---start: \(time)")
             startTimeLabel.text = time.mmss
@@ -450,8 +446,6 @@ class TSEditAudioVC: TSEditAudioVideoBaseVC , ZHCroppedDelegate, ZHWaveformViewD
     lazy var isSuspendByAction = false
     lazy var endCropRate: CGFloat = 1.0 {
         didSet {
-            cutButton.setBtnEnabled(isEnabled: true)
-            doneButton.setBtnEnabled(isEnabled: true)
             let time = endDuration
             endTimeLabel.text = time.mmss
             timeLabel.text = (endDuration - startDuration).mmss
@@ -472,7 +466,7 @@ class TSEditAudioVC: TSEditAudioVideoBaseVC , ZHCroppedDelegate, ZHWaveformViewD
             player.setVolume(volume: fadeInDuration > 0 ? 0 : maxVolume)
 
             if UIApplication.getSystemVolume() == 0.0 {
-                TSToastShared.showToast(text:"Please turn up the volume".localized)
+                TSToastShared.showToast(text:"Please turn up the volume".localized,duration: 2.0)
             }
             
         }
@@ -495,13 +489,19 @@ class TSEditAudioVC: TSEditAudioVideoBaseVC , ZHCroppedDelegate, ZHWaveformViewD
         }
     }
     
+    override func navBarClickLeftAction() {
+        if isThereAnyChange(){
+            super.navBarClickLeftAction()
+        }else{
+            pop()
+        }
+    }
+    
 }
 
 
 extension TSEditAudioVC {
     
-
-    
     @objc func sliderBeginTap(_ slider: UISlider) {
         suspendPlay()
     }
@@ -524,14 +524,11 @@ extension TSEditAudioVC {
         }
     }
 
-    
     // 裁剪起始时间
     var startDuration: Double {
         return startCropRate * CGFloat(ringDuration)
     }
     
-
-    
     var startMinCenterX: CGFloat {
         return trackContentView.x
     }
@@ -558,7 +555,7 @@ extension TSEditAudioVC {
         guard limitMaxCenterX > limitMinCenterX else {
             if sender.state == .began {
                 dePrint("TSEditAudioVC rightPanRecognizer No less than 10s")
-                TSToastShared.showToast(text:"No less than 10s".localized)
+                TSToastShared.showToast(text:"No less than 10s".localized,duration: 2.0)
             }
             return
         }
@@ -574,7 +571,7 @@ extension TSEditAudioVC {
                   center.x < limitMaxCenterX else {
                 // 越界,拖不动了, 最少10s
                 if endDuration - startDuration < 11 {
-                    TSToastShared.showToast(text:"No less than 10s".localized)
+                    TSToastShared.showToast(text:"No less than 10s".localized,duration: 2.0)
                 }
                 return
             }
@@ -615,7 +612,7 @@ extension TSEditAudioVC {
             if sender.state == .began {
                 dePrint("TSEditAudioVC rightPanRecognizer No less than 10s")
                 // 越界,拖不动了
-                TSToastShared.showToast(text:"No less than 10s".localized)
+                TSToastShared.showToast(text:"No less than 10s".localized,duration: 2.0)
             }
             return
         }
@@ -634,7 +631,7 @@ extension TSEditAudioVC {
             guard center.x > limitMinCenterX, center.x < limitMaxCenterX else {
                 // 越界,拖不动了, 最少10s
                 if endDuration - startDuration < 11 {
-                    TSToastShared.showToast(text:"No less than 10s".localized)
+                    TSToastShared.showToast(text:"No less than 10s".localized,duration: 2.0)
                 }
                 return
             }
@@ -683,8 +680,9 @@ extension TSEditAudioVC {
         startCutAudio { result, errMsg,savePath in
             if let ringModel = result {
                 // 裁剪的音频,使用本地文件播放,清空网络url
-                dePrint("TSEditAudioVC saveModel ringModel = \(ringModel.toJSONString())")
+                dePrint("TSEditAudioVC saveModel ringModel = \(String(describing: ringModel.toJSONString()))")
                 TSMineRintoneHistory.shared.saveModel(model: ringModel)
+                
                 DispatchQueue.main.async {
                     self.pop()
                     if let window = WindowHelper.getKeyWindow() {
@@ -711,10 +709,19 @@ extension TSEditAudioVC {
 
     // 裁剪
     func startCutAudio(completion: ((TSRingModel?, String?,URL?) -> Void)?) {
+        
         let copyModel = ringModel
-       let savePath = TSDownloadManager.generateRingSaveLocalURL(name: copyModel.title)
+        let savePath = TSDownloadManager.generateRingSaveLocalURL(name: copyModel.title)
         TSFileManagerTool.checkFolderAndCreate(from: savePath)
         
+        //未做任何改变,直接返回原音频
+        if isThereAnyChange() == false {
+            TSFileManagerTool.copyFileWithOverwrite(from: editOriginalURL, to: savePath)
+            copyModel.documentPath = savePath.path.documentLastURLString
+            completion?(copyModel, nil, savePath)
+            return
+        }
+        
         copyModel.duration = Int(endDuration - startDuration)
         TSRingLoadingView.shared.showWindow()
         audioTool.startTansformAudio(url:editOriginalURL.path, from: startDuration, to: endDuration, fadeIn: Double(fadeInDuration), fadeOut: Double(fadeOutDuration),addVolume: Double(outputVolume) ,savePath: savePath.path) { filePath, errMsg in
@@ -733,7 +740,12 @@ extension TSEditAudioVC {
                         copyModel.duration = Int(duration)
                     }
                 }
-    
+                
+                //如果列表中有重名的,就加上时间戳
+                if let _ = TSMineRintoneHistory.shared.listModels.first(where: {$0.title == copyModel.title}){
+                    copyModel.title = copyModel.title.removeTimestampFromEnd() + Date.timestampString
+                }
+
                 completion?(copyModel, errMsg, savePath)
             } else {
                 completion?(nil, errMsg, nil)
@@ -741,6 +753,19 @@ extension TSEditAudioVC {
         }
     }
     
+    
+    //是否有改动,调整过编辑参数
+    func isThereAnyChange() -> Bool{
+        if startDuration == 0,
+           endDuration == ringDuration,
+           fadeInDuration == 0,
+           fadeOutDuration == 0,
+           outputVolume == 1.0{
+            return false
+        }
+           
+        return true
+    }
 }
 extension TSEditAudioVC {
     func handlePlayer(state: TSBusinessAudioPlayer.PlayerState) {

+ 1 - 1
AIRingtone/Business/TSEditAudioVideoVC/TSEditAudioVideoBaseVC.swift

@@ -174,7 +174,7 @@ class TSEditAudioVideoBaseVC: TSBaseVC {
             messageFont: .systemFont(ofSize: 16),
             
             cancelTitle: "Leave".localized,
-            cancelColor: .textAssist,
+            cancelColor: .white,
             
             confirmTitle: "Stay".localized,
             confirmColor: .themeColor,

+ 7 - 3
AIRingtone/Common/Tool/TSBandRingTool/AudioTool.swift

@@ -141,9 +141,13 @@ class AudioTool {
             completion?(nil)
             return
         }
-        let url = URL(fileURLWithPath: copyBandURL.path)
-        debugPrint("===bandPath: \(url.absoluteString)")
-        completion?(url)
+        
+        completion?(copyBandURL)
+        debugPrint("===bandPath: \(copyBandURL)")
+        
+//        let url = URL(fileURLWithPath: copyBandURL.path)
+//        debugPrint("===bandPath: \(url)")
+//        completion?(url)
     }
     
     /*

+ 4 - 1
Podfile

@@ -21,7 +21,10 @@ target 'AIRingtone' do
   pod 'TSSmalCoacopods', :path => '../TSSmalCoacopods'
   #pod 'TSSmalCoacopods',:git=>"http://hubgit.cn/zhouzhenshuai/TSSmalCoacopods.git", :branch => 'main'
   pod 'BetterSegmentedControl', '~> 2.0'
-  pod 'ffmpeg-kit-ios-full', '~> 6.0'
+#  pod 'ffmpeg-kit-ios-full', '~> 6.0'
+
+  pod 'ffmpeg-kit-ios-audio', '~> 6.0'
+
 end
 
 

+ 5 - 5
Podfile.lock

@@ -1,7 +1,7 @@
 PODS:
   - Alamofire (5.10.2)
   - BetterSegmentedControl (2.0.1)
-  - ffmpeg-kit-ios-full (6.0)
+  - ffmpeg-kit-ios-audio (6.0)
   - IQKeyboardCore (1.0.5)
   - IQKeyboardManagerSwift (8.0.0):
     - IQKeyboardManagerSwift/Appearance (= 8.0.0)
@@ -63,7 +63,7 @@ PODS:
 DEPENDENCIES:
   - Alamofire
   - BetterSegmentedControl (~> 2.0)
-  - ffmpeg-kit-ios-full (~> 6.0)
+  - ffmpeg-kit-ios-audio (~> 6.0)
   - IQKeyboardManagerSwift
   - JXPagingView/Paging
   - JXSegmentedView
@@ -79,7 +79,7 @@ SPEC REPOS:
   trunk:
     - Alamofire
     - BetterSegmentedControl
-    - ffmpeg-kit-ios-full
+    - ffmpeg-kit-ios-audio
     - IQKeyboardCore
     - IQKeyboardManagerSwift
     - IQKeyboardNotification
@@ -105,7 +105,7 @@ EXTERNAL SOURCES:
 SPEC CHECKSUMS:
   Alamofire: 7193b3b92c74a07f85569e1a6c4f4237291e7496
   BetterSegmentedControl: 09607b27861d49cbce48b7673b74f9150a3d371a
-  ffmpeg-kit-ios-full: 34de6ec504f88a7289fe223c2db93afc2c9f931a
+  ffmpeg-kit-ios-audio: c013c6a68e822f7584f511931ad98e9a2040f23a
   IQKeyboardCore: 28c8bf3bcd8ba5aa1570b318cbc4da94b861711e
   IQKeyboardManagerSwift: 0c6fbbaa2e60739e48d7cf59f25661471a7a3a65
   IQKeyboardNotification: d7382c4466c5a5adef92c7452ebf861b36050088
@@ -125,6 +125,6 @@ SPEC CHECKSUMS:
   SwipeCellKit: 3972254a826da74609926daf59b08d6c72e619ea
   TSSmalCoacopods: 6aa97167f0c76b16fc7d1fd1eb198bb6aece4f68
 
-PODFILE CHECKSUM: 6403f343d6afff60d8dbf7370e697eb658531a5e
+PODFILE CHECKSUM: 77fc358d4daf811a0f346e0934766d16c964f399
 
 COCOAPODS: 1.16.2