Parcourir la source

feat:调整部分细节,修复bug,加回diy

kailen il y a 2 mois
Parent
commit
0495fdd0fa
24 fichiers modifiés avec 219 ajouts et 189 suppressions
  1. 1 0
      Podfile
  2. 2 2
      TSLiveWallpaper.xcodeproj/project.pbxproj
  3. BIN
      TSLiveWallpaper/Assets.xcassets/Music/.DS_Store
  4. 0 1
      TSLiveWallpaper/Assets.xcassets/Music/ic_default.imageset/Contents.json
  5. BIN
      TSLiveWallpaper/Assets.xcassets/Music/ic_default.imageset/ic_default@1x.png
  6. BIN
      TSLiveWallpaper/Assets.xcassets/Music/ic_default.imageset/ic_default@2x.png
  7. BIN
      TSLiveWallpaper/Assets.xcassets/Music/ic_default.imageset/ic_default@3x.png
  8. 23 0
      TSLiveWallpaper/Assets.xcassets/Music/ic_diy_wallpaper.imageset/Contents.json
  9. BIN
      TSLiveWallpaper/Assets.xcassets/Music/ic_diy_wallpaper.imageset/ic_diy_wallpaper@1x.png
  10. BIN
      TSLiveWallpaper/Assets.xcassets/Music/ic_diy_wallpaper.imageset/ic_diy_wallpaper@2x.png
  11. BIN
      TSLiveWallpaper/Assets.xcassets/Music/ic_diy_wallpaper.imageset/ic_diy_wallpaper@3x.png
  12. 23 0
      TSLiveWallpaper/Assets.xcassets/Music/ic_gen_button.imageset/Contents.json
  13. BIN
      TSLiveWallpaper/Assets.xcassets/Music/ic_gen_button.imageset/ic_gen_button@1x.png
  14. BIN
      TSLiveWallpaper/Assets.xcassets/Music/ic_gen_button.imageset/ic_gen_button@2x.png
  15. BIN
      TSLiveWallpaper/Assets.xcassets/Music/ic_gen_button.imageset/ic_gen_button@3x.png
  16. 104 147
      TSLiveWallpaper/Business/TSEditLiveVC/TSEditLiveVC.swift
  17. 40 19
      TSLiveWallpaper/Business/TSHomeVC/TSHomeVC.swift
  18. 2 3
      TSLiveWallpaper/Business/TSMusic/Detail/Controller/PlayDetailViewController.swift
  19. 8 2
      TSLiveWallpaper/Business/TSMusic/Detail/PlayerManager.swift
  20. 10 11
      TSLiveWallpaper/Business/TSMusic/Helper/FilterBarViewModel.swift
  21. 2 2
      TSLiveWallpaper/Business/TSMusic/List/View/SongListCell.swift
  22. 2 0
      TSLiveWallpaper/Business/TSMusic/PlayList/Controller/PlaylistViewController.swift
  23. 1 1
      TSLiveWallpaper/Common/BaseClass/TSBaseVC.swift
  24. 1 1
      TSLiveWallpaper/Common/Purchase/TSPurchaseManager.swift

+ 1 - 0
Podfile

@@ -26,6 +26,7 @@ target 'TSLiveWallpaper' do
   pod 'KLTips',:git=>"https://gitee.com/WanlanNeel/kltips.git"
   pod 'Localize-Swift', '~> 3.2'
   pod 'BetterSegmentedControl', '~> 2.0'
+  pod 'Google-Mobile-Ads-SDK'
 
 end
 

+ 2 - 2
TSLiveWallpaper.xcodeproj/project.pbxproj

@@ -1542,7 +1542,7 @@
 				ENABLE_USER_SCRIPT_SANDBOXING = NO;
 				GENERATE_INFOPLIST_FILE = YES;
 				INFOPLIST_FILE = TSLiveWallpaper/Info.plist;
-				INFOPLIST_KEY_CFBundleDisplayName = Dmanage;
+				INFOPLIST_KEY_CFBundleDisplayName = Dmanager;
 				INFOPLIST_KEY_NSPhotoLibraryUsageDescription = "Allow us to access Photos in order to save wallpapers to your device.";
 				INFOPLIST_KEY_NSUserTrackingUsageDescription = "It will only be used to measure advertising efficiency without leaking any of your personal information.";
 				INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES;
@@ -1582,7 +1582,7 @@
 				ENABLE_USER_SCRIPT_SANDBOXING = NO;
 				GENERATE_INFOPLIST_FILE = YES;
 				INFOPLIST_FILE = TSLiveWallpaper/Info.plist;
-				INFOPLIST_KEY_CFBundleDisplayName = Dmanage;
+				INFOPLIST_KEY_CFBundleDisplayName = Dmanager;
 				INFOPLIST_KEY_NSPhotoLibraryUsageDescription = "Allow us to access Photos in order to save wallpapers to your device.";
 				INFOPLIST_KEY_NSUserTrackingUsageDescription = "It will only be used to measure advertising efficiency without leaking any of your personal information.";
 				INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES;

BIN
TSLiveWallpaper/Assets.xcassets/Music/.DS_Store


+ 0 - 1
TSLiveWallpaper/Assets.xcassets/Music/ic_default.imageset/Contents.json

@@ -1,7 +1,6 @@
 {
   "images" : [
     {
-      "filename" : "ic_default@1x.png",
       "idiom" : "universal",
       "scale" : "1x"
     },

BIN
TSLiveWallpaper/Assets.xcassets/Music/ic_default.imageset/ic_default@1x.png


BIN
TSLiveWallpaper/Assets.xcassets/Music/ic_default.imageset/ic_default@2x.png


BIN
TSLiveWallpaper/Assets.xcassets/Music/ic_default.imageset/ic_default@3x.png


+ 23 - 0
TSLiveWallpaper/Assets.xcassets/Music/ic_diy_wallpaper.imageset/Contents.json

@@ -0,0 +1,23 @@
+{
+  "images" : [
+    {
+      "filename" : "ic_diy_wallpaper@1x.png",
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "filename" : "ic_diy_wallpaper@2x.png",
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "filename" : "ic_diy_wallpaper@3x.png",
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

BIN
TSLiveWallpaper/Assets.xcassets/Music/ic_diy_wallpaper.imageset/ic_diy_wallpaper@1x.png


BIN
TSLiveWallpaper/Assets.xcassets/Music/ic_diy_wallpaper.imageset/ic_diy_wallpaper@2x.png


BIN
TSLiveWallpaper/Assets.xcassets/Music/ic_diy_wallpaper.imageset/ic_diy_wallpaper@3x.png


+ 23 - 0
TSLiveWallpaper/Assets.xcassets/Music/ic_gen_button.imageset/Contents.json

@@ -0,0 +1,23 @@
+{
+  "images" : [
+    {
+      "filename" : "ic_gen_button@1x.png",
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "filename" : "ic_gen_button@2x.png",
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "filename" : "ic_gen_button@3x.png",
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

BIN
TSLiveWallpaper/Assets.xcassets/Music/ic_gen_button.imageset/ic_gen_button@1x.png


BIN
TSLiveWallpaper/Assets.xcassets/Music/ic_gen_button.imageset/ic_gen_button@2x.png


BIN
TSLiveWallpaper/Assets.xcassets/Music/ic_gen_button.imageset/ic_gen_button@3x.png


+ 104 - 147
TSLiveWallpaper/Business/TSEditLiveVC/TSEditLiveVC.swift

@@ -8,7 +8,6 @@
 import PhotosUI
 
 class TSEditLiveVC: TSBaseVC, UINavigationControllerDelegate {
-    
     lazy var editLiveSectionModel: TSEditLiveSectionModel = {
         let section = TSEditLiveSectionModel()
         section.items = [TSEditLiveItemModel()]
@@ -16,56 +15,48 @@ class TSEditLiveVC: TSBaseVC, UINavigationControllerDelegate {
     }()
 
     lazy var editLiveHistorySectionModel: TSImageDataSectionModel = {
-        return kImageDataCenterShared.editLiveHistoryListArray.first!
+        kImageDataCenterShared.editLiveHistoryListArray.first!
     }()
-    
-    var dataArray:[Component] = [Component]()
-
-    
-    lazy var navBarView: TSBaseNavContentBarView = {
-        let navBarView = TSBaseNavContentBarView()
-        let titleImageView = UIImageView.createImageView(imageName: "nav_title_editlive",contentMode: .scaleToFill)
-        
-        navBarView.barView.addSubview(titleImageView)
-        titleImageView.snp.makeConstraints { make in
-            make.centerY.equalToSuperview()
-            make.left.equalTo(16)
-            make.width.equalTo(252)
-            make.height.equalTo(24)
-        }
+
+    var dataArray: [Component] = [Component]()
+
+    lazy var navBarView: LWSubNavigationBar = {
+        let navBarView = LWSubNavigationBar()
+        navBarView.backButton.addTarget(self, action: #selector(pop), for: .touchUpInside)
+        navBarView.backButton.setImage(.icClose, for: .normal)
+        navBarView.titleLabel.text = "DIY Live Wallpaper"
         return navBarView
     }()
 
-    
     lazy var collectionComponent: CollectionViewComponent = {
         let layout = UICollectionViewFlowLayout()
-        let cp = CollectionViewComponent(frame: CGRect.zero, layout: layout, attributes: [ :])
+        let cp = CollectionViewComponent(frame: CGRect.zero, layout: layout, attributes: [:])
         cp.collectionView.contentInset = UIEdgeInsets(top: 0, left: 0, bottom: k_Height_TabBar, right: 0)
-        
-        cp.itemActionHandler = { [weak self] cellCp, indexPath in
+
+        cp.itemActionHandler = { [weak self] _, _ in
             guard let self = self else { return }
-            
-            //判断 vip
-            if kPurchaseDefault.freeNumAvailable() == false{
-                TSPurchaseVC.show(target: self) {[weak self] in
+
+            // 判断 vip
+            if kPurchaseDefault.freeNumAvailable() == false {
+                TSPurchaseVC.show(target: self) { [weak self] in
                     guard let self = self else { return }
                     reloadView()
                 }
                 return
             }
-            
-            //生成视频
+
+            // 生成视频
             self.openVideoPicker()
         }
-        
-        cp.itemDidSelectedHandler = { [weak self] (object, indexPath) in
+
+        cp.itemDidSelectedHandler = { [weak self] _, indexPath in
             guard let self = self else { return }
             let obj = dataArray.safeObj(At: indexPath.section)
             if let liveModel = obj as? TSImageDataSectionModel {
-                if liveModel.style == .homeLiveList{
-                    let vc = TSLiveWallpaperBrowseVC(itemModels: liveModel.items,currentIndex: indexPath.row)
+                if liveModel.style == .homeLiveList {
+                    let vc = TSLiveWallpaperBrowseVC(itemModels: liveModel.items, currentIndex: indexPath.row)
                     vc.isCanDelete = true
-                    vc.deleteCompletion = {[weak self] item in
+                    vc.deleteCompletion = { [weak self] item in
                         guard let self = self else { return }
                         if let itemModel = editLiveHistorySectionModel.items.safeObj(At: item) {
                             editLiveHistorySectionModel.items.remove(at: item)
@@ -84,30 +75,33 @@ class TSEditLiveVC: TSBaseVC, UINavigationControllerDelegate {
     }()
 
     override func createView() {
-        
         setViewBgImageNamed(named: "view_main_bg")
-        
         navBarContentView.addSubview(navBarView)
+        navBarContentView.snp.remakeConstraints { make in
+            make.top.equalTo(view.safeAreaLayoutGuide.snp.top)
+            make.leading.trailing.equalToSuperview()
+            make.height.equalTo(44.0)
+        }
         navBarView.snp.makeConstraints { make in
             make.edges.equalToSuperview()
         }
-        
+
         contentView.addSubview(collectionComponent.collectionView)
         collectionComponent.collectionView.snp.makeConstraints { make in
             make.edges.equalToSuperview()
         }
-        
+
         reloadView()
     }
-    
-    func reloadView(){
+
+    func reloadView() {
         collectionComponent.clear()
-        if editLiveHistorySectionModel.items.count  > 0 {
-            dataArray = [editLiveSectionModel,editLiveHistorySectionModel]
-        }else{
+        if editLiveHistorySectionModel.items.count > 0 {
+            dataArray = [editLiveSectionModel, editLiveHistorySectionModel]
+        } else {
             dataArray = [editLiveSectionModel]
         }
-        collectionComponent.reloadView(with:dataArray)
+        collectionComponent.reloadView(with: dataArray)
     }
 }
 
@@ -117,7 +111,7 @@ extension TSEditLiveVC: UIImagePickerControllerDelegate {
         TSToastShared.showLoading()
         let picker = UIImagePickerController()
         picker.sourceType = .photoLibrary
-        picker.mediaTypes =  [UTType.movie.identifier] // 仅允许选择视频
+        picker.mediaTypes = [UTType.movie.identifier] // 仅允许选择视频
         picker.allowsEditing = true // 启用编辑功能
         picker.delegate = self
         picker.videoMaximumDuration = 3.0
@@ -125,9 +119,9 @@ extension TSEditLiveVC: UIImagePickerControllerDelegate {
             self.hideLoading()
         }
     }
+
     // 用户完成选择
     func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey: Any]) {
-        
         hideLoading()
         if let editedURL = info[.mediaURL] as? URL {
             debugPrint("Selected video: \(editedURL)")
@@ -136,8 +130,7 @@ extension TSEditLiveVC: UIImagePickerControllerDelegate {
             let cachesDirectory = TSFileManagerTool.editLiveVideoPathURL
             let targetURL = cachesDirectory.appendingPathComponent("assemblePickerVideo").appendingPathExtension(editedURL.pathExtension)
             TSFileManagerTool.copyFileWithOverwrite(from: editedURL, to: targetURL)
-            
-            
+
 //            LivePhotoUtil.convertVideo(targetURL.path) { success, msg in
 //                debugPrint(msg)
 //            }
@@ -145,7 +138,7 @@ extension TSEditLiveVC: UIImagePickerControllerDelegate {
 //            LivePhotoConverter.convertVideo(targetURL) { success, image, video, msg in
 //                debugPrint(msg)
 //            }
-  
+
             saveLive(videoPath: targetURL)
         }
         picker.dismiss(animated: true, completion: nil)
@@ -156,60 +149,54 @@ extension TSEditLiveVC: UIImagePickerControllerDelegate {
         hideLoading()
         picker.dismiss(animated: true, completion: nil)
     }
-    
-    
-    func hideLoading(){
-        
+
+    func hideLoading() {
         kDelayMainShort {
             TSToastShared.hideLoading()
         }
-    
     }
 }
 
-extension TSEditLiveVC{
-    
-    func openVideoClipperVC(videoURL:URL) {
-            let clipperController = GPVideoClipperController.clipperWithVideoURL(videoURL, makerBlock: { (maker) in
-                maker.startTime = 0
-                maker.endTime = 15
-                maker.clippedVideoMinDuration = 1
-                maker.clippedVideoMaxDuration = 3
-                maker.leftSelectedImage = UIImage(named: "eidt_arrow_left")!
-                maker.selectedBoxColor = .white
-                maker.rightSelectedImage = UIImage(named: "eidt_arrow_right")!
-                maker.leftMargin = 77
-                maker.rightMargin = 37
-                maker.selectedImageWidth = 14
-            }) {[weak self] (videoURL, videoAsset, coverImage) in
-                guard let self = self else { return }
-                self.saveLive(videoPath: videoURL)
-            }
-        
+extension TSEditLiveVC {
+    func openVideoClipperVC(videoURL: URL) {
+        let clipperController = GPVideoClipperController.clipperWithVideoURL(videoURL, makerBlock: { maker in
+            maker.startTime = 0
+            maker.endTime = 15
+            maker.clippedVideoMinDuration = 1
+            maker.clippedVideoMaxDuration = 3
+            maker.leftSelectedImage = UIImage(named: "eidt_arrow_left")!
+            maker.selectedBoxColor = .white
+            maker.rightSelectedImage = UIImage(named: "eidt_arrow_right")!
+            maker.leftMargin = 77
+            maker.rightMargin = 37
+            maker.selectedImageWidth = 14
+        }) { [weak self] videoURL, _, _ in
+            guard let self = self else { return }
+            self.saveLive(videoPath: videoURL)
+        }
+
         kPresentModalVC(target: self, modelVC: clipperController)
     }
-    
-    
-    func saveLive(videoPath:URL){
+
+    func saveLive(videoPath: URL) {
         TSToastShared.showLoading()
-        LivePhotoConverter.convertVideo(videoPath) { success, imageURL, videoURL, errorMsg in
+        LivePhotoConverter.convertVideo(videoPath) { success, imageURL, videoURL, _ in
             if success {
                 debugPrint("Live Photo Saved,The live photo was successfully saved to Photos.")
-                
-                if let imageURL = imageURL,let videoURL = videoURL {
-                    LivePhotoConverter.saveToLibrary(videoURL: videoURL, imageURL: imageURL) { success in
-                        kSavePhotoSuccesswShared.show(atView: self.view,text: "DIY Successfully".localized)
+
+                if let imageURL = imageURL, let videoURL = videoURL {
+                    LivePhotoConverter.saveToLibrary(videoURL: videoURL, imageURL: imageURL) { _ in
+                        kSavePhotoSuccesswShared.show(atView: self.view, text: "DIY Successfully".localized)
                     }
                     kPurchaseDefault.useOnceForFree()
-                    
+
                     let saveURL = TSFileManagerTool.saveLiveVideoPathURL
                     let timestampString = Date.timestampString
                     let saveImageURL = saveURL.appendingPathComponent("image\(timestampString).heic")
                     let saveVideoURL = saveURL.appendingPathComponent("video\(timestampString).mov")
                     TSFileManagerTool.copyFileWithOverwrite(from: imageURL, to: saveImageURL)
                     TSFileManagerTool.copyFileWithOverwrite(from: videoURL, to: saveVideoURL)
-                    
-                    
+
                     let itemModel = TSImageDataItemModel()
                     itemModel.imageUrl = TSFileManagerTool.getCacheSubPath(at: saveImageURL)!
                     itemModel.videoUrl = TSFileManagerTool.getCacheSubPath(at: saveVideoURL)!
@@ -217,28 +204,25 @@ extension TSEditLiveVC{
                     kImageDataCenterShared.editLiveHistoryListArray = [self.editLiveHistorySectionModel]
                     self.reloadView()
                 }
-            }else {
+            } else {
                 debugPrint("Live Photo Not Saved,The live photo was not saved to Photos.")
             }
         }
-        
-        
-        
-        
+
 //        let ts = Date().timeIntervalSince1970
 //        let documentURL = TSFileManagerTool.documentsDirectory.appendingPathComponent("\(Int(ts)).mov")
-//        let documentURL = TSFileManagerTool.documentsDirectory    
+//        let documentURL = TSFileManagerTool.documentsDirectory
 //        Converter4Video(path: videoPath.path).resizeVideo(at: videoPath.path, outputPath: documentURL.path, outputSize: CGSize(width: 1080, height: 1920)) { success, error in
 //            guard success else{
 //                debugPrint(error)
 //                return
 //            }
-//         
+//
 //            LivePhoto.generate(from: nil, videoURL: documentURL) { progress in
-//    
+//
 //            } completion: {[weak self] (livePhoto, resources) in
 //                guard let self = self else { return }
-//    
+//
 //                if let resources = resources {
 //                    LivePhoto.saveToLibrary(resources, completion: { (success) in
 //                        kExecuteOnMainThread {
@@ -249,7 +233,7 @@ extension TSEditLiveVC{
 //                            }else {
 //                                debugPrint("Live Photo Not Saved,The live photo was not saved to Photos.")
 //                            }
-//    
+//
 //                            TSFileManagerTool.removeItem(from: resources.pairedImage)
 //                            TSFileManagerTool.removeItem(from: resources.pairedVideo)
 //                        }
@@ -257,16 +241,16 @@ extension TSEditLiveVC{
 //                }
 //            }
 //        }
-        
+
 //        LivePhoto.resizeVideoToFixedHeight(videoURL: videoPath, outputFolder: documentURL) { outputURL in
 //            if let outputURL = outputURL {
 //                print("Resized video saved to: \(outputURL)")
-//                
+//
 //                LivePhoto.generate(from: nil, videoURL: outputURL) { progress in
-//        
+//
 //                } completion: {[weak self] (livePhoto, resources) in
 //                    guard let self = self else { return }
-//        
+//
 //                    if let resources = resources {
 //                        LivePhoto.saveToLibrary(resources, completion: { (success) in
 //                            kExecuteOnMainThread {
@@ -277,46 +261,41 @@ extension TSEditLiveVC{
 //                                }else {
 //                                    debugPrint("Live Photo Not Saved,The live photo was not saved to Photos.")
 //                                }
-//        
+//
 //                                TSFileManagerTool.removeItem(from: resources.pairedImage)
 //                                TSFileManagerTool.removeItem(from: resources.pairedVideo)
 //                            }
 //                        })
 //                    }
 //                }
-//                
+//
 //            } else {
 //                print("Failed to resize video.")
 //            }
 //        }
-        
-        
-        
 
-
-        
 //        VideoRecorder.shared.saveLivePhoto(duration: 2.5, outputDirectory: TSFileManagerTool.saveLiveVideoPathURL) { [weak self] recordHandler in
 //
-////                    recordHandler?()
-//        
+        ////                    recordHandler?()
+//
 //        } completion: { [weak self] videoURL, imageURL, errorMsg in
 //            guard let self = self else { return }
-////        }
-////        LivePhotoCreater().saveLivePhoto(from: videoPath, outputDirectory: TSFileManagerTool.saveLiveVideoPathURL) { videoURL, imageURL, errorMsg in
+        ////        }
+        ////        LivePhotoCreater().saveLivePhoto(from: videoPath, outputDirectory: TSFileManagerTool.saveLiveVideoPathURL) { videoURL, imageURL, errorMsg in
 //            if let imageURL = imageURL,let videoURL = videoURL {
 //                LivePhotoConverter.saveToLibrary(videoURL: videoURL, imageURL: imageURL) { success in
 //                    kSavePhotoSuccesswShared.show(atView: self.view)
 //                }
-//                
-//                
+//
+//
 //                let saveURL = TSFileManagerTool.saveLiveVideoPathURL
 //                let timestampString = Date.timestampString
 //                let saveImageURL = saveURL.appendingPathComponent("image\(timestampString).heic")
 //                let saveVideoURL = saveURL.appendingPathComponent("video\(timestampString).mov")
 //                TSFileManagerTool.copyFileWithOverwrite(from: imageURL, to: saveImageURL)
 //                TSFileManagerTool.copyFileWithOverwrite(from: videoURL, to: saveVideoURL)
-//                
-//                
+//
+//
 //                let itemModel = TSImageDataItemModel()
 //                itemModel.imageUrl = TSFileManagerTool.getCacheSubPath(at: saveImageURL)!
 //                itemModel.videoUrl = TSFileManagerTool.getCacheSubPath(at: saveVideoURL)!
@@ -326,32 +305,32 @@ extension TSEditLiveVC{
 //            }
 //        }
     }
-    
+
 //    func saveLivePhotoVideoRecorder(){
-//        
-//        
+//
+//
 //        VideoRecorder.shared.saveLivePhoto(duration: 3.0, outputDirectory: TSFileManagerTool.saveLiveVideoPathURL) { [weak self] recordHandler in
 //
-////                    recordHandler?()
-//        
+    ////                    recordHandler?()
+//
 //        } completion: { [weak self] videoURL, imageURL, errorMsg in
 //            guard let self = self else { return }
-////        }
-////        LivePhotoCreater().saveLivePhoto(from: videoPath, outputDirectory: TSFileManagerTool.saveLiveVideoPathURL) { videoURL, imageURL, errorMsg in
+    ////        }
+    ////        LivePhotoCreater().saveLivePhoto(from: videoPath, outputDirectory: TSFileManagerTool.saveLiveVideoPathURL) { videoURL, imageURL, errorMsg in
 //            if let imageURL = imageURL,let videoURL = videoURL {
 //                LivePhotoConverter.saveToLibrary(videoURL: videoURL, imageURL: imageURL) { success in
 //                    kSavePhotoSuccesswShared.show(atView: self.view)
 //                }
-//                
-//                
+//
+//
 //                let saveURL = TSFileManagerTool.saveLiveVideoPathURL
 //                let timestampString = Date.timestampString
 //                let saveImageURL = saveURL.appendingPathComponent("image\(timestampString).heic")
 //                let saveVideoURL = saveURL.appendingPathComponent("video\(timestampString).mov")
 //                TSFileManagerTool.copyFileWithOverwrite(from: imageURL, to: saveImageURL)
 //                TSFileManagerTool.copyFileWithOverwrite(from: videoURL, to: saveVideoURL)
-//                
-//                
+//
+//
 //                let itemModel = TSImageDataItemModel()
 //                itemModel.imageUrl = TSFileManagerTool.getCacheSubPath(at: saveImageURL)!
 //                itemModel.videoUrl = TSFileManagerTool.getCacheSubPath(at: saveVideoURL)!
@@ -362,29 +341,10 @@ extension TSEditLiveVC{
 //        }
 //    }
 }
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
 
 // MARK: - PHPickerViewControllerDelegate
-//extension TSEditLiveVC: PHPickerViewControllerDelegate {
+
+// extension TSEditLiveVC: PHPickerViewControllerDelegate {
 //
 //    /// Present `PHPickerViewController`
 //    func pick(_ filter: PHPickerFilter) {
@@ -443,7 +403,4 @@ extension TSEditLiveVC{
 //        }
 //        return cachesDirectory
 //    }
-//}
-
-
-
+// }

+ 40 - 19
TSLiveWallpaper/Business/TSHomeVC/TSHomeVC.swift

@@ -10,12 +10,11 @@ import TYCyclePagerView
 import Photos
 import PhotosUI
 
-class TSHomeVC : TSBaseVC {
-
+class TSHomeVC: TSBaseVC {
     lazy var navBarView: TSBaseNavContentBarView = {
         let navBarView = TSBaseNavContentBarView()
-        let titleImageView = UIImageView.createImageView(imageName: "nav_title_home",contentMode: .scaleToFill)
-        
+        let titleImageView = UIImageView.createImageView(imageName: "nav_title_home", contentMode: .scaleToFill)
+
         navBarView.barView.addSubview(titleImageView)
         titleImageView.snp.makeConstraints { make in
             make.centerY.equalToSuperview()
@@ -25,48 +24,70 @@ class TSHomeVC : TSBaseVC {
         return navBarView
     }()
 
+    lazy var diyButton: SpacedButton = {
+        let btn = SpacedButton()
+        btn.setTitle("DIY Live Wallpaper", for: .normal)
+        btn.setTitleColor(.black, for: .normal)
+        btn.setImage(UIImage(named: "ic_diy_wallpaper"), for: .normal)
+        btn.setBackgroundImage(UIImage(named: "ic_gen_button"), for: .normal)
+        btn.addTarget(self, action: #selector(showDiyPaperController), for: .touchUpInside)
+        return btn
+    }()
+
     lazy var collectionComponent: CollectionViewComponent = {
         let layout = UICollectionViewFlowLayout()
-        let cp = CollectionViewComponent(frame: CGRect.zero, layout: layout, attributes: [ :])
+        let cp = CollectionViewComponent(frame: CGRect.zero, layout: layout, attributes: [:])
         cp.collectionView.contentInset = UIEdgeInsets(top: 0, left: 0, bottom: k_Height_TabBar, right: 0)
-        cp.itemDidSelectedHandler = { [weak self] (object, indexPath) in
+        cp.itemDidSelectedHandler = { [weak self] _, indexPath in
             guard let self = self else { return }
 
             let obj = dataArray.safeObj(At: indexPath.section)
             if let bannerModel = obj as? TSHomeBannerDataSectionModel {
-                if let items = bannerModel.itemModels.first{
-                    kPresentModalVC(target: self, modelVC: TSLiveWallpaperBrowseVC(itemModels: items.items,currentIndex: indexPath.row))
+                if let items = bannerModel.itemModels.first {
+                    kPresentModalVC(target: self, modelVC: TSLiveWallpaperBrowseVC(itemModels: items.items, currentIndex: indexPath.row))
                 }
-            }else if let liveModel = obj as? TSImageDataSectionModel {
-                kPresentModalVC(target: self, modelVC: TSLiveWallpaperBrowseVC(itemModels: liveModel.items,currentIndex: indexPath.row))
+            } else if let liveModel = obj as? TSImageDataSectionModel {
+                kPresentModalVC(target: self, modelVC: TSLiveWallpaperBrowseVC(itemModels: liveModel.items, currentIndex: indexPath.row))
             }
         }
 
         return cp
     }()
-    
-    var dataArray:[Component] = kImageDataCenterShared.liveBannerArray + kImageDataCenterShared.liveListArray
+
+    var dataArray: [Component] = kImageDataCenterShared.liveBannerArray + kImageDataCenterShared.liveListArray
     override func createView() {
         setViewBgImageNamed(named: "view_main_bg")
-        
+
         navBarContentView.addSubview(navBarView)
         navBarView.snp.makeConstraints { make in
             make.edges.equalToSuperview()
         }
-        
+
+        contentView.addSubview(diyButton)
+        diyButton.snp.makeConstraints { make in
+            make.horizontalEdges.equalToSuperview().inset(16)
+            make.top.equalToSuperview().offset(16)
+            make.height.equalTo(60)
+        }
+
         contentView.addSubview(collectionComponent.collectionView)
         collectionComponent.collectionView.snp.makeConstraints { make in
-            make.edges.equalToSuperview()
+            make.top.equalTo(diyButton.snp.bottom)
+            make.leading.trailing.bottom.equalToSuperview()
         }
-   
-        collectionComponent.reloadView(with:dataArray)
-        
+
+        collectionComponent.reloadView(with: dataArray)
+
         TSNetworkShard.monitorNetworkPermission { success in
             if success {
                 self.collectionComponent.reloadData()
             }
         }
-        
     }
 
+    @objc func showDiyPaperController() {
+        let vc = TSEditLiveVC()
+        vc.modalPresentationStyle = .overFullScreen
+        present(vc, animated: true)
+    }
 }

+ 2 - 3
TSLiveWallpaper/Business/TSMusic/Detail/Controller/PlayDetailViewController.swift

@@ -159,7 +159,6 @@ class PlayDetailViewController: LWBGViewController {
         guard let mVideo = video else {
             return
         }
-        playControl.view.isHidden = false
         if mVideo.isOnline {
             placeHolderView.isHidden = true
             playControl.player.presentView.placeholderImageView.kf.setImage(with: mVideo.iconUrl)
@@ -167,9 +166,9 @@ class PlayDetailViewController: LWBGViewController {
             playControl.player.presentView.placeholderImageView.image = nil
             if mVideo.isAudio {
                 placeHolderView.isHidden = false
-                playControl.view.isHidden = true
+                placeHolderView.iconView.image = UIImage(named: "ic_default")
             } else {
-                print("placeHolderView.frame === \(placeHolderView.frame)")
+                placeHolderView.iconView.kf.setImage(with: mVideo.iconUrl)
                 if mVideo.videoStatus == .cached {
                     placeHolderView.isHidden = true
                 } else {

+ 8 - 2
TSLiveWallpaper/Business/TSMusic/Detail/PlayerManager.swift

@@ -184,6 +184,10 @@ class PlayerManager {
                 $0.videoId
             }
 
+            let needRestart = videoIds.contains { id in
+                id == TSVideoOperator.shared.playerViewModel.currentVideo?.videoId
+            }
+            
             TSVideoOperator.shared.dataManager.deleteVideos(videos: self.selectedVideos) { _ in
 
                 PlayerManager.shared.hideMutiOperateView()
@@ -194,8 +198,10 @@ class PlayerManager {
                 // 播放删完列表后的第一首
                 let newVideos = TSVideoOperator.shared.playerViewModel.currentVideos
                 if let video = newVideos.first {
-                    /// 播放的时候回刷新列表不用重复刷
-                    TSVideoOperator.shared.playerController.playVideo(video: video, list: newVideos, scene: .local)
+                    if needRestart {
+                        /// 播放的时候回刷新列表不用重复刷
+                        TSVideoOperator.shared.playerController.playVideo(video: video, list: newVideos, scene: .local)
+                    }
                     /// 发送刷新通知
                     NotificationCenter.default.post(name: .K_RefreshNotifaction, object: nil)
                 } else {

+ 10 - 11
TSLiveWallpaper/Business/TSMusic/Helper/FilterBarViewModel.swift

@@ -18,20 +18,20 @@ class FilterBarViewModel {
     @Published var barType: MineRingTopType = .default
     @Published var selectedVideos: [TSVideo] = []
     @Published var sortType: SortType = .downTime
-    var playlist : TSPlayList?
-    var isFromPlaylist : Bool = false
-    
+    var playlist: TSPlayList?
+    var isFromPlaylist: Bool = false
+
     init(videos: [TSVideo], barTyle: MineRingTopType, selectedVideos: [TSVideo], sortType: SortType) {
         self.videos = videos
-        self.barType = barTyle
+        barType = barTyle
         self.selectedVideos = selectedVideos
         self.sortType = sortType
     }
-    
+
     var selectTitle: String {
         return "Select All".localized() + " (\(selectedVideos.count)/\(videos.count)) "
     }
-    
+
     var playTitle: String {
         return "Play All".localized() + " (\(videos.count)) "
     }
@@ -48,24 +48,23 @@ class FilterBarViewModel {
     /// 播放全部按钮
     func playAllVideos() {
         if let firstVideo = videos.first {
-            PlayerManager.shared.playVideo(video: firstVideo, list: videos, scene: .local,onceAdKey: "")
+            PlayerManager.shared.player?.playControl.viewModel.loopMode = .cyclic
+            PlayerManager.shared.playVideo(video: firstVideo, list: videos, scene: .local, onceAdKey: "")
         }
     }
 
     /// 多选按钮点击
     func beginMutiSelect() {
         barType = .mutiselect
-        PlayerManager.shared.showMutiOperateView(isFromPlaylist: isFromPlaylist,playlist: playlist)
+        PlayerManager.shared.showMutiOperateView(isFromPlaylist: isFromPlaylist, playlist: playlist)
     }
 
-    
     /// 多选取消
     func doneMutiSelect() {
         barType = .default
         PlayerManager.shared.hideMutiOperateView()
     }
-    
-    
+
     /// 加入选中列表
     /// - Parameter video: video
     func addToSelectedList(video: TSVideo) {

+ 2 - 2
TSLiveWallpaper/Business/TSMusic/List/View/SongListCell.swift

@@ -79,8 +79,8 @@ class SongListCell: UITableViewCell {
     func bindData(video: TSVideo, isMutiSelected: Bool = false, isSelected: Bool = false, needOperate: Bool = false) {
         mVideo = video
         self.needOperate = needOperate
-        let isPlaying = mVideo?.videoId == PlayerManager.shared.currentVideo?.videoId
-        playingTag.isHidden = !isPlaying
+        let isPlaying = video.videoId == PlayerManager.shared.currentVideo?.videoId
+        titleLabel.textColor = isPlaying ? .hexColor("#89FC42") : .white
 
         isMuti = isMutiSelected
         titleLabel.text = video.title

+ 2 - 0
TSLiveWallpaper/Business/TSMusic/PlayList/Controller/PlaylistViewController.swift

@@ -54,6 +54,8 @@ class PlaylistViewController: LWBGViewController, UITableViewDelegate {
         }.store(in: &canncellable)
 
         NotificationCenter.default.addObserver(self, selector: #selector(reloadData), name: .K_RefreshNotifaction, object: nil)
+        NotificationCenter.default.addObserver(self, selector: #selector(reloadData), name: kDataChangedNotifactionName, object: nil)
+
     }
 
     @objc func reloadData() {

+ 1 - 1
TSLiveWallpaper/Common/BaseClass/TSBaseVC.swift

@@ -214,7 +214,7 @@ class TSBaseVC: UIViewController {
 //        // 子类可重写
 //    }
 //
-    func pop() {
+    @objc func pop() {
         if navigationController == nil {
             dismiss(animated: true, completion: nil)
         } else if navigationController?.presentingViewController != nil, navigationController?.viewControllers.count == 1 {

+ 1 - 1
TSLiveWallpaper/Common/Purchase/TSPurchaseManager.swift

@@ -112,7 +112,7 @@ public class PurchaseManager: NSObject {
 
     public var expiredDateString: String {
         if vipType == .lifetime{
-            return "Life Time"
+            return "LifeTime"
         } else {
             if let expDate = expiredDate {
                 let format = DateFormatter()