Forráskód Böngészése

3.6.25(1)添加diy视频代码结构

100Years 1 hete
szülő
commit
7772152c5c

+ 56 - 4
AIEmoji.xcodeproj/project.pbxproj

@@ -343,6 +343,11 @@
 		A8F7764B2D3E008500AA6E93 /* TSEmojisChildColViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8F7764A2D3E007100AA6E93 /* TSEmojisChildColViewModel.swift */; };
 		A8F7764E2D3E00A800AA6E93 /* TSEmojisColViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8F7764D2D3E00A000AA6E93 /* TSEmojisColViewModel.swift */; };
 		A8F7D33E2DF18A1800DDBECE /* arrow.gif in Resources */ = {isa = PBXBuildFile; fileRef = A8F7D33D2DF18A1800DDBECE /* arrow.gif */; };
+		A8F9F3002E376B31007FE237 /* TSAIDiyVideoVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8F9F2FE2E376B31007FE237 /* TSAIDiyVideoVC.swift */; };
+		A8F9F3032E376DE3007FE237 /* TSAIDiyVideoGenerateModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8F9F3022E376DBD007FE237 /* TSAIDiyVideoGenerateModel.swift */; };
+		A8F9F3072E3773CC007FE237 /* TSAIDiyVideoTTVVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8F9F3062E3773CA007FE237 /* TSAIDiyVideoTTVVC.swift */; };
+		A8F9F3092E3773D2007FE237 /* TSAIDiyVideoPTVVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8F9F3082E3773CF007FE237 /* TSAIDiyVideoPTVVC.swift */; };
+		A8F9F30D2E377935007FE237 /* TSAIDiyVideoTTBaseVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8F9F30C2E377923007FE237 /* TSAIDiyVideoTTBaseVC.swift */; };
 		A8FB02B32D3E39A40031A396 /* TSEmojisModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8FB02B22D3E399F0031A396 /* TSEmojisModel.swift */; };
 		A8FB02B72D3E3A3D0031A396 /* TSEmojisChildViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8FB02B62D3E3A3B0031A396 /* TSEmojisChildViewModel.swift */; };
 		A8FB02BA2D3E3BB20031A396 /* TSEmojisCoLItemCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8FB02B92D3E3BB00031A396 /* TSEmojisCoLItemCell.swift */; };
@@ -724,6 +729,11 @@
 		A8F7764A2D3E007100AA6E93 /* TSEmojisChildColViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TSEmojisChildColViewModel.swift; sourceTree = "<group>"; };
 		A8F7764D2D3E00A000AA6E93 /* TSEmojisColViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TSEmojisColViewModel.swift; sourceTree = "<group>"; };
 		A8F7D33D2DF18A1800DDBECE /* arrow.gif */ = {isa = PBXFileReference; lastKnownFileType = image.gif; path = arrow.gif; sourceTree = "<group>"; };
+		A8F9F2FE2E376B31007FE237 /* TSAIDiyVideoVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TSAIDiyVideoVC.swift; sourceTree = "<group>"; };
+		A8F9F3022E376DBD007FE237 /* TSAIDiyVideoGenerateModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TSAIDiyVideoGenerateModel.swift; sourceTree = "<group>"; };
+		A8F9F3062E3773CA007FE237 /* TSAIDiyVideoTTVVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TSAIDiyVideoTTVVC.swift; sourceTree = "<group>"; };
+		A8F9F3082E3773CF007FE237 /* TSAIDiyVideoPTVVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TSAIDiyVideoPTVVC.swift; sourceTree = "<group>"; };
+		A8F9F30C2E377923007FE237 /* TSAIDiyVideoTTBaseVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TSAIDiyVideoTTBaseVC.swift; sourceTree = "<group>"; };
 		A8FB02B22D3E399F0031A396 /* TSEmojisModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TSEmojisModel.swift; sourceTree = "<group>"; };
 		A8FB02B62D3E3A3B0031A396 /* TSEmojisChildViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TSEmojisChildViewModel.swift; sourceTree = "<group>"; };
 		A8FB02B92D3E3BB00031A396 /* TSEmojisCoLItemCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TSEmojisCoLItemCell.swift; sourceTree = "<group>"; };
@@ -1867,6 +1877,7 @@
 		A8B70BC32E06B9AE003177FA /* Business2 */ = {
 			isa = PBXGroup;
 			children = (
+				A8F9F2FF2E376B31007FE237 /* DIYVideo */,
 				A8708A4B2E0C0A8100601686 /* CommonVC */,
 				A8708A4A2E0C0A5000601686 /* DisCover */,
 			);
@@ -2450,6 +2461,42 @@
 			path = ViewModel;
 			sourceTree = "<group>";
 		};
+		A8F9F2FF2E376B31007FE237 /* DIYVideo */ = {
+			isa = PBXGroup;
+			children = (
+				A8F9F3052E3773BC007FE237 /* TSAIDiyVideoTTVVC */,
+				A8F9F3042E377373007FE237 /* TSAIDiyVideoPTVVC */,
+				A8F9F3012E376DAE007FE237 /* Model */,
+				A8F9F2FE2E376B31007FE237 /* TSAIDiyVideoVC.swift */,
+			);
+			path = DIYVideo;
+			sourceTree = "<group>";
+		};
+		A8F9F3012E376DAE007FE237 /* Model */ = {
+			isa = PBXGroup;
+			children = (
+				A8F9F3022E376DBD007FE237 /* TSAIDiyVideoGenerateModel.swift */,
+			);
+			path = Model;
+			sourceTree = "<group>";
+		};
+		A8F9F3042E377373007FE237 /* TSAIDiyVideoPTVVC */ = {
+			isa = PBXGroup;
+			children = (
+				A8F9F3082E3773CF007FE237 /* TSAIDiyVideoPTVVC.swift */,
+			);
+			path = TSAIDiyVideoPTVVC;
+			sourceTree = "<group>";
+		};
+		A8F9F3052E3773BC007FE237 /* TSAIDiyVideoTTVVC */ = {
+			isa = PBXGroup;
+			children = (
+				A8F9F30C2E377923007FE237 /* TSAIDiyVideoTTBaseVC.swift */,
+				A8F9F3062E3773CA007FE237 /* TSAIDiyVideoTTVVC.swift */,
+			);
+			path = TSAIDiyVideoTTVVC;
+			sourceTree = "<group>";
+		};
 		A8FB02AE2D3E38FA0031A396 /* Res */ = {
 			isa = PBXGroup;
 			children = (
@@ -2761,8 +2808,10 @@
 				A80EDD472D6C3F82003CD332 /* MarkdownItalic.swift in Sources */,
 				A80EDD482D6C3F82003CD332 /* MarkdownBold.swift in Sources */,
 				A80EDD4A2D6C3F82003CD332 /* MarkdownLevelElement.swift in Sources */,
+				A8F9F3092E3773D2007FE237 /* TSAIDiyVideoPTVVC.swift in Sources */,
 				A80EDD4B2D6C3F82003CD332 /* MarkdownParser+AppKit.swift in Sources */,
 				A8708A4E2E0C0A8900601686 /* TSAppUpdateAlertVC.swift in Sources */,
+				A8F9F3032E376DE3007FE237 /* TSAIDiyVideoGenerateModel.swift in Sources */,
 				A80EDD4C2D6C3F82003CD332 /* Typealias.swift in Sources */,
 				A8BA76632DA64A84000B6707 /* TSAILIstCell.swift in Sources */,
 				A80EDD4D2D6C3F82003CD332 /* MarkdownStrikethrough.swift in Sources */,
@@ -2819,6 +2868,7 @@
 				A80EDD622D6C3F82003CD332 /* MarkdownLink.swift in Sources */,
 				A8BA76722DA65A95000B6707 /* TSAIUploadPhotoBaseVC.swift in Sources */,
 				A80EDD632D6C3F82003CD332 /* MarkdownAutomaticLink.swift in Sources */,
+				A8F9F30D2E377935007FE237 /* TSAIDiyVideoTTBaseVC.swift in Sources */,
 				A80EDD642D6C3F82003CD332 /* MarkdownStyle.swift in Sources */,
 				A81BECAE2DD31FF0005D06A2 /* TYCycleImageComparisonView.swift in Sources */,
 				A89EA6CF2D6430F3000EB181 /* TSChatViewController+Keyboard.swift in Sources */,
@@ -2852,6 +2902,7 @@
 				A82D609E2DBA0FEA00596190 /* TSAppBtnView.swift in Sources */,
 				A82D608B2DB9CE7E00596190 /* MXParallaxHeader+Ex.swift in Sources */,
 				A89EA6AC2D5B3EFB000EB181 /* TSRealmManager.swift in Sources */,
+				A8F9F3002E376B31007FE237 /* TSAIDiyVideoVC.swift in Sources */,
 				A8B70BC92E08E416003177FA /* TSGenerateHistoryVC.swift in Sources */,
 				A8BA76772DA68619000B6707 /* TSAIListHistoryBaseVM.swift in Sources */,
 				A8708A452E0BD7E200601686 /* TSAIGenerateBaseVC+Expand.swift in Sources */,
@@ -2895,6 +2946,7 @@
 				A82D60952DB9D45900596190 /* TSGeneratePosterOperation.swift in Sources */,
 				A82D60972DB9D45900596190 /* TSBaseOperationQueue.swift in Sources */,
 				A82D60982DB9D45900596190 /* TSBaseOperation.swift in Sources */,
+				A8F9F3072E3773CC007FE237 /* TSAIDiyVideoTTVVC.swift in Sources */,
 				A8BA76452DA4CB9A000B6707 /* TSPTPUploadView.swift in Sources */,
 				A85E479F2D6859FA0018D62D /* TSRandomTextPicker.swift in Sources */,
 				A8BA76522DA51600000B6707 /* TSPTPImageHintVC.swift in Sources */,
@@ -3048,7 +3100,7 @@
 				ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
 				CLANG_ENABLE_MODULES = YES;
 				CODE_SIGN_STYLE = Automatic;
-				CURRENT_PROJECT_VERSION = 3;
+				CURRENT_PROJECT_VERSION = 1;
 				DEVELOPMENT_TEAM = 65UD255J84;
 				ENABLE_USER_SCRIPT_SANDBOXING = NO;
 				GENERATE_INFOPLIST_FILE = YES;
@@ -3064,7 +3116,7 @@
 					"$(inherited)",
 					"@executable_path/Frameworks",
 				);
-				MARKETING_VERSION = 3.6.24;
+				MARKETING_VERSION = 3.6.25;
 				PRODUCT_BUNDLE_IDENTIFIER = com.girl.music.wallpaper;
 				PRODUCT_NAME = "$(TARGET_NAME)";
 				SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
@@ -3087,7 +3139,7 @@
 				ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
 				CLANG_ENABLE_MODULES = YES;
 				CODE_SIGN_STYLE = Automatic;
-				CURRENT_PROJECT_VERSION = 3;
+				CURRENT_PROJECT_VERSION = 1;
 				DEVELOPMENT_TEAM = 65UD255J84;
 				ENABLE_USER_SCRIPT_SANDBOXING = NO;
 				GENERATE_INFOPLIST_FILE = YES;
@@ -3103,7 +3155,7 @@
 					"$(inherited)",
 					"@executable_path/Frameworks",
 				);
-				MARKETING_VERSION = 3.6.24;
+				MARKETING_VERSION = 3.6.25;
 				PRODUCT_BUNDLE_IDENTIFIER = com.girl.music.wallpaper;
 				PRODUCT_NAME = "$(TARGET_NAME)";
 				SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";

+ 20 - 0
AIEmoji/Business2/DIYVideo/Model/TSAIDiyVideoGenerateModel.swift

@@ -0,0 +1,20 @@
+//
+//  TSAIDiyVideoGenerateModel.swift
+//  AIEmoji
+//
+//  Created by 100Years on 2025/7/28.
+//
+
+
+
+class TSAIDiyVideoGenerateModel: TSBaseModel {
+    
+    
+    
+//    图生视频:接 Vidu Q1 和 Vidu 2
+//    文生视频:接 Vidu Q1
+    var aiModel:String = "ViduQ1"
+    var videoLength:Int = 5
+    
+    
+}

+ 17 - 0
AIEmoji/Business2/DIYVideo/TSAIDiyVideoPTVVC/TSAIDiyVideoPTVVC.swift

@@ -0,0 +1,17 @@
+//
+//  TSAIDiyVideoPTVVC.swift
+//  AIEmoji
+//
+//  Created by 100Years on 2025/7/28.
+//
+
+class TSAIDiyVideoPTVVC: TSAIDiyVideoTTBaseVC {
+    
+    
+    override func createView() {
+        super.createView()
+        
+        view.backgroundColor = .blue.withAlphaComponent(0.1)
+        
+    }
+}

+ 91 - 0
AIEmoji/Business2/DIYVideo/TSAIDiyVideoTTVVC/TSAIDiyVideoTTBaseVC.swift

@@ -0,0 +1,91 @@
+//
+//  TSAIDiyVideoTTBaseVC.swift
+//  AIEmoji
+//
+//  Created by 100Years on 2025/7/28.
+//
+
+
+
+import BetterSegmentedControl
+class TSAIDiyVideoTTBaseVC: TSBaseVC {
+    
+    
+    var videoGenerateModel:TSAIDiyVideoGenerateModel = TSAIDiyVideoGenerateModel()
+    
+    lazy var segmentedView: BetterSegmentedControl = {
+        let segmentedView = BetterSegmentedControl(
+            frame: .zero,
+            segments:
+                LabelSegment.segments(
+                    withTitles: ["4s".localized,"8s".localized],
+                    normalFont: .font(size: 12.0),
+                    normalTextColor: .white.withAlphaComponent(0.8),
+                    selectedFont: .font(size: 12.0,weight: .medium),
+                    selectedTextColor: .themeColor),
+            options:[.backgroundColor(.clear),
+                     .indicatorViewBackgroundColor(.clear),
+                     .indicatorViewBorderWidth(1),
+                     .indicatorViewBorderColor(UIColor.themeColor),
+                     .indicatorViewInset(2),
+                     .cornerRadius(20.0),
+                     .animationSpringDamping(1.0)]
+        )
+        segmentedView.addTarget(self,action: #selector(segmentedControlValueChanged(_:)),for: .valueChanged)
+        return segmentedView
+    }()
+    
+    
+    @objc func segmentedControlValueChanged(_ sender: BetterSegmentedControl) {
+        if sender.index == 0 {
+            dePrint("11111")
+        }else{
+            dePrint("22222")
+        }
+    }
+    
+    
+    lazy var cusStackView: TSCustomStackView = {
+        let cusStackView = TSCustomStackView(axis: .vertical,alignment: .center,spacing: 0)
+        return cusStackView
+    }()
+    
+    
+    override func createView() {
+        setNavBarViewHidden(true)
+        
+        contentView.addSubview(cusStackView)
+        cusStackView.snp.makeConstraints { make in
+            make.leading.equalTo(0)
+            make.trailing.equalTo(0)
+            make.bottom.equalTo(0)
+            make.top.equalTo(0)
+        }
+
+
+        let headerView = UIView()
+        headerView.backgroundColor = .red.withAlphaComponent(0.5)
+        cusStackView.addSubviewToStack(headerView, length: 48)
+        
+        
+        cusStackView.addSpacing(length: 10)
+        
+        cusStackView.addArrangedSubview(segmentedView)
+        segmentedView.snp.makeConstraints { make in
+            make.leading.equalTo(16)
+            make.trailing.equalTo(-16)
+            make.height.equalTo(40)
+        }
+        
+        let blueheaderView = UIView()
+        blueheaderView.backgroundColor = .blue.withAlphaComponent(0.5)
+        cusStackView.addSubviewToStack(blueheaderView, length: 88)
+        
+        
+    }
+}
+
+import JXSegmentedView
+extension TSAIDiyVideoTTBaseVC: JXSegmentedListContainerViewListDelegate {
+    func listView() -> UIView { return view }
+}

+ 22 - 0
AIEmoji/Business2/DIYVideo/TSAIDiyVideoTTVVC/TSAIDiyVideoTTVVC.swift

@@ -0,0 +1,22 @@
+//
+//  TSAIDiyVideoTTVVC.swift
+//  AIEmoji
+//
+//  Created by 100Years on 2025/7/28.
+//
+
+
+class TSAIDiyVideoTTVVC: TSAIDiyVideoTTBaseVC {
+    
+    
+    
+    override func createView() {
+        super.createView()
+   
+
+        view.backgroundColor = .red.withAlphaComponent(0.1)
+        
+
+
+    }
+}

+ 173 - 0
AIEmoji/Business2/DIYVideo/TSAIDiyVideoVC.swift

@@ -0,0 +1,173 @@
+//
+//  TSAIDiyVideoVC.swift
+//  TSLiveWallpaper
+//
+//  Created by 100Years on 2025/7/28.
+//
+
+import JXSegmentedView
+
+let segmentedBgColor:UIColor = "#292929".uiColor
+
+class TSAIDiyVideoVC: TSBaseVC {
+    
+    var diyVideoType:Int = 0 //0 图生视频,1 文生视频
+    
+    
+    //选择生成的视频参数模型
+    var selectedGenerateModel:TSAIDiyVideoGenerateModel?{
+        
+        if let vc = viewControllers[segmentedView.selectedIndex] as? TSAIDiyVideoTTBaseVC{
+            return vc.videoGenerateModel
+        }
+        return nil
+    }
+    
+    lazy var listContainerView: JXSegmentedListContainerView = {
+        let listContainerView = JXSegmentedListContainerView(dataSource: self)
+        listContainerView.frame = CGRect(x: 0, y: 48, width: UIScreen.main.bounds.size.width, height: k_ScreenHeight - k_Nav_Height - 48)
+        return listContainerView
+    }()
+
+    lazy var segmentedDataSource: JXSegmentedTitleDataSource = {
+        let dataSource = JXSegmentedTitleDataSource()
+        dataSource.isTitleColorGradientEnabled = true
+        dataSource.isItemSpacingAverageEnabled = false
+        dataSource.itemSpacing = 0
+        dataSource.itemWidth = (k_ScreenWidth-36)/2.0
+        dataSource.titles = ["Image to Video".localized,"Text to Video".localized]
+        dataSource.titleNormalColor = .white.withAlphaComponent(0.8)
+        dataSource.titleSelectedColor = "#111111".uiColor
+        dataSource.titleNormalFont = .font(size: 12.0)
+        dataSource.titleSelectedFont = .font(size: 12.0,weight: .medium)
+        return dataSource
+    }()
+    
+    //配置指示器
+    lazy var indicator: JXSegmentedIndicatorBackgroundView = {
+        let indicator = JXSegmentedIndicatorBackgroundView()
+        indicator.indicatorWidth = JXSegmentedViewAutomaticDimension
+        indicator.indicatorHeight = 36
+        indicator.indicatorColor = .themeColor
+        indicator.cornerRadius = 18
+        return indicator
+    }()
+    
+
+    lazy var segmentedView: JXSegmentedView = {
+        let segmentedView = JXSegmentedView(frame: CGRect(x: 16, y: 8, width: UIScreen.main.bounds.size.width-32, height: 40.0))
+        segmentedView.delegate = self
+        segmentedView.indicators = [indicator]
+        segmentedView.dataSource = segmentedDataSource
+        segmentedView.backgroundColor = segmentedBgColor
+//        segmentedView.contentEdgeInsetLeft = 2
+//        segmentedView.contentEdgeInsetRight = 2
+        segmentedView.listContainer = listContainerView
+        segmentedView.cornerRadius = 20
+        return segmentedView
+    }()
+    
+    lazy var viewControllers: [UIViewController] = {
+        return [TSAIDiyVideoPTVVC(), TSAIDiyVideoTTVVC()]
+    }()
+    
+    lazy var creatBtnView: TSAppBtnView = {
+        let creatBtnView = TSAppBtnView()
+        let vipFreeNumType = VipFreeNumType.videoV2
+        creatBtnView.setUpButton(style: .generate, vipFreeNumType: vipFreeNumType) { [weak self] in
+            guard let self = self else { return }
+            generateVideo()
+        }
+        creatBtnView.setBtnEnabled(isEnabled: false)
+        creatBtnView.isIconVipBlock = { [weak self] in
+            guard let self = self else { return false }
+            var showVip = kPurchaseDefault.generateVipShow(type: vipFreeNumType)
+
+            return showVip
+        }
+        creatBtnView.isClickVipBlock = { [weak self] in
+            guard let self = self else { return false }
+            var isVip = kPurchaseDefault.freeNumAvailable(type: vipFreeNumType) == false
+            return isVip
+        }
+        return creatBtnView
+    }() //Button
+    
+    
+    
+    
+    init(diyVideoType: Int) {
+        self.diyVideoType = diyVideoType
+        super.init()
+    }
+    
+    @MainActor required init?(coder: NSCoder) {
+        fatalError("init(coder:) has not been implemented")
+    }
+
+    override func createData() {
+        //初始化数据
+    }
+    
+    override func createView() {
+        setPageTitle("Create Video")
+        contentView.addSubview(segmentedView)
+        contentView.addSubview(listContainerView)
+        
+        contentView.addSubview(creatBtnView)
+        creatBtnView.snp.makeConstraints { make in
+            make.bottom.equalTo(-k_Height_safeAreaInsetsBottom())
+            make.leading.equalTo(16)
+            make.trailing.equalTo(-16)
+            make.height.equalTo(48)
+        }
+        
+    }
+    
+    override func dealThings() {
+        //监听和逻辑
+        NotificationCenter.default.addObserver(self, selector: #selector(updateVipView), name: .kPurchaseDidChanged, object: nil)
+        updateVipView()
+        creatBtnView.setBtnEnabled(isEnabled: false)//设置按钮是否满足生成条件
+    }
+    
+    @objc func updateVipView() {
+        kExecuteOnMainThread {
+            self.creatBtnView.updateVipView()
+        }
+    }
+}
+
+extension TSAIDiyVideoVC: JXSegmentedViewDelegate {
+    func segmentedView(_ segmentedView: JXSegmentedView, didSelectedItemAt index: Int) {
+        self.navigationController?.interactivePopGestureRecognizer?.isEnabled = (index == 0)
+    }
+}
+
+extension TSAIDiyVideoVC: JXSegmentedListContainerViewDataSource {
+    func numberOfLists(in listContainerView: JXSegmentedListContainerView) -> Int {
+        return viewControllers.count
+    }
+
+    func listContainerView(_ listContainerView: JXSegmentedListContainerView, initListAt index: Int) -> JXSegmentedListContainerViewListDelegate {
+        return viewControllers[index] as! JXSegmentedListContainerViewListDelegate
+    }
+}
+
+
+
+
+extension TSAIDiyVideoVC {
+    func generateVideo() {
+        
+        let generatorModel = TSAIGeneratorModel(upLoadImage: UIImage(), generatorStyle:.videoV2)
+        generatorModel.diyVideoGenerateModel = selectedGenerateModel
+        
+        let gennerateVC = TSAIGenerateVC(generatorModel: generatorModel) { [weak self] _ in
+            guard let self = self else { return }
+            updateVipView()
+        }
+
+        kPresentModalVC(target: self, modelVC: gennerateVC, transitionStyle: .crossDissolve)
+    }
+}

+ 2 - 0
AIEmoji/Business2/DisCover/Data/TSAIGeneratorModel.swift

@@ -43,4 +43,6 @@ class TSAIGeneratorModel {
         return model == kie
     }
     
+    //
+    var diyVideoGenerateModel:TSAIDiyVideoGenerateModel?
 }

+ 1 - 1
AIEmoji/Business2/DisCover/Data/TSDiscoverViewModel.swift

@@ -39,7 +39,7 @@ enum TSDiscoverViewStyle:CaseIterable {
         case .fullCard:
             return fullCardSize
         case .banner:
-            return CGSize(width: k_ScreenWidth, height: 281)
+            return CGSize(width: k_ScreenWidth, height: 312.0)
         }
     }
     

+ 1 - 1
AIEmoji/Business2/DisCover/Data/TSFuncStyle.swift

@@ -30,7 +30,7 @@ enum TSFuncStyle:Int,Equatable,CaseIterable {
     case process = 18     // 走变老变年轻那套交互流程,接口用图生图的接口
     case videoV2 = 19     //视频v2,有声音
     
-    
+
     var imageMaxKb:Int{
         switch self {
         case .oldPhoto,.eyeOpen,.pretty:

+ 57 - 2
AIEmoji/Business2/DisCover/TSDiscoverVC/Cell/TSDiscoverBannerCell.swift

@@ -53,7 +53,7 @@ class TSDiscoverBannerCell: TSDiscoverBaseCell {
         
         pagerView.addSubview(pageControl)
         pageControl.snp.makeConstraints { make in
-            make.bottom.equalTo(-4)
+            make.bottom.equalTo(-58)
             make.leading.trailing.equalTo(0)
             make.height.equalTo(14)
         }
@@ -68,12 +68,67 @@ class TSDiscoverBannerCell: TSDiscoverBaseCell {
         }
     }
     
+    
+    lazy var imageToVideoView: UIView = {
+        let view = UIView()
+        view.cornerRadius = 12
+        view.backgroundColor = "#2B2937".uiColor
+        let titleLabel = UILabel.createLabel(text: "Image to Video".localized,font: .font(size: 14.0,weight: .medium),textColor: .white,textAlignment: .center)
+        view.addSubview(titleLabel)
+        
+        titleLabel.snp.makeConstraints { make in
+            make.edges.equalToSuperview()
+        }
+        
+        view.addTapAction { [weak self]  in
+            guard let self = self else { return }
+            clickSpecialBlock?("ptv",nil)
+        }
+        return view
+    }()
+    
+    lazy var textToVideoView: UIView = {
+        let view = UIView()
+        view.cornerRadius = 12
+        view.backgroundColor = "#2B2937".uiColor
+        let titleLabel = UILabel.createLabel(text: "Text to Video".localized,font: .font(size: 14.0,weight: .medium),textColor: .white,textAlignment: .center)
+        view.addSubview(titleLabel)
+        
+        titleLabel.snp.makeConstraints { make in
+            make.top.leading.trailing.equalToSuperview()
+            make.bottom.equalTo(-30)
+        }
+        
+        view.addTapAction { [weak self]  in
+            guard let self = self else { return }
+            clickSpecialBlock?("ttv",nil)
+        }
+        return view
+    }()
+    
     override func creatUI() {
 
         addSubview(cyclePagerView)
         cyclePagerView.snp.makeConstraints { make in
             make.edges.equalToSuperview()
         }
+        
+        let itemViewW = (k_ScreenWidth-32-13)/2.0
+        addSubview(imageToVideoView)
+        imageToVideoView.snp.makeConstraints { make in
+            make.width.equalTo(itemViewW)
+            make.height.equalTo(68)
+            make.bottom.equalTo(0)
+            make.leading.equalTo(16)
+        }
+        
+        addSubview(textToVideoView)
+        textToVideoView.snp.makeConstraints { make in
+            make.width.equalTo(itemViewW)
+            make.height.equalTo(68)
+            make.bottom.equalTo(0)
+            make.trailing.equalTo(-16)
+        }
     }
 
     override func willDisplay(indexPath: IndexPath) {
@@ -217,7 +272,7 @@ class TSDiscoverBannerViewCell: TSBaseCollectionCell {
         textLabel.snp.makeConstraints { make in
             make.leading.equalTo(16)
             make.trailing.equalTo(-111)
-            make.bottom.equalTo(-18)
+            make.bottom.equalTo(-53)
             make.height.equalTo(52)
         }
         

+ 5 - 0
AIEmoji/Business2/DisCover/TSDiscoverVC/Cell/TSDiscoverBaseCell.swift

@@ -6,7 +6,12 @@
 //
 
 class TSDiscoverBaseCell: TSBaseCollectionCell {
+    
     var clickBlock:((TSDiscoverItemModel)->Void)?
+    
+    /// 点击特殊事件
+    var clickSpecialBlock:((String,Any?)->Void)?
+    
     var items:Any? {
         didSet {
             upDateModel()

+ 14 - 0
AIEmoji/Business2/DisCover/TSDiscoverVC/TSDiscoverVC.swift

@@ -160,6 +160,12 @@ extension TSDiscoverVC: UICollectionViewDataSource ,UICollectionViewDelegate,UIC
                     TSDiscoverVC.clickCell(target: self,indexPath: indexPath, itemModel:model,secModel: secModel)
                 }
             }
+            
+            cell.clickSpecialBlock = { [weak self] cmd,data in
+                guard let self = self else { return }
+                clickSpecialBlock(cmd: cmd, data: data)
+            }
+            
             return cell
         }
         return UICollectionViewCell()
@@ -268,6 +274,14 @@ extension TSDiscoverVC {
         kPushVC(target: self, modelVC: TSDiscoverStyleMoreVC(sectionModel: model))
     }
     
+    func clickSpecialBlock(cmd:String,data:Any?) {
+        if cmd == "ptv" {
+            kPushVC(target: self, modelVC:TSAIDiyVideoVC(diyVideoType: 0))
+        }else if cmd == "ttv" {
+            kPushVC(target: self, modelVC:TSAIDiyVideoVC(diyVideoType: 1))
+        }
+    }
+    
     static func clickCell(target:UIViewController,indexPath:IndexPath,itemModel:TSDiscoverItemModel,secModel:TSDiscoverSectionModel) {
         
         if itemModel.style.isInterceptMultipleGenerations,