From b89399a769921739e9668a37bf389925b6db2c7c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B9=96=E5=8C=97=E7=A7=A6=E4=B9=9D?= Date: Thu, 20 Nov 2025 16:59:32 +0800 Subject: [PATCH] =?UTF-8?q?=E9=A6=96=E6=AC=A1=E6=8F=90=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 4 +- Podfile | 35 + SynthReel.xcodeproj/project.pbxproj | 1091 +++++++++++++++++ .../contents.xcworkspacedata | 7 + .../xcshareddata/xcschemes/SynthReel.xcscheme | 78 ++ .../contents.xcworkspacedata | 10 + .../xcshareddata/swiftpm/Package.resolved | 24 + SynthReel/Base/API/SRHomeApi.swift | 92 ++ SynthReel/Base/API/SRShortApi.swift | 88 ++ SynthReel/Base/API/SRUserApi.swift | 25 + SynthReel/Base/Define/SRDefine.swift | 24 + SynthReel/Base/Define/SRUserDefaultsKey.swift | 14 + SynthReel/Base/Extension/NSNumber+SRAdd.swift | 43 + SynthReel/Base/Extension/String+SRAdd.swift | 26 + SynthReel/Base/Extension/UIFont+SRAdd.swift | 18 + SynthReel/Base/Extension/UIScreen+SRAdd.swift | 50 + .../Base/Extension/UIScrollView+SRAdd.swift | 46 + .../Base/Extension/UIStackView+SRAdd.swift | 22 + SynthReel/Base/Extension/UIView+SRAdd.swift | 92 ++ .../Base/Extension/UserDefaults+SRAdd.swift | 46 + SynthReel/Base/Networking/SRNetwork.swift | 193 +++ .../Base/Networking/SRNetworkModel.swift | 62 + .../SRNetworkReachableManager.swift | 75 ++ .../Base/Networking/SRResponseCryptor.swift | 95 ++ SynthReel/Base/Networking/SRTargetType.swift | 91 ++ SynthReel/Base/Networking/SRUrlPath.swift | 27 + SynthReel/Base/View/SRCollectionView.swift | 24 + SynthReel/Base/View/SRGradientView.swift | 45 + SynthReel/Base/View/SRImageView.swift | 100 ++ SynthReel/Base/View/SRLabel.swift | 55 + .../Base/View/SRPanModalContentView.swift | 84 ++ SynthReel/Base/View/SRScrollView.swift | 21 + SynthReel/Base/View/SRTableView.swift | 49 + SynthReel/Base/View/SRTableViewCell.swift | 48 + .../SRNavigationController.swift | 36 + .../ViewController/SRTabBarController.swift | 51 + .../ViewController/SRViewController.swift | 82 ++ SynthReel/Class/Home/M/SRCategoryModel.swift | 16 + SynthReel/Class/Home/M/SRHomeModuleItem.swift | 56 + SynthReel/Class/Home/V/SRHomeBannerCell.swift | 42 + .../Class/Home/V/SRHomeBannerMiniCell.swift | 40 + SynthReel/Class/Home/V/SRHomeBannerView.swift | 177 +++ .../Class/Home/V/SRHomeBingeWorthyCell.swift | 135 ++ .../Class/Home/V/SRHomeBingeWorthyView.swift | 75 ++ SynthReel/Class/Home/V/SRHomeChildCell.swift | 28 + SynthReel/Class/Home/V/SRHomeChildCell.xib | 39 + SynthReel/Class/Home/V/SRHomeHeaderView.swift | 156 +++ SynthReel/Class/Home/V/SRHomeHotView.swift | 61 + SynthReel/Class/Home/V/SRHomeMenuCell.swift | 51 + SynthReel/Class/Home/V/SRHomeModuleView.swift | 65 + .../Class/Home/V/SRHomePremiereNowView.swift | 198 +++ .../Home/V/SRHomeTopChartsContentView.swift | 196 +++ .../Class/Home/V/SRHomeTopChartsView.swift | 106 ++ .../Class/Home/V/SRHomeViralHitsCell.swift | 86 ++ .../Class/Home/V/SRHomeViralHitsView.swift | 74 ++ .../Class/Home/V/SRHomeYouLikeCell.swift | 120 ++ .../Class/Home/V/SRHomeYouLikeView.swift | 81 ++ SynthReel/Class/Home/V/SRHotSearchCell.swift | 114 ++ SynthReel/Class/Home/V/SRHotSearchView.swift | 115 ++ SynthReel/Class/Home/V/SRSearchHomeView.swift | 93 ++ .../Class/Home/V/SRSearchRecordCell.swift | 42 + .../Class/Home/V/SRSearchRecordView.swift | 135 ++ .../Class/Home/V/SRSearchResultCell.swift | 139 +++ .../Class/Home/V/SRSearchResultView.swift | 111 ++ SynthReel/Class/Home/V/SRSearchTextView.swift | 125 ++ .../Home/VC/SRHomeChildViewController.swift | 143 +++ .../Class/Home/VC/SRHomeViewController.swift | 279 +++++ .../Home/VC/SRSearchViewController.swift | 113 ++ .../Class/Home/VM/SRHomeMenuDataSource.swift | 36 + SynthReel/Class/Home/VM/SRHomeViewModel.swift | 107 ++ .../Class/Home/VM/SRSearchViewModel.swift | 53 + .../MyShort/VC/SRMyShortViewController.swift | 37 + .../Class/Player/M/SRShortDetailModel.swift | 20 + SynthReel/Class/Player/M/SRShortModel.swift | 58 + .../Class/Player/V/SREpSelectorCell.swift | 91 ++ .../Class/Player/V/SREpSelectorView.swift | 197 +++ SynthReel/Class/Player/V/SRProgressView.swift | 216 ++++ .../Player/V/SRRecommendPlayerCell.swift | 26 + .../V/SRRecommendPlayerControlView.swift | 226 ++++ .../Player/V/SRShortDetailControlView.swift | 239 ++++ .../Player/V/SRShortDetailPlayerCell.swift | 43 + .../VC/SRDetailPlayerViewController.swift | 107 ++ .../VC/SRRecommendPlayerViewController.swift | 61 + .../VM/SRRecommendPlayerViewModel.swift | 54 + .../Player/VM/SRShortPlayerViewModel.swift | 72 ++ SynthReel/Delegate/AppDelegate+Config.swift | 18 + SynthReel/Delegate/AppDelegate.swift | 46 + SynthReel/Delegate/SceneDelegate.swift | 65 + .../Libs/SRAccount/SRAccountManager.swift | 49 + SynthReel/Libs/SRAccount/SRAccountToken.swift | 42 + SynthReel/Libs/SRAccount/SRUserInfo.swift | 66 + SynthReel/Libs/SRDeviceID/SRDeviceId.swift | 27 + SynthReel/Libs/SRDeviceID/SRKeychain.swift | 59 + SynthReel/Libs/SRHud/SRHud.swift | 22 + SynthReel/Libs/SRHud/SRToast.swift | 24 + SynthReel/Libs/Tool/SRTool.swift | 56 + .../AccentColor.colorset/Contents.json | 11 + .../AppIcon.appiconset/Contents.json | 35 + .../Color/#010101.colorset/Contents.json | 20 + .../Color/#051B22.colorset/Contents.json | 20 + .../Color/#1B1B1B.colorset/Contents.json | 20 + .../Color/#4CFFD4.colorset/Contents.json | 20 + .../Color/#51D4FF.colorset/Contents.json | 20 + .../Color/#7AF4E0.colorset/Contents.json | 20 + .../Color/#96E5FF.colorset/Contents.json | 20 + .../Color/#A6A6A6.colorset/Contents.json | 20 + .../Color/#CCCCCC.colorset/Contents.json | 20 + .../Color/#DFDFDF.colorset/Contents.json | 20 + .../Assets.xcassets/Color/Contents.json | 6 + .../Color/sr_blue.colorset/Contents.json | 20 + .../Color/sr_green.colorset/Contents.json | 20 + .../Source/Assets.xcassets/Contents.json | 6 + .../Assets.xcassets/Image/Contents.json | 6 + .../arrow_left_icon_01.imageset/Contents.json | 22 + .../arrow_left_icon_01.imageset/返回@2x.png | Bin 0 -> 3236 bytes .../arrow_left_icon_01.imageset/返回@3x.png | Bin 0 -> 5113 bytes .../Contents.json | 22 + .../arrow_right_icon_01.imageset/Frame@2x.png | Bin 0 -> 373 bytes .../arrow_right_icon_01.imageset/Frame@3x.png | Bin 0 -> 454 bytes .../Contents.json | 22 + .../arrow_right_icon_02.imageset/Frame@2x.png | Bin 0 -> 195 bytes .../arrow_right_icon_02.imageset/Frame@3x.png | Bin 0 -> 223 bytes .../Contents.json | 22 + .../background_image_01.imageset/bg@2x.png | Bin 0 -> 342529 bytes .../background_image_01.imageset/bg@3x.png | Bin 0 -> 751343 bytes .../cell_bg_image_01.imageset/Contents.json | 22 + .../Rectangle 3@2x.png | Bin 0 -> 39028 bytes .../Rectangle 3@3x.png | Bin 0 -> 60292 bytes .../collect_icon_01.imageset/Contents.json | 22 + .../collect_icon_01.imageset/收藏@2x.png | Bin 0 -> 19265 bytes .../collect_icon_01.imageset/收藏@3x.png | Bin 0 -> 37708 bytes .../Contents.json | 22 + .../已收藏@2x.png | Bin 0 -> 19425 bytes .../已收藏@3x.png | Bin 0 -> 38476 bytes .../delete_icon_01.imageset/Contents.json | 22 + .../delete_icon_01.imageset/Frame@2x.png | Bin 0 -> 567 bytes .../delete_icon_01.imageset/Frame@3x.png | Bin 0 -> 763 bytes .../ep_cover_bg_image.imageset/Contents.json | 22 + .../bg border@2x.png | Bin 0 -> 29771 bytes .../bg border@3x.png | Bin 0 -> 40694 bytes .../Image/ep_icon_01.imageset/Contents.json | 22 + .../Image/ep_icon_01.imageset/选集@2x.png | Bin 0 -> 20262 bytes .../Image/ep_icon_01.imageset/选集@3x.png | Bin 0 -> 39077 bytes .../Image/ep_icon_02.imageset/Contents.json | 22 + .../Image/ep_icon_02.imageset/剧集@2x.png | Bin 0 -> 496 bytes .../Image/ep_icon_02.imageset/剧集@3x.png | Bin 0 -> 682 bytes .../home_banner_bg.imageset/Border@2x.png | Bin 0 -> 21442 bytes .../home_banner_bg.imageset/Border@3x.png | Bin 0 -> 43208 bytes .../home_banner_bg.imageset/Contents.json | 22 + .../Contents.json | 22 + .../bg border@2x.png | Bin 0 -> 28639 bytes .../bg border@3x.png | Bin 0 -> 55014 bytes .../home_list_bg_image.imageset/Contents.json | 50 + .../bg border@2x.png | Bin 0 -> 282160 bytes .../bg border@3x.png | Bin 0 -> 490815 bytes .../home_menu_bg_image.imageset/Contents.json | 22 + .../bg border@2x.png | Bin 0 -> 13629 bytes .../bg border@3x.png | Bin 0 -> 27705 bytes .../Contents.json | 22 + .../bg border@2x.png | Bin 0 -> 11737 bytes .../bg border@3x.png | Bin 0 -> 23024 bytes .../home_title_image.imageset/Contents.json | 22 + .../Title Border@2x.png | Bin 0 -> 12410 bytes .../Title Border@3x 1.png | Bin 0 -> 19861 bytes .../Contents.json | 22 + .../bg border@2x.png | Bin 0 -> 78498 bytes .../bg border@3x.png | Bin 0 -> 152190 bytes .../Image/hot_icon_01.imageset/Contents.json | 22 + .../Image/hot_icon_01.imageset/Frame@2x.png | Bin 0 -> 778 bytes .../Image/hot_icon_01.imageset/Frame@3x.png | Bin 0 -> 1278 bytes .../my_short_bg_image.imageset/Contents.json | 22 + .../科技背景 2@2x.png | Bin 0 -> 1007188 bytes .../科技背景 2@3x.png | Bin 0 -> 1813739 bytes .../pan_bg_image_01.imageset/Contents.json | 50 + .../Rectangle 70@2x.png | Bin 0 -> 57765 bytes .../Rectangle 70@3x.png | Bin 0 -> 105082 bytes .../Image/play_icon_01.imageset/Contents.json | 22 + .../Image/play_icon_01.imageset/play@2x.png | Bin 0 -> 13911 bytes .../Image/play_icon_01.imageset/play@3x.png | Bin 0 -> 22611 bytes .../Image/play_icon_02.imageset/Contents.json | 22 + .../Image/play_icon_02.imageset/play@2x.png | Bin 0 -> 1267 bytes .../Image/play_icon_02.imageset/play@3x.png | Bin 0 -> 1783 bytes .../popular_bg_image.imageset/Contents.json | 22 + .../Rectangle 4@2x.png | Bin 0 -> 109516 bytes .../Rectangle 4@3x.png | Bin 0 -> 174076 bytes .../Contents.json | 22 + .../bg border@2x.png | Bin 0 -> 89683 bytes .../bg border@3x.png | Bin 0 -> 144582 bytes .../Contents.json | 22 + .../bg border-center@2x.png | Bin 0 -> 112952 bytes .../bg border-center@3x.png | Bin 0 -> 235576 bytes .../Contents.json | 22 + .../Vector 7@2x.png | Bin 0 -> 13210 bytes .../Vector 7@3x.png | Bin 0 -> 25084 bytes .../Contents.json | 22 + .../Rectangle 4@2x.png | Bin 0 -> 281446 bytes .../Rectangle 4@3x.png | Bin 0 -> 462485 bytes .../search_icon_01.imageset/Contents.json | 22 + .../Image/search_icon_01.imageset/搜索@2x.png | Bin 0 -> 1039 bytes .../Image/search_icon_01.imageset/搜索@3x.png | Bin 0 -> 1546 bytes .../Contents.json | 44 + .../bg@2x.png | Bin 0 -> 28527 bytes .../bg@3x.png | Bin 0 -> 57449 bytes .../Contents.json | 22 + .../Rectangle 48@2x.png | Bin 0 -> 4302 bytes .../Rectangle 48@3x.png | Bin 0 -> 8882 bytes .../search_text_button.imageset/Contents.json | 44 + .../Subtract@2x.png | Bin 0 -> 10747 bytes .../Subtract@3x.png | Bin 0 -> 22836 bytes .../Contents.json | 50 + .../bg border@2x.png | Bin 0 -> 58691 bytes .../bg border@3x.png | Bin 0 -> 104769 bytes .../trophy_icon_01.imageset/Contents.json | 22 + .../trophy_icon_01.imageset/奖杯 1@2x.png | Bin 0 -> 19902 bytes .../trophy_icon_01.imageset/奖杯 1@3x.png | Bin 0 -> 37255 bytes .../updates_bg_image.imageset/Contents.json | 22 + .../Rectangle 4@2x.png | Bin 0 -> 108686 bytes .../Rectangle 4@3x.png | Bin 0 -> 173103 bytes .../Assets.xcassets/TabBar/Contents.json | 6 + .../tabbar_icon_01.imageset/Contents.json | 25 + .../home-Not selected@2x.png | Bin 0 -> 825 bytes .../home-Not selected@3x.png | Bin 0 -> 1160 bytes .../Contents.json | 25 + .../home@2x.png | Bin 0 -> 4123 bytes .../home@3x.png | Bin 0 -> 7851 bytes .../tabbar_icon_02.imageset/Contents.json | 25 + .../tabbar_icon_02.imageset/Discover@2x.png | Bin 0 -> 1120 bytes .../tabbar_icon_02.imageset/Discover@3x.png | Bin 0 -> 1601 bytes .../Contents.json | 25 + .../Discover@2x.png | Bin 0 -> 4296 bytes .../Discover@3x.png | Bin 0 -> 8231 bytes .../tabbar_icon_03.imageset/Contents.json | 25 + .../tabbar_icon_03.imageset/Favorite@2x.png | Bin 0 -> 1148 bytes .../tabbar_icon_03.imageset/Favorite@3x.png | Bin 0 -> 1650 bytes .../Contents.json | 25 + .../Favorite@2x.png | Bin 0 -> 4175 bytes .../Favorite@3x.png | Bin 0 -> 7792 bytes .../tabbar_icon_04.imageset/Contents.json | 25 + .../tabbar_icon_04.imageset/Profile@2x.png | Bin 0 -> 951 bytes .../tabbar_icon_04.imageset/Profile@3x.png | Bin 0 -> 1330 bytes .../Contents.json | 25 + .../Profile@2x.png | Bin 0 -> 3933 bytes .../Profile@3x.png | Bin 0 -> 7308 bytes .../Source/Base.lproj/LaunchScreen.storyboard | 25 + SynthReel/Source/Bridging-Header.h | 8 + SynthReel/Source/Info.plist | 25 + SynthReel/Source/en.lproj/Localizable.strings | 25 + 247 files changed, 9791 insertions(+), 1 deletion(-) create mode 100644 Podfile create mode 100644 SynthReel.xcodeproj/project.pbxproj create mode 100644 SynthReel.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 SynthReel.xcodeproj/xcshareddata/xcschemes/SynthReel.xcscheme create mode 100644 SynthReel.xcworkspace/contents.xcworkspacedata create mode 100644 SynthReel.xcworkspace/xcshareddata/swiftpm/Package.resolved create mode 100644 SynthReel/Base/API/SRHomeApi.swift create mode 100644 SynthReel/Base/API/SRShortApi.swift create mode 100644 SynthReel/Base/API/SRUserApi.swift create mode 100644 SynthReel/Base/Define/SRDefine.swift create mode 100644 SynthReel/Base/Define/SRUserDefaultsKey.swift create mode 100644 SynthReel/Base/Extension/NSNumber+SRAdd.swift create mode 100644 SynthReel/Base/Extension/String+SRAdd.swift create mode 100644 SynthReel/Base/Extension/UIFont+SRAdd.swift create mode 100644 SynthReel/Base/Extension/UIScreen+SRAdd.swift create mode 100644 SynthReel/Base/Extension/UIScrollView+SRAdd.swift create mode 100644 SynthReel/Base/Extension/UIStackView+SRAdd.swift create mode 100644 SynthReel/Base/Extension/UIView+SRAdd.swift create mode 100644 SynthReel/Base/Extension/UserDefaults+SRAdd.swift create mode 100644 SynthReel/Base/Networking/SRNetwork.swift create mode 100644 SynthReel/Base/Networking/SRNetworkModel.swift create mode 100644 SynthReel/Base/Networking/SRNetworkReachableManager.swift create mode 100644 SynthReel/Base/Networking/SRResponseCryptor.swift create mode 100644 SynthReel/Base/Networking/SRTargetType.swift create mode 100644 SynthReel/Base/Networking/SRUrlPath.swift create mode 100644 SynthReel/Base/View/SRCollectionView.swift create mode 100644 SynthReel/Base/View/SRGradientView.swift create mode 100644 SynthReel/Base/View/SRImageView.swift create mode 100644 SynthReel/Base/View/SRLabel.swift create mode 100644 SynthReel/Base/View/SRPanModalContentView.swift create mode 100644 SynthReel/Base/View/SRScrollView.swift create mode 100644 SynthReel/Base/View/SRTableView.swift create mode 100644 SynthReel/Base/View/SRTableViewCell.swift create mode 100644 SynthReel/Base/ViewController/SRNavigationController.swift create mode 100644 SynthReel/Base/ViewController/SRTabBarController.swift create mode 100644 SynthReel/Base/ViewController/SRViewController.swift create mode 100644 SynthReel/Class/Home/M/SRCategoryModel.swift create mode 100644 SynthReel/Class/Home/M/SRHomeModuleItem.swift create mode 100644 SynthReel/Class/Home/V/SRHomeBannerCell.swift create mode 100644 SynthReel/Class/Home/V/SRHomeBannerMiniCell.swift create mode 100644 SynthReel/Class/Home/V/SRHomeBannerView.swift create mode 100644 SynthReel/Class/Home/V/SRHomeBingeWorthyCell.swift create mode 100644 SynthReel/Class/Home/V/SRHomeBingeWorthyView.swift create mode 100644 SynthReel/Class/Home/V/SRHomeChildCell.swift create mode 100644 SynthReel/Class/Home/V/SRHomeChildCell.xib create mode 100644 SynthReel/Class/Home/V/SRHomeHeaderView.swift create mode 100644 SynthReel/Class/Home/V/SRHomeHotView.swift create mode 100644 SynthReel/Class/Home/V/SRHomeMenuCell.swift create mode 100644 SynthReel/Class/Home/V/SRHomeModuleView.swift create mode 100644 SynthReel/Class/Home/V/SRHomePremiereNowView.swift create mode 100644 SynthReel/Class/Home/V/SRHomeTopChartsContentView.swift create mode 100644 SynthReel/Class/Home/V/SRHomeTopChartsView.swift create mode 100644 SynthReel/Class/Home/V/SRHomeViralHitsCell.swift create mode 100644 SynthReel/Class/Home/V/SRHomeViralHitsView.swift create mode 100644 SynthReel/Class/Home/V/SRHomeYouLikeCell.swift create mode 100644 SynthReel/Class/Home/V/SRHomeYouLikeView.swift create mode 100644 SynthReel/Class/Home/V/SRHotSearchCell.swift create mode 100644 SynthReel/Class/Home/V/SRHotSearchView.swift create mode 100644 SynthReel/Class/Home/V/SRSearchHomeView.swift create mode 100644 SynthReel/Class/Home/V/SRSearchRecordCell.swift create mode 100644 SynthReel/Class/Home/V/SRSearchRecordView.swift create mode 100644 SynthReel/Class/Home/V/SRSearchResultCell.swift create mode 100644 SynthReel/Class/Home/V/SRSearchResultView.swift create mode 100644 SynthReel/Class/Home/V/SRSearchTextView.swift create mode 100644 SynthReel/Class/Home/VC/SRHomeChildViewController.swift create mode 100644 SynthReel/Class/Home/VC/SRHomeViewController.swift create mode 100644 SynthReel/Class/Home/VC/SRSearchViewController.swift create mode 100644 SynthReel/Class/Home/VM/SRHomeMenuDataSource.swift create mode 100644 SynthReel/Class/Home/VM/SRHomeViewModel.swift create mode 100644 SynthReel/Class/Home/VM/SRSearchViewModel.swift create mode 100644 SynthReel/Class/MyShort/VC/SRMyShortViewController.swift create mode 100644 SynthReel/Class/Player/M/SRShortDetailModel.swift create mode 100644 SynthReel/Class/Player/M/SRShortModel.swift create mode 100644 SynthReel/Class/Player/V/SREpSelectorCell.swift create mode 100644 SynthReel/Class/Player/V/SREpSelectorView.swift create mode 100644 SynthReel/Class/Player/V/SRProgressView.swift create mode 100644 SynthReel/Class/Player/V/SRRecommendPlayerCell.swift create mode 100644 SynthReel/Class/Player/V/SRRecommendPlayerControlView.swift create mode 100644 SynthReel/Class/Player/V/SRShortDetailControlView.swift create mode 100644 SynthReel/Class/Player/V/SRShortDetailPlayerCell.swift create mode 100644 SynthReel/Class/Player/VC/SRDetailPlayerViewController.swift create mode 100644 SynthReel/Class/Player/VC/SRRecommendPlayerViewController.swift create mode 100644 SynthReel/Class/Player/VM/SRRecommendPlayerViewModel.swift create mode 100644 SynthReel/Class/Player/VM/SRShortPlayerViewModel.swift create mode 100644 SynthReel/Delegate/AppDelegate+Config.swift create mode 100644 SynthReel/Delegate/AppDelegate.swift create mode 100644 SynthReel/Delegate/SceneDelegate.swift create mode 100644 SynthReel/Libs/SRAccount/SRAccountManager.swift create mode 100644 SynthReel/Libs/SRAccount/SRAccountToken.swift create mode 100644 SynthReel/Libs/SRAccount/SRUserInfo.swift create mode 100644 SynthReel/Libs/SRDeviceID/SRDeviceId.swift create mode 100644 SynthReel/Libs/SRDeviceID/SRKeychain.swift create mode 100644 SynthReel/Libs/SRHud/SRHud.swift create mode 100644 SynthReel/Libs/SRHud/SRToast.swift create mode 100644 SynthReel/Libs/Tool/SRTool.swift create mode 100644 SynthReel/Source/Assets.xcassets/AccentColor.colorset/Contents.json create mode 100644 SynthReel/Source/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 SynthReel/Source/Assets.xcassets/Color/#010101.colorset/Contents.json create mode 100644 SynthReel/Source/Assets.xcassets/Color/#051B22.colorset/Contents.json create mode 100644 SynthReel/Source/Assets.xcassets/Color/#1B1B1B.colorset/Contents.json create mode 100644 SynthReel/Source/Assets.xcassets/Color/#4CFFD4.colorset/Contents.json create mode 100644 SynthReel/Source/Assets.xcassets/Color/#51D4FF.colorset/Contents.json create mode 100644 SynthReel/Source/Assets.xcassets/Color/#7AF4E0.colorset/Contents.json create mode 100644 SynthReel/Source/Assets.xcassets/Color/#96E5FF.colorset/Contents.json create mode 100644 SynthReel/Source/Assets.xcassets/Color/#A6A6A6.colorset/Contents.json create mode 100644 SynthReel/Source/Assets.xcassets/Color/#CCCCCC.colorset/Contents.json create mode 100644 SynthReel/Source/Assets.xcassets/Color/#DFDFDF.colorset/Contents.json create mode 100644 SynthReel/Source/Assets.xcassets/Color/Contents.json create mode 100644 SynthReel/Source/Assets.xcassets/Color/sr_blue.colorset/Contents.json create mode 100644 SynthReel/Source/Assets.xcassets/Color/sr_green.colorset/Contents.json create mode 100644 SynthReel/Source/Assets.xcassets/Contents.json create mode 100644 SynthReel/Source/Assets.xcassets/Image/Contents.json create mode 100644 SynthReel/Source/Assets.xcassets/Image/arrow_left_icon_01.imageset/Contents.json create mode 100644 SynthReel/Source/Assets.xcassets/Image/arrow_left_icon_01.imageset/返回@2x.png create mode 100644 SynthReel/Source/Assets.xcassets/Image/arrow_left_icon_01.imageset/返回@3x.png create mode 100644 SynthReel/Source/Assets.xcassets/Image/arrow_right_icon_01.imageset/Contents.json create mode 100644 SynthReel/Source/Assets.xcassets/Image/arrow_right_icon_01.imageset/Frame@2x.png create mode 100644 SynthReel/Source/Assets.xcassets/Image/arrow_right_icon_01.imageset/Frame@3x.png create mode 100644 SynthReel/Source/Assets.xcassets/Image/arrow_right_icon_02.imageset/Contents.json create mode 100644 SynthReel/Source/Assets.xcassets/Image/arrow_right_icon_02.imageset/Frame@2x.png create mode 100644 SynthReel/Source/Assets.xcassets/Image/arrow_right_icon_02.imageset/Frame@3x.png create mode 100644 SynthReel/Source/Assets.xcassets/Image/background_image_01.imageset/Contents.json create mode 100644 SynthReel/Source/Assets.xcassets/Image/background_image_01.imageset/bg@2x.png create mode 100644 SynthReel/Source/Assets.xcassets/Image/background_image_01.imageset/bg@3x.png create mode 100644 SynthReel/Source/Assets.xcassets/Image/cell_bg_image_01.imageset/Contents.json create mode 100644 SynthReel/Source/Assets.xcassets/Image/cell_bg_image_01.imageset/Rectangle 3@2x.png create mode 100644 SynthReel/Source/Assets.xcassets/Image/cell_bg_image_01.imageset/Rectangle 3@3x.png create mode 100644 SynthReel/Source/Assets.xcassets/Image/collect_icon_01.imageset/Contents.json create mode 100644 SynthReel/Source/Assets.xcassets/Image/collect_icon_01.imageset/收藏@2x.png create mode 100644 SynthReel/Source/Assets.xcassets/Image/collect_icon_01.imageset/收藏@3x.png create mode 100644 SynthReel/Source/Assets.xcassets/Image/collect_icon_01_selected.imageset/Contents.json create mode 100644 SynthReel/Source/Assets.xcassets/Image/collect_icon_01_selected.imageset/已收藏@2x.png create mode 100644 SynthReel/Source/Assets.xcassets/Image/collect_icon_01_selected.imageset/已收藏@3x.png create mode 100644 SynthReel/Source/Assets.xcassets/Image/delete_icon_01.imageset/Contents.json create mode 100644 SynthReel/Source/Assets.xcassets/Image/delete_icon_01.imageset/Frame@2x.png create mode 100644 SynthReel/Source/Assets.xcassets/Image/delete_icon_01.imageset/Frame@3x.png create mode 100644 SynthReel/Source/Assets.xcassets/Image/ep_cover_bg_image.imageset/Contents.json create mode 100644 SynthReel/Source/Assets.xcassets/Image/ep_cover_bg_image.imageset/bg border@2x.png create mode 100644 SynthReel/Source/Assets.xcassets/Image/ep_cover_bg_image.imageset/bg border@3x.png create mode 100644 SynthReel/Source/Assets.xcassets/Image/ep_icon_01.imageset/Contents.json create mode 100644 SynthReel/Source/Assets.xcassets/Image/ep_icon_01.imageset/选集@2x.png create mode 100644 SynthReel/Source/Assets.xcassets/Image/ep_icon_01.imageset/选集@3x.png create mode 100644 SynthReel/Source/Assets.xcassets/Image/ep_icon_02.imageset/Contents.json create mode 100644 SynthReel/Source/Assets.xcassets/Image/ep_icon_02.imageset/剧集@2x.png create mode 100644 SynthReel/Source/Assets.xcassets/Image/ep_icon_02.imageset/剧集@3x.png create mode 100644 SynthReel/Source/Assets.xcassets/Image/home_banner_bg.imageset/Border@2x.png create mode 100644 SynthReel/Source/Assets.xcassets/Image/home_banner_bg.imageset/Border@3x.png create mode 100644 SynthReel/Source/Assets.xcassets/Image/home_banner_bg.imageset/Contents.json create mode 100644 SynthReel/Source/Assets.xcassets/Image/home_binge_worthy_cell_image.imageset/Contents.json create mode 100644 SynthReel/Source/Assets.xcassets/Image/home_binge_worthy_cell_image.imageset/bg border@2x.png create mode 100644 SynthReel/Source/Assets.xcassets/Image/home_binge_worthy_cell_image.imageset/bg border@3x.png create mode 100644 SynthReel/Source/Assets.xcassets/Image/home_list_bg_image.imageset/Contents.json create mode 100644 SynthReel/Source/Assets.xcassets/Image/home_list_bg_image.imageset/bg border@2x.png create mode 100644 SynthReel/Source/Assets.xcassets/Image/home_list_bg_image.imageset/bg border@3x.png create mode 100644 SynthReel/Source/Assets.xcassets/Image/home_menu_bg_image.imageset/Contents.json create mode 100644 SynthReel/Source/Assets.xcassets/Image/home_menu_bg_image.imageset/bg border@2x.png create mode 100644 SynthReel/Source/Assets.xcassets/Image/home_menu_bg_image.imageset/bg border@3x.png create mode 100644 SynthReel/Source/Assets.xcassets/Image/home_menu_bg_image_selected.imageset/Contents.json create mode 100644 SynthReel/Source/Assets.xcassets/Image/home_menu_bg_image_selected.imageset/bg border@2x.png create mode 100644 SynthReel/Source/Assets.xcassets/Image/home_menu_bg_image_selected.imageset/bg border@3x.png create mode 100644 SynthReel/Source/Assets.xcassets/Image/home_title_image.imageset/Contents.json create mode 100644 SynthReel/Source/Assets.xcassets/Image/home_title_image.imageset/Title Border@2x.png create mode 100644 SynthReel/Source/Assets.xcassets/Image/home_title_image.imageset/Title Border@3x 1.png create mode 100644 SynthReel/Source/Assets.xcassets/Image/home_viral_hits_cell_image.imageset/Contents.json create mode 100644 SynthReel/Source/Assets.xcassets/Image/home_viral_hits_cell_image.imageset/bg border@2x.png create mode 100644 SynthReel/Source/Assets.xcassets/Image/home_viral_hits_cell_image.imageset/bg border@3x.png create mode 100644 SynthReel/Source/Assets.xcassets/Image/hot_icon_01.imageset/Contents.json create mode 100644 SynthReel/Source/Assets.xcassets/Image/hot_icon_01.imageset/Frame@2x.png create mode 100644 SynthReel/Source/Assets.xcassets/Image/hot_icon_01.imageset/Frame@3x.png create mode 100644 SynthReel/Source/Assets.xcassets/Image/my_short_bg_image.imageset/Contents.json create mode 100644 SynthReel/Source/Assets.xcassets/Image/my_short_bg_image.imageset/科技背景 2@2x.png create mode 100644 SynthReel/Source/Assets.xcassets/Image/my_short_bg_image.imageset/科技背景 2@3x.png create mode 100644 SynthReel/Source/Assets.xcassets/Image/pan_bg_image_01.imageset/Contents.json create mode 100644 SynthReel/Source/Assets.xcassets/Image/pan_bg_image_01.imageset/Rectangle 70@2x.png create mode 100644 SynthReel/Source/Assets.xcassets/Image/pan_bg_image_01.imageset/Rectangle 70@3x.png create mode 100644 SynthReel/Source/Assets.xcassets/Image/play_icon_01.imageset/Contents.json create mode 100644 SynthReel/Source/Assets.xcassets/Image/play_icon_01.imageset/play@2x.png create mode 100644 SynthReel/Source/Assets.xcassets/Image/play_icon_01.imageset/play@3x.png create mode 100644 SynthReel/Source/Assets.xcassets/Image/play_icon_02.imageset/Contents.json create mode 100644 SynthReel/Source/Assets.xcassets/Image/play_icon_02.imageset/play@2x.png create mode 100644 SynthReel/Source/Assets.xcassets/Image/play_icon_02.imageset/play@3x.png create mode 100644 SynthReel/Source/Assets.xcassets/Image/popular_bg_image.imageset/Contents.json create mode 100644 SynthReel/Source/Assets.xcassets/Image/popular_bg_image.imageset/Rectangle 4@2x.png create mode 100644 SynthReel/Source/Assets.xcassets/Image/popular_bg_image.imageset/Rectangle 4@3x.png create mode 100644 SynthReel/Source/Assets.xcassets/Image/premiere_now_bg_image_01.imageset/Contents.json create mode 100644 SynthReel/Source/Assets.xcassets/Image/premiere_now_bg_image_01.imageset/bg border@2x.png create mode 100644 SynthReel/Source/Assets.xcassets/Image/premiere_now_bg_image_01.imageset/bg border@3x.png create mode 100644 SynthReel/Source/Assets.xcassets/Image/premiere_now_bg_image_02.imageset/Contents.json create mode 100644 SynthReel/Source/Assets.xcassets/Image/premiere_now_bg_image_02.imageset/bg border-center@2x.png create mode 100644 SynthReel/Source/Assets.xcassets/Image/premiere_now_bg_image_02.imageset/bg border-center@3x.png create mode 100644 SynthReel/Source/Assets.xcassets/Image/premiere_now_title_bg.imageset/Contents.json create mode 100644 SynthReel/Source/Assets.xcassets/Image/premiere_now_title_bg.imageset/Vector 7@2x.png create mode 100644 SynthReel/Source/Assets.xcassets/Image/premiere_now_title_bg.imageset/Vector 7@3x.png create mode 100644 SynthReel/Source/Assets.xcassets/Image/search_hot_bg_image.imageset/Contents.json create mode 100644 SynthReel/Source/Assets.xcassets/Image/search_hot_bg_image.imageset/Rectangle 4@2x.png create mode 100644 SynthReel/Source/Assets.xcassets/Image/search_hot_bg_image.imageset/Rectangle 4@3x.png create mode 100644 SynthReel/Source/Assets.xcassets/Image/search_icon_01.imageset/Contents.json create mode 100644 SynthReel/Source/Assets.xcassets/Image/search_icon_01.imageset/搜索@2x.png create mode 100644 SynthReel/Source/Assets.xcassets/Image/search_icon_01.imageset/搜索@3x.png create mode 100644 SynthReel/Source/Assets.xcassets/Image/search_result_cell_bg_image.imageset/Contents.json create mode 100644 SynthReel/Source/Assets.xcassets/Image/search_result_cell_bg_image.imageset/bg@2x.png create mode 100644 SynthReel/Source/Assets.xcassets/Image/search_result_cell_bg_image.imageset/bg@3x.png create mode 100644 SynthReel/Source/Assets.xcassets/Image/search_text_bg_image.imageset/Contents.json create mode 100644 SynthReel/Source/Assets.xcassets/Image/search_text_bg_image.imageset/Rectangle 48@2x.png create mode 100644 SynthReel/Source/Assets.xcassets/Image/search_text_bg_image.imageset/Rectangle 48@3x.png create mode 100644 SynthReel/Source/Assets.xcassets/Image/search_text_button.imageset/Contents.json create mode 100644 SynthReel/Source/Assets.xcassets/Image/search_text_button.imageset/Subtract@2x.png create mode 100644 SynthReel/Source/Assets.xcassets/Image/search_text_button.imageset/Subtract@3x.png create mode 100644 SynthReel/Source/Assets.xcassets/Image/short_progress_bg_image.imageset/Contents.json create mode 100644 SynthReel/Source/Assets.xcassets/Image/short_progress_bg_image.imageset/bg border@2x.png create mode 100644 SynthReel/Source/Assets.xcassets/Image/short_progress_bg_image.imageset/bg border@3x.png create mode 100644 SynthReel/Source/Assets.xcassets/Image/trophy_icon_01.imageset/Contents.json create mode 100644 SynthReel/Source/Assets.xcassets/Image/trophy_icon_01.imageset/奖杯 1@2x.png create mode 100644 SynthReel/Source/Assets.xcassets/Image/trophy_icon_01.imageset/奖杯 1@3x.png create mode 100644 SynthReel/Source/Assets.xcassets/Image/updates_bg_image.imageset/Contents.json create mode 100644 SynthReel/Source/Assets.xcassets/Image/updates_bg_image.imageset/Rectangle 4@2x.png create mode 100644 SynthReel/Source/Assets.xcassets/Image/updates_bg_image.imageset/Rectangle 4@3x.png create mode 100644 SynthReel/Source/Assets.xcassets/TabBar/Contents.json create mode 100644 SynthReel/Source/Assets.xcassets/TabBar/tabbar_icon_01.imageset/Contents.json create mode 100644 SynthReel/Source/Assets.xcassets/TabBar/tabbar_icon_01.imageset/home-Not selected@2x.png create mode 100644 SynthReel/Source/Assets.xcassets/TabBar/tabbar_icon_01.imageset/home-Not selected@3x.png create mode 100644 SynthReel/Source/Assets.xcassets/TabBar/tabbar_icon_01_selected.imageset/Contents.json create mode 100644 SynthReel/Source/Assets.xcassets/TabBar/tabbar_icon_01_selected.imageset/home@2x.png create mode 100644 SynthReel/Source/Assets.xcassets/TabBar/tabbar_icon_01_selected.imageset/home@3x.png create mode 100644 SynthReel/Source/Assets.xcassets/TabBar/tabbar_icon_02.imageset/Contents.json create mode 100644 SynthReel/Source/Assets.xcassets/TabBar/tabbar_icon_02.imageset/Discover@2x.png create mode 100644 SynthReel/Source/Assets.xcassets/TabBar/tabbar_icon_02.imageset/Discover@3x.png create mode 100644 SynthReel/Source/Assets.xcassets/TabBar/tabbar_icon_02_selected.imageset/Contents.json create mode 100644 SynthReel/Source/Assets.xcassets/TabBar/tabbar_icon_02_selected.imageset/Discover@2x.png create mode 100644 SynthReel/Source/Assets.xcassets/TabBar/tabbar_icon_02_selected.imageset/Discover@3x.png create mode 100644 SynthReel/Source/Assets.xcassets/TabBar/tabbar_icon_03.imageset/Contents.json create mode 100644 SynthReel/Source/Assets.xcassets/TabBar/tabbar_icon_03.imageset/Favorite@2x.png create mode 100644 SynthReel/Source/Assets.xcassets/TabBar/tabbar_icon_03.imageset/Favorite@3x.png create mode 100644 SynthReel/Source/Assets.xcassets/TabBar/tabbar_icon_03_selected.imageset/Contents.json create mode 100644 SynthReel/Source/Assets.xcassets/TabBar/tabbar_icon_03_selected.imageset/Favorite@2x.png create mode 100644 SynthReel/Source/Assets.xcassets/TabBar/tabbar_icon_03_selected.imageset/Favorite@3x.png create mode 100644 SynthReel/Source/Assets.xcassets/TabBar/tabbar_icon_04.imageset/Contents.json create mode 100644 SynthReel/Source/Assets.xcassets/TabBar/tabbar_icon_04.imageset/Profile@2x.png create mode 100644 SynthReel/Source/Assets.xcassets/TabBar/tabbar_icon_04.imageset/Profile@3x.png create mode 100644 SynthReel/Source/Assets.xcassets/TabBar/tabbar_icon_04_selected.imageset/Contents.json create mode 100644 SynthReel/Source/Assets.xcassets/TabBar/tabbar_icon_04_selected.imageset/Profile@2x.png create mode 100644 SynthReel/Source/Assets.xcassets/TabBar/tabbar_icon_04_selected.imageset/Profile@3x.png create mode 100644 SynthReel/Source/Base.lproj/LaunchScreen.storyboard create mode 100644 SynthReel/Source/Bridging-Header.h create mode 100644 SynthReel/Source/Info.plist create mode 100644 SynthReel/Source/en.lproj/Localizable.strings diff --git a/.gitignore b/.gitignore index 3542e5b..0ced315 100644 --- a/.gitignore +++ b/.gitignore @@ -14,6 +14,7 @@ xcuserdata/ *.dSYM.zip *.dSYM + ## Playgrounds timeline.xctimeline playground.xcworkspace @@ -38,7 +39,8 @@ playground.xcworkspace # you should judge for yourself, the pros and cons are mentioned at: # https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control # -# Pods/ +Pods/ +Podfile.lock # # Add this line if you want to avoid checking in source code from the Xcode workspace # *.xcworkspace diff --git a/Podfile b/Podfile new file mode 100644 index 0000000..307f827 --- /dev/null +++ b/Podfile @@ -0,0 +1,35 @@ +# Uncomment the next line to define a global platform for your project + platform :ios, '13.0' + +source 'https://mirrors.tuna.tsinghua.edu.cn/git/CocoaPods/Specs.git' + +post_install do |installer| + installer.pods_project.targets.each do |target| + target.build_configurations.each do |config| + config.build_settings['ENABLE_BITCODE'] = 'NO' + config.build_settings["EXCLUDED_ARCHS[sdk=iphonesimulator*]"] = "arm64" + config.build_settings['EXCLUDED_ARCHITECTURES'] = 'i386' + config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '13.0' + end + end +end + +target 'SynthReel' do + use_frameworks! + + pod 'YYCategories' + pod 'YYText' + pod 'Kingfisher' + pod 'SmartCodable' + pod 'Moya' + pod 'SVProgressHUD' + pod 'Toast' + pod 'JXSegmentedView' + pod 'JXPagingView/Paging' + pod 'FSPagerView' + pod 'JXPlayer', '~> 0.1.8' + pod 'MJRefresh' + pod 'collection-view-layouts/TagsLayout' + pod 'HWPanModal' + +end diff --git a/SynthReel.xcodeproj/project.pbxproj b/SynthReel.xcodeproj/project.pbxproj new file mode 100644 index 0000000..57e8af3 --- /dev/null +++ b/SynthReel.xcodeproj/project.pbxproj @@ -0,0 +1,1091 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 77; + objects = { + +/* Begin PBXBuildFile section */ + 03980F4F2ECEB91C0006E317 /* SRRecommendPlayerViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03980F4E2ECEB91C0006E317 /* SRRecommendPlayerViewModel.swift */; }; + 03980F512ECEBEE20006E317 /* SRRecommendPlayerCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03980F502ECEBEE20006E317 /* SRRecommendPlayerCell.swift */; }; + 03980F532ECEDEAB0006E317 /* SRRecommendPlayerControlView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03980F522ECEDEAB0006E317 /* SRRecommendPlayerControlView.swift */; }; + 03980F592ECEED190006E317 /* SRMyShortViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03980F582ECEED190006E317 /* SRMyShortViewController.swift */; }; + 03B1A8392EC5C8D6006C353F /* SRHud.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03B1A8382EC5C8CE006C353F /* SRHud.swift */; }; + 03B1A83B2EC5C8E0006C353F /* SRToast.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03B1A83A2EC5C8DB006C353F /* SRToast.swift */; }; + 03B1A83E2EC5C91E006C353F /* SRTool.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03B1A83D2EC5C91A006C353F /* SRTool.swift */; }; + 03B1A8402EC5CA37006C353F /* AppDelegate+Config.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03B1A83F2EC5CA2E006C353F /* AppDelegate+Config.swift */; }; + 03B1A8432EC5CB99006C353F /* SRTabBarController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03B1A8422EC5CB99006C353F /* SRTabBarController.swift */; }; + 03B1A8452EC5CBBB006C353F /* SRNavigationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03B1A8442EC5CBBB006C353F /* SRNavigationController.swift */; }; + 03B1A8472EC5CBCF006C353F /* SRViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03B1A8462EC5CBCF006C353F /* SRViewController.swift */; }; + 03B1A84A2EC5CE37006C353F /* ESTabBarController in Frameworks */ = {isa = PBXBuildFile; productRef = 03B1A8492EC5CE37006C353F /* ESTabBarController */; }; + 03B1A84D2EC5DA43006C353F /* SnapKit in Frameworks */ = {isa = PBXBuildFile; productRef = 03B1A84C2EC5DA43006C353F /* SnapKit */; }; + 03B1A8502EC5DB2E006C353F /* SRHomeViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03B1A84F2EC5DB2E006C353F /* SRHomeViewController.swift */; }; + 03B1A8532EC5E12E006C353F /* UIScreen+SRAdd.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03B1A8522EC5E129006C353F /* UIScreen+SRAdd.swift */; }; + 03B1A8552EC5E434006C353F /* UIFont+SRAdd.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03B1A8542EC5E429006C353F /* UIFont+SRAdd.swift */; }; + 03B1A8582EC5E4F1006C353F /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 03B1A8562EC5E4F1006C353F /* Localizable.strings */; }; + 03B1A8D52EC6CF37006C353F /* SRHomeChildViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03B1A8D42EC6CF37006C353F /* SRHomeChildViewController.swift */; }; + 03B1A8D82EC6D051006C353F /* SRCollectionView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03B1A8D72EC6D051006C353F /* SRCollectionView.swift */; }; + 03B1A8DC2EC6D0EB006C353F /* SRHomeChildCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03B1A8DA2EC6D0EB006C353F /* SRHomeChildCell.swift */; }; + 03B1A8DD2EC6D0EB006C353F /* SRHomeChildCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 03B1A8DB2EC6D0EB006C353F /* SRHomeChildCell.xib */; }; + 03B1A8E12EC6D6D3006C353F /* SRHomeMenuDataSource.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03B1A8E02EC6D6D3006C353F /* SRHomeMenuDataSource.swift */; }; + 03B1A8E32EC6F577006C353F /* SRHomeMenuCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03B1A8E22EC6F577006C353F /* SRHomeMenuCell.swift */; }; + 03B1A8E52EC715E1006C353F /* SRHomeApi.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03B1A8E42EC715DA006C353F /* SRHomeApi.swift */; }; + 03B1A8E72EC7175D006C353F /* SRCategoryModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03B1A8E62EC7175D006C353F /* SRCategoryModel.swift */; }; + 03B1A8E92EC721CD006C353F /* SRLabel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03B1A8E82EC721CD006C353F /* SRLabel.swift */; }; + 03B1A8ED2EC72C1F006C353F /* SRHomeModuleItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03B1A8EC2EC72C18006C353F /* SRHomeModuleItem.swift */; }; + 03B1A8EF2EC72C78006C353F /* SRShortModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03B1A8EE2EC72C78006C353F /* SRShortModel.swift */; }; + 03B1A8F12EC72DD7006C353F /* SRHomeViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03B1A8F02EC72DD7006C353F /* SRHomeViewModel.swift */; }; + 03B1A8F32EC809C5006C353F /* SRHomeHeaderView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03B1A8F22EC809C5006C353F /* SRHomeHeaderView.swift */; }; + 03B1A8F52EC81277006C353F /* SRHomeBannerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03B1A8F42EC81277006C353F /* SRHomeBannerView.swift */; }; + 03B1A8F92EC813BC006C353F /* SRScrollView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03B1A8F82EC813BC006C353F /* SRScrollView.swift */; }; + 03B1A8FB2EC818BE006C353F /* UIStackView+SRAdd.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03B1A8FA2EC818B6006C353F /* UIStackView+SRAdd.swift */; }; + 03B1A8FD2EC81C62006C353F /* SRHomeBannerCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03B1A8FC2EC81C62006C353F /* SRHomeBannerCell.swift */; }; + 03B1A8FF2EC81C92006C353F /* SRImageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03B1A8FE2EC81C92006C353F /* SRImageView.swift */; }; + 03B1A9012EC852B2006C353F /* SRHomeModuleView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03B1A9002EC852B2006C353F /* SRHomeModuleView.swift */; }; + 03B1A9032EC8555B006C353F /* SRHomeYouLikeView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03B1A9022EC8555B006C353F /* SRHomeYouLikeView.swift */; }; + 03B1A9052EC857B3006C353F /* SRHomeYouLikeCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03B1A9042EC857B3006C353F /* SRHomeYouLikeCell.swift */; }; + 03B1A9072EC86656006C353F /* SRGradientView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03B1A9062EC86656006C353F /* SRGradientView.swift */; }; + 03B1A9092ECAAF55006C353F /* SRHomeTopChartsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03B1A9082ECAAF55006C353F /* SRHomeTopChartsView.swift */; }; + 03B1A90B2ECAB2EA006C353F /* SRHomeTopChartsContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03B1A90A2ECAB2EA006C353F /* SRHomeTopChartsContentView.swift */; }; + 03B1A90D2ECAC51A006C353F /* NSNumber+SRAdd.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03B1A90C2ECAC512006C353F /* NSNumber+SRAdd.swift */; }; + 03B1A90F2ECAC768006C353F /* SRHomeBingeWorthyView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03B1A90E2ECAC768006C353F /* SRHomeBingeWorthyView.swift */; }; + 03B1A9112ECAC927006C353F /* SRHomeBingeWorthyCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03B1A9102ECAC927006C353F /* SRHomeBingeWorthyCell.swift */; }; + 03B1A9132ECAED04006C353F /* SRHomeViralHitsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03B1A9122ECAED04006C353F /* SRHomeViralHitsView.swift */; }; + 03B1A9152ECAEE63006C353F /* SRHomeViralHitsCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03B1A9142ECAEE63006C353F /* SRHomeViralHitsCell.swift */; }; + 03B1A9172ECAF14F006C353F /* SRHomeHotView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03B1A9162ECAF14F006C353F /* SRHomeHotView.swift */; }; + 03B1A9192ECAF2E6006C353F /* SRHomePremiereNowView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03B1A9182ECAF2E6006C353F /* SRHomePremiereNowView.swift */; }; + 03B1A91B2ECAFFD6006C353F /* UIView+SRAdd.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03B1A91A2ECAFFCB006C353F /* UIView+SRAdd.swift */; }; + 03B1A91D2ECB2424006C353F /* UIScrollView+SRAdd.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03B1A91C2ECB241B006C353F /* UIScrollView+SRAdd.swift */; }; + 03B1A91F2ECB2A0E006C353F /* SRHomeBannerMiniCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03B1A91E2ECB2A0E006C353F /* SRHomeBannerMiniCell.swift */; }; + 03B1A9222ECB456C006C353F /* SRDetailPlayerViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03B1A9212ECB456C006C353F /* SRDetailPlayerViewController.swift */; }; + 03B1A9262ECBFF31006C353F /* SRShortPlayerViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03B1A9252ECBFF31006C353F /* SRShortPlayerViewModel.swift */; }; + 03B1A9282ECC05B1006C353F /* SRShortDetailModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03B1A9272ECC05B1006C353F /* SRShortDetailModel.swift */; }; + 03B1A92A2ECC0738006C353F /* SRShortApi.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03B1A9292ECC072C006C353F /* SRShortApi.swift */; }; + 03B1A92C2ECC0A7A006C353F /* SRShortDetailPlayerCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03B1A92B2ECC0A7A006C353F /* SRShortDetailPlayerCell.swift */; }; + 03B1A92E2ECC0D7E006C353F /* SRShortDetailControlView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03B1A92D2ECC0D7E006C353F /* SRShortDetailControlView.swift */; }; + 03B1A9302ECC10D1006C353F /* SRSearchViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03B1A92F2ECC10D1006C353F /* SRSearchViewController.swift */; }; + 03B1A9322ECC1167006C353F /* SRSearchHomeView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03B1A9312ECC1167006C353F /* SRSearchHomeView.swift */; }; + 03B1A9342ECC12D9006C353F /* SRSearchTextView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03B1A9332ECC12D9006C353F /* SRSearchTextView.swift */; }; + 03B1A9362ECC1D1D006C353F /* SRSearchRecordView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03B1A9352ECC1D1D006C353F /* SRSearchRecordView.swift */; }; + 03B1A9382ECC210D006C353F /* SRSearchRecordCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03B1A9372ECC210D006C353F /* SRSearchRecordCell.swift */; }; + 03B1A93A2ECC3F54006C353F /* SRSearchViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03B1A9392ECC3F54006C353F /* SRSearchViewModel.swift */; }; + 03B1A93C2ECC406E006C353F /* SRHotSearchView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03B1A93B2ECC406E006C353F /* SRHotSearchView.swift */; }; + 03B1A93E2ECC4568006C353F /* SRTableView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03B1A93D2ECC4568006C353F /* SRTableView.swift */; }; + 03B1A9402ECC45BA006C353F /* SRTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03B1A93F2ECC45BA006C353F /* SRTableViewCell.swift */; }; + 03B1A9422ECC4632006C353F /* SRHotSearchCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03B1A9412ECC4632006C353F /* SRHotSearchCell.swift */; }; + 03B1A9442ECC4ED9006C353F /* SRSearchResultView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03B1A9432ECC4ED9006C353F /* SRSearchResultView.swift */; }; + 03B1A9462ECC5679006C353F /* SRSearchResultCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03B1A9452ECC5679006C353F /* SRSearchResultCell.swift */; }; + 03B1A9482ECC6669006C353F /* SRProgressView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03B1A9472ECC6669006C353F /* SRProgressView.swift */; }; + 03B1A94A2ECC79AB006C353F /* SREpSelectorView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03B1A9492ECC79AB006C353F /* SREpSelectorView.swift */; }; + 03B1A94C2ECC7A2D006C353F /* SRPanModalContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03B1A94B2ECC7A2D006C353F /* SRPanModalContentView.swift */; }; + 03B1A94E2ECD604B006C353F /* SREpSelectorCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03B1A94D2ECD604B006C353F /* SREpSelectorCell.swift */; }; + 03B1A9502ECEB4E6006C353F /* SRRecommendPlayerViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03B1A94F2ECEB4E6006C353F /* SRRecommendPlayerViewController.swift */; }; + 03E9A7C92EC47177000D1067 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03E9A7BF2EC47177000D1067 /* AppDelegate.swift */; }; + 03E9A7CA2EC47177000D1067 /* SceneDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03E9A7C62EC47177000D1067 /* SceneDelegate.swift */; }; + 03E9A7CC2EC47177000D1067 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 03E9A7C02EC47177000D1067 /* Assets.xcassets */; }; + 03E9A7CE2EC47177000D1067 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 03E9A7C32EC47177000D1067 /* LaunchScreen.storyboard */; }; + 03E9A7D72EC47A23000D1067 /* SRResponseCryptor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03E9A7D62EC479FE000D1067 /* SRResponseCryptor.swift */; }; + 03E9A7D92EC47B90000D1067 /* SRNetworkReachableManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03E9A7D82EC47B90000D1067 /* SRNetworkReachableManager.swift */; }; + 03E9A7DB2EC485BE000D1067 /* SRNetwork.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03E9A7DA2EC485B3000D1067 /* SRNetwork.swift */; }; + 03E9A7DD2EC485E1000D1067 /* SRNetworkModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03E9A7DC2EC485DD000D1067 /* SRNetworkModel.swift */; }; + 03E9A7E22EC494F9000D1067 /* SRTargetType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03E9A7E12EC494F9000D1067 /* SRTargetType.swift */; }; + 03E9A7E42EC49593000D1067 /* SRUrlPath.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03E9A7E32EC49584000D1067 /* SRUrlPath.swift */; }; + 03E9A7E72EC49819000D1067 /* SRDefine.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03E9A7E62EC49813000D1067 /* SRDefine.swift */; }; + 03E9A7EA2EC4995D000D1067 /* SRKeychain.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03E9A7E92EC4995D000D1067 /* SRKeychain.swift */; }; + 03E9A7EC2EC499A9000D1067 /* SRDeviceId.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03E9A7EB2EC499A9000D1067 /* SRDeviceId.swift */; }; + 03E9A7EF2EC4A8AF000D1067 /* SRAccountManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03E9A7EE2EC4A8AF000D1067 /* SRAccountManager.swift */; }; + 03E9A7F22EC4A8F6000D1067 /* UserDefaults+SRAdd.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03E9A7F12EC4A8EC000D1067 /* UserDefaults+SRAdd.swift */; }; + 03E9A7F42EC4A94D000D1067 /* SRAccountToken.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03E9A7F32EC4A94D000D1067 /* SRAccountToken.swift */; }; + 03E9A7F62EC4A9B1000D1067 /* SRUserInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03E9A7F52EC4A9B1000D1067 /* SRUserInfo.swift */; }; + 03E9A7F82EC4AA54000D1067 /* SRUserDefaultsKey.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03E9A7F72EC4AA4F000D1067 /* SRUserDefaultsKey.swift */; }; + 03E9A7FA2EC56D03000D1067 /* String+SRAdd.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03E9A7F92EC56CFC000D1067 /* String+SRAdd.swift */; }; + 03E9A7FD2EC57658000D1067 /* SRUserApi.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03E9A7FC2EC5763B000D1067 /* SRUserApi.swift */; }; + 47BB39E2DD30787FA591F8EB /* Pods_SynthReel.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F9255BF4D4B1CFDDB5CFFB43 /* Pods_SynthReel.framework */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + 03980F4E2ECEB91C0006E317 /* SRRecommendPlayerViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SRRecommendPlayerViewModel.swift; sourceTree = ""; }; + 03980F502ECEBEE20006E317 /* SRRecommendPlayerCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SRRecommendPlayerCell.swift; sourceTree = ""; }; + 03980F522ECEDEAB0006E317 /* SRRecommendPlayerControlView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SRRecommendPlayerControlView.swift; sourceTree = ""; }; + 03980F582ECEED190006E317 /* SRMyShortViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SRMyShortViewController.swift; sourceTree = ""; }; + 03B1A8382EC5C8CE006C353F /* SRHud.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SRHud.swift; sourceTree = ""; }; + 03B1A83A2EC5C8DB006C353F /* SRToast.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SRToast.swift; sourceTree = ""; }; + 03B1A83D2EC5C91A006C353F /* SRTool.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SRTool.swift; sourceTree = ""; }; + 03B1A83F2EC5CA2E006C353F /* AppDelegate+Config.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "AppDelegate+Config.swift"; sourceTree = ""; }; + 03B1A8422EC5CB99006C353F /* SRTabBarController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SRTabBarController.swift; sourceTree = ""; }; + 03B1A8442EC5CBBB006C353F /* SRNavigationController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SRNavigationController.swift; sourceTree = ""; }; + 03B1A8462EC5CBCF006C353F /* SRViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SRViewController.swift; sourceTree = ""; }; + 03B1A84F2EC5DB2E006C353F /* SRHomeViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SRHomeViewController.swift; sourceTree = ""; }; + 03B1A8522EC5E129006C353F /* UIScreen+SRAdd.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIScreen+SRAdd.swift"; sourceTree = ""; }; + 03B1A8542EC5E429006C353F /* UIFont+SRAdd.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIFont+SRAdd.swift"; sourceTree = ""; }; + 03B1A8572EC5E4F1006C353F /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/Localizable.strings; sourceTree = ""; }; + 03B1A8692EC6BD49006C353F /* Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Bridging-Header.h"; sourceTree = ""; }; + 03B1A8D42EC6CF37006C353F /* SRHomeChildViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SRHomeChildViewController.swift; sourceTree = ""; }; + 03B1A8D72EC6D051006C353F /* SRCollectionView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SRCollectionView.swift; sourceTree = ""; }; + 03B1A8DA2EC6D0EB006C353F /* SRHomeChildCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SRHomeChildCell.swift; sourceTree = ""; }; + 03B1A8DB2EC6D0EB006C353F /* SRHomeChildCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = SRHomeChildCell.xib; sourceTree = ""; }; + 03B1A8E02EC6D6D3006C353F /* SRHomeMenuDataSource.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SRHomeMenuDataSource.swift; sourceTree = ""; }; + 03B1A8E22EC6F577006C353F /* SRHomeMenuCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SRHomeMenuCell.swift; sourceTree = ""; }; + 03B1A8E42EC715DA006C353F /* SRHomeApi.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SRHomeApi.swift; sourceTree = ""; }; + 03B1A8E62EC7175D006C353F /* SRCategoryModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SRCategoryModel.swift; sourceTree = ""; }; + 03B1A8E82EC721CD006C353F /* SRLabel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SRLabel.swift; sourceTree = ""; }; + 03B1A8EC2EC72C18006C353F /* SRHomeModuleItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SRHomeModuleItem.swift; sourceTree = ""; }; + 03B1A8EE2EC72C78006C353F /* SRShortModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SRShortModel.swift; sourceTree = ""; }; + 03B1A8F02EC72DD7006C353F /* SRHomeViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SRHomeViewModel.swift; sourceTree = ""; }; + 03B1A8F22EC809C5006C353F /* SRHomeHeaderView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SRHomeHeaderView.swift; sourceTree = ""; }; + 03B1A8F42EC81277006C353F /* SRHomeBannerView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SRHomeBannerView.swift; sourceTree = ""; }; + 03B1A8F82EC813BC006C353F /* SRScrollView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SRScrollView.swift; sourceTree = ""; }; + 03B1A8FA2EC818B6006C353F /* UIStackView+SRAdd.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIStackView+SRAdd.swift"; sourceTree = ""; }; + 03B1A8FC2EC81C62006C353F /* SRHomeBannerCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SRHomeBannerCell.swift; sourceTree = ""; }; + 03B1A8FE2EC81C92006C353F /* SRImageView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SRImageView.swift; sourceTree = ""; }; + 03B1A9002EC852B2006C353F /* SRHomeModuleView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SRHomeModuleView.swift; sourceTree = ""; }; + 03B1A9022EC8555B006C353F /* SRHomeYouLikeView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SRHomeYouLikeView.swift; sourceTree = ""; }; + 03B1A9042EC857B3006C353F /* SRHomeYouLikeCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SRHomeYouLikeCell.swift; sourceTree = ""; }; + 03B1A9062EC86656006C353F /* SRGradientView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SRGradientView.swift; sourceTree = ""; }; + 03B1A9082ECAAF55006C353F /* SRHomeTopChartsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SRHomeTopChartsView.swift; sourceTree = ""; }; + 03B1A90A2ECAB2EA006C353F /* SRHomeTopChartsContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SRHomeTopChartsContentView.swift; sourceTree = ""; }; + 03B1A90C2ECAC512006C353F /* NSNumber+SRAdd.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NSNumber+SRAdd.swift"; sourceTree = ""; }; + 03B1A90E2ECAC768006C353F /* SRHomeBingeWorthyView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SRHomeBingeWorthyView.swift; sourceTree = ""; }; + 03B1A9102ECAC927006C353F /* SRHomeBingeWorthyCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SRHomeBingeWorthyCell.swift; sourceTree = ""; }; + 03B1A9122ECAED04006C353F /* SRHomeViralHitsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SRHomeViralHitsView.swift; sourceTree = ""; }; + 03B1A9142ECAEE63006C353F /* SRHomeViralHitsCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SRHomeViralHitsCell.swift; sourceTree = ""; }; + 03B1A9162ECAF14F006C353F /* SRHomeHotView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SRHomeHotView.swift; sourceTree = ""; }; + 03B1A9182ECAF2E6006C353F /* SRHomePremiereNowView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SRHomePremiereNowView.swift; sourceTree = ""; }; + 03B1A91A2ECAFFCB006C353F /* UIView+SRAdd.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIView+SRAdd.swift"; sourceTree = ""; }; + 03B1A91C2ECB241B006C353F /* UIScrollView+SRAdd.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIScrollView+SRAdd.swift"; sourceTree = ""; }; + 03B1A91E2ECB2A0E006C353F /* SRHomeBannerMiniCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SRHomeBannerMiniCell.swift; sourceTree = ""; }; + 03B1A9212ECB456C006C353F /* SRDetailPlayerViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SRDetailPlayerViewController.swift; sourceTree = ""; }; + 03B1A9252ECBFF31006C353F /* SRShortPlayerViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SRShortPlayerViewModel.swift; sourceTree = ""; }; + 03B1A9272ECC05B1006C353F /* SRShortDetailModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SRShortDetailModel.swift; sourceTree = ""; }; + 03B1A9292ECC072C006C353F /* SRShortApi.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SRShortApi.swift; sourceTree = ""; }; + 03B1A92B2ECC0A7A006C353F /* SRShortDetailPlayerCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SRShortDetailPlayerCell.swift; sourceTree = ""; }; + 03B1A92D2ECC0D7E006C353F /* SRShortDetailControlView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SRShortDetailControlView.swift; sourceTree = ""; }; + 03B1A92F2ECC10D1006C353F /* SRSearchViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SRSearchViewController.swift; sourceTree = ""; }; + 03B1A9312ECC1167006C353F /* SRSearchHomeView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SRSearchHomeView.swift; sourceTree = ""; }; + 03B1A9332ECC12D9006C353F /* SRSearchTextView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SRSearchTextView.swift; sourceTree = ""; }; + 03B1A9352ECC1D1D006C353F /* SRSearchRecordView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SRSearchRecordView.swift; sourceTree = ""; }; + 03B1A9372ECC210D006C353F /* SRSearchRecordCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SRSearchRecordCell.swift; sourceTree = ""; }; + 03B1A9392ECC3F54006C353F /* SRSearchViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SRSearchViewModel.swift; sourceTree = ""; }; + 03B1A93B2ECC406E006C353F /* SRHotSearchView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SRHotSearchView.swift; sourceTree = ""; }; + 03B1A93D2ECC4568006C353F /* SRTableView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SRTableView.swift; sourceTree = ""; }; + 03B1A93F2ECC45BA006C353F /* SRTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SRTableViewCell.swift; sourceTree = ""; }; + 03B1A9412ECC4632006C353F /* SRHotSearchCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SRHotSearchCell.swift; sourceTree = ""; }; + 03B1A9432ECC4ED9006C353F /* SRSearchResultView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SRSearchResultView.swift; sourceTree = ""; }; + 03B1A9452ECC5679006C353F /* SRSearchResultCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SRSearchResultCell.swift; sourceTree = ""; }; + 03B1A9472ECC6669006C353F /* SRProgressView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SRProgressView.swift; sourceTree = ""; }; + 03B1A9492ECC79AB006C353F /* SREpSelectorView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SREpSelectorView.swift; sourceTree = ""; }; + 03B1A94B2ECC7A2D006C353F /* SRPanModalContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SRPanModalContentView.swift; sourceTree = ""; }; + 03B1A94D2ECD604B006C353F /* SREpSelectorCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SREpSelectorCell.swift; sourceTree = ""; }; + 03B1A94F2ECEB4E6006C353F /* SRRecommendPlayerViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SRRecommendPlayerViewController.swift; sourceTree = ""; }; + 03E9A7A72EC4716A000D1067 /* SynthReel.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = SynthReel.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 03E9A7BF2EC47177000D1067 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 03E9A7C02EC47177000D1067 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 03E9A7C12EC47177000D1067 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 03E9A7C22EC47177000D1067 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; + 03E9A7C62EC47177000D1067 /* SceneDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SceneDelegate.swift; sourceTree = ""; }; + 03E9A7D62EC479FE000D1067 /* SRResponseCryptor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SRResponseCryptor.swift; sourceTree = ""; }; + 03E9A7D82EC47B90000D1067 /* SRNetworkReachableManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SRNetworkReachableManager.swift; sourceTree = ""; }; + 03E9A7DA2EC485B3000D1067 /* SRNetwork.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SRNetwork.swift; sourceTree = ""; }; + 03E9A7DC2EC485DD000D1067 /* SRNetworkModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SRNetworkModel.swift; sourceTree = ""; }; + 03E9A7E12EC494F9000D1067 /* SRTargetType.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SRTargetType.swift; sourceTree = ""; }; + 03E9A7E32EC49584000D1067 /* SRUrlPath.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SRUrlPath.swift; sourceTree = ""; }; + 03E9A7E62EC49813000D1067 /* SRDefine.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SRDefine.swift; sourceTree = ""; }; + 03E9A7E92EC4995D000D1067 /* SRKeychain.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SRKeychain.swift; sourceTree = ""; }; + 03E9A7EB2EC499A9000D1067 /* SRDeviceId.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SRDeviceId.swift; sourceTree = ""; }; + 03E9A7EE2EC4A8AF000D1067 /* SRAccountManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SRAccountManager.swift; sourceTree = ""; }; + 03E9A7F12EC4A8EC000D1067 /* UserDefaults+SRAdd.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UserDefaults+SRAdd.swift"; sourceTree = ""; }; + 03E9A7F32EC4A94D000D1067 /* SRAccountToken.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SRAccountToken.swift; sourceTree = ""; }; + 03E9A7F52EC4A9B1000D1067 /* SRUserInfo.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SRUserInfo.swift; sourceTree = ""; }; + 03E9A7F72EC4AA4F000D1067 /* SRUserDefaultsKey.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SRUserDefaultsKey.swift; sourceTree = ""; }; + 03E9A7F92EC56CFC000D1067 /* String+SRAdd.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "String+SRAdd.swift"; sourceTree = ""; }; + 03E9A7FC2EC5763B000D1067 /* SRUserApi.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SRUserApi.swift; sourceTree = ""; }; + 59DC746604B26E9FF802D317 /* Pods-SynthReel.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-SynthReel.debug.xcconfig"; path = "Target Support Files/Pods-SynthReel/Pods-SynthReel.debug.xcconfig"; sourceTree = ""; }; + AA88214030574193B51DE563 /* Pods-SynthReel.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-SynthReel.release.xcconfig"; path = "Target Support Files/Pods-SynthReel/Pods-SynthReel.release.xcconfig"; sourceTree = ""; }; + F9255BF4D4B1CFDDB5CFFB43 /* Pods_SynthReel.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_SynthReel.framework; sourceTree = BUILT_PRODUCTS_DIR; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 03E9A7A42EC4716A000D1067 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 03B1A84D2EC5DA43006C353F /* SnapKit in Frameworks */, + 03B1A84A2EC5CE37006C353F /* ESTabBarController in Frameworks */, + 47BB39E2DD30787FA591F8EB /* Pods_SynthReel.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 03980F542ECEEC990006E317 /* MyShort */ = { + isa = PBXGroup; + children = ( + 03980F552ECEECB30006E317 /* VC */, + 03980F562ECEECBC0006E317 /* V */, + 03980F572ECEECCC0006E317 /* M */, + ); + path = MyShort; + sourceTree = ""; + }; + 03980F552ECEECB30006E317 /* VC */ = { + isa = PBXGroup; + children = ( + 03980F582ECEED190006E317 /* SRMyShortViewController.swift */, + ); + path = VC; + sourceTree = ""; + }; + 03980F562ECEECBC0006E317 /* V */ = { + isa = PBXGroup; + children = ( + ); + path = V; + sourceTree = ""; + }; + 03980F572ECEECCC0006E317 /* M */ = { + isa = PBXGroup; + children = ( + ); + path = M; + sourceTree = ""; + }; + 03B1A8372EC5C8BF006C353F /* SRHud */ = { + isa = PBXGroup; + children = ( + 03B1A83A2EC5C8DB006C353F /* SRToast.swift */, + 03B1A8382EC5C8CE006C353F /* SRHud.swift */, + ); + path = SRHud; + sourceTree = ""; + }; + 03B1A83C2EC5C90F006C353F /* Tool */ = { + isa = PBXGroup; + children = ( + 03B1A83D2EC5C91A006C353F /* SRTool.swift */, + ); + path = Tool; + sourceTree = ""; + }; + 03B1A8412EC5CB4F006C353F /* ViewController */ = { + isa = PBXGroup; + children = ( + 03B1A8422EC5CB99006C353F /* SRTabBarController.swift */, + 03B1A8442EC5CBBB006C353F /* SRNavigationController.swift */, + 03B1A8462EC5CBCF006C353F /* SRViewController.swift */, + ); + path = ViewController; + sourceTree = ""; + }; + 03B1A84E2EC5DB13006C353F /* Home */ = { + isa = PBXGroup; + children = ( + 03B1A8512EC5DB32006C353F /* VC */, + 03B1A8D92EC6D0BA006C353F /* V */, + 03B1A8DE2EC6D698006C353F /* M */, + 03B1A8DF2EC6D69F006C353F /* VM */, + ); + path = Home; + sourceTree = ""; + }; + 03B1A8512EC5DB32006C353F /* VC */ = { + isa = PBXGroup; + children = ( + 03B1A84F2EC5DB2E006C353F /* SRHomeViewController.swift */, + 03B1A8D42EC6CF37006C353F /* SRHomeChildViewController.swift */, + 03B1A92F2ECC10D1006C353F /* SRSearchViewController.swift */, + ); + path = VC; + sourceTree = ""; + }; + 03B1A8592EC6BC22006C353F /* Thirdparty */ = { + isa = PBXGroup; + children = ( + ); + path = Thirdparty; + sourceTree = ""; + }; + 03B1A8D62EC6D03A006C353F /* View */ = { + isa = PBXGroup; + children = ( + 03B1A8D72EC6D051006C353F /* SRCollectionView.swift */, + 03B1A8E82EC721CD006C353F /* SRLabel.swift */, + 03B1A8F82EC813BC006C353F /* SRScrollView.swift */, + 03B1A8FE2EC81C92006C353F /* SRImageView.swift */, + 03B1A9062EC86656006C353F /* SRGradientView.swift */, + 03B1A93D2ECC4568006C353F /* SRTableView.swift */, + 03B1A93F2ECC45BA006C353F /* SRTableViewCell.swift */, + 03B1A94B2ECC7A2D006C353F /* SRPanModalContentView.swift */, + ); + path = View; + sourceTree = ""; + }; + 03B1A8D92EC6D0BA006C353F /* V */ = { + isa = PBXGroup; + children = ( + 03B1A8DA2EC6D0EB006C353F /* SRHomeChildCell.swift */, + 03B1A8DB2EC6D0EB006C353F /* SRHomeChildCell.xib */, + 03B1A8E22EC6F577006C353F /* SRHomeMenuCell.swift */, + 03B1A8F22EC809C5006C353F /* SRHomeHeaderView.swift */, + 03B1A8F42EC81277006C353F /* SRHomeBannerView.swift */, + 03B1A8FC2EC81C62006C353F /* SRHomeBannerCell.swift */, + 03B1A91E2ECB2A0E006C353F /* SRHomeBannerMiniCell.swift */, + 03B1A9022EC8555B006C353F /* SRHomeYouLikeView.swift */, + 03B1A9042EC857B3006C353F /* SRHomeYouLikeCell.swift */, + 03B1A9002EC852B2006C353F /* SRHomeModuleView.swift */, + 03B1A9082ECAAF55006C353F /* SRHomeTopChartsView.swift */, + 03B1A90A2ECAB2EA006C353F /* SRHomeTopChartsContentView.swift */, + 03B1A9162ECAF14F006C353F /* SRHomeHotView.swift */, + 03B1A90E2ECAC768006C353F /* SRHomeBingeWorthyView.swift */, + 03B1A9102ECAC927006C353F /* SRHomeBingeWorthyCell.swift */, + 03B1A9122ECAED04006C353F /* SRHomeViralHitsView.swift */, + 03B1A9142ECAEE63006C353F /* SRHomeViralHitsCell.swift */, + 03B1A9182ECAF2E6006C353F /* SRHomePremiereNowView.swift */, + 03B1A9332ECC12D9006C353F /* SRSearchTextView.swift */, + 03B1A9312ECC1167006C353F /* SRSearchHomeView.swift */, + 03B1A9352ECC1D1D006C353F /* SRSearchRecordView.swift */, + 03B1A9372ECC210D006C353F /* SRSearchRecordCell.swift */, + 03B1A93B2ECC406E006C353F /* SRHotSearchView.swift */, + 03B1A9412ECC4632006C353F /* SRHotSearchCell.swift */, + 03B1A9432ECC4ED9006C353F /* SRSearchResultView.swift */, + 03B1A9452ECC5679006C353F /* SRSearchResultCell.swift */, + ); + path = V; + sourceTree = ""; + }; + 03B1A8DE2EC6D698006C353F /* M */ = { + isa = PBXGroup; + children = ( + 03B1A8E62EC7175D006C353F /* SRCategoryModel.swift */, + 03B1A8EC2EC72C18006C353F /* SRHomeModuleItem.swift */, + ); + path = M; + sourceTree = ""; + }; + 03B1A8DF2EC6D69F006C353F /* VM */ = { + isa = PBXGroup; + children = ( + 03B1A8E02EC6D6D3006C353F /* SRHomeMenuDataSource.swift */, + 03B1A8F02EC72DD7006C353F /* SRHomeViewModel.swift */, + 03B1A9392ECC3F54006C353F /* SRSearchViewModel.swift */, + ); + path = VM; + sourceTree = ""; + }; + 03B1A8EA2EC72BFB006C353F /* Player */ = { + isa = PBXGroup; + children = ( + 03B1A9202ECB2F25006C353F /* VC */, + 03B1A9242ECBFF03006C353F /* V */, + 03B1A8EB2EC72C0E006C353F /* M */, + 03B1A9232ECBFEF9006C353F /* VM */, + ); + path = Player; + sourceTree = ""; + }; + 03B1A8EB2EC72C0E006C353F /* M */ = { + isa = PBXGroup; + children = ( + 03B1A8EE2EC72C78006C353F /* SRShortModel.swift */, + 03B1A9272ECC05B1006C353F /* SRShortDetailModel.swift */, + ); + path = M; + sourceTree = ""; + }; + 03B1A9202ECB2F25006C353F /* VC */ = { + isa = PBXGroup; + children = ( + 03B1A9212ECB456C006C353F /* SRDetailPlayerViewController.swift */, + 03B1A94F2ECEB4E6006C353F /* SRRecommendPlayerViewController.swift */, + ); + path = VC; + sourceTree = ""; + }; + 03B1A9232ECBFEF9006C353F /* VM */ = { + isa = PBXGroup; + children = ( + 03B1A9252ECBFF31006C353F /* SRShortPlayerViewModel.swift */, + 03980F4E2ECEB91C0006E317 /* SRRecommendPlayerViewModel.swift */, + ); + path = VM; + sourceTree = ""; + }; + 03B1A9242ECBFF03006C353F /* V */ = { + isa = PBXGroup; + children = ( + 03B1A92B2ECC0A7A006C353F /* SRShortDetailPlayerCell.swift */, + 03B1A92D2ECC0D7E006C353F /* SRShortDetailControlView.swift */, + 03980F502ECEBEE20006E317 /* SRRecommendPlayerCell.swift */, + 03980F522ECEDEAB0006E317 /* SRRecommendPlayerControlView.swift */, + 03B1A9472ECC6669006C353F /* SRProgressView.swift */, + 03B1A9492ECC79AB006C353F /* SREpSelectorView.swift */, + 03B1A94D2ECD604B006C353F /* SREpSelectorCell.swift */, + ); + path = V; + sourceTree = ""; + }; + 03E9A79E2EC4716A000D1067 = { + isa = PBXGroup; + children = ( + 03E9A7C82EC47177000D1067 /* SynthReel */, + 03E9A7A82EC4716A000D1067 /* Products */, + 8CAFCEC2C631CAE75726D90C /* Pods */, + CF8628F3EB7A59852BCAF359 /* Frameworks */, + ); + sourceTree = ""; + }; + 03E9A7A82EC4716A000D1067 /* Products */ = { + isa = PBXGroup; + children = ( + 03E9A7A72EC4716A000D1067 /* SynthReel.app */, + ); + name = Products; + sourceTree = ""; + }; + 03E9A7C82EC47177000D1067 /* SynthReel */ = { + isa = PBXGroup; + children = ( + 03E9A7D02EC471D6000D1067 /* Delegate */, + 03E9A7D22EC47204000D1067 /* Base */, + 03E9A7D32EC4720F000D1067 /* Class */, + 03E9A7D12EC471F3000D1067 /* Source */, + 03E9A7D42EC4764A000D1067 /* Libs */, + 03B1A8592EC6BC22006C353F /* Thirdparty */, + ); + path = SynthReel; + sourceTree = ""; + }; + 03E9A7D02EC471D6000D1067 /* Delegate */ = { + isa = PBXGroup; + children = ( + 03E9A7BF2EC47177000D1067 /* AppDelegate.swift */, + 03E9A7C62EC47177000D1067 /* SceneDelegate.swift */, + 03B1A83F2EC5CA2E006C353F /* AppDelegate+Config.swift */, + ); + path = Delegate; + sourceTree = ""; + }; + 03E9A7D12EC471F3000D1067 /* Source */ = { + isa = PBXGroup; + children = ( + 03E9A7C02EC47177000D1067 /* Assets.xcassets */, + 03E9A7C12EC47177000D1067 /* Info.plist */, + 03E9A7C32EC47177000D1067 /* LaunchScreen.storyboard */, + 03B1A8562EC5E4F1006C353F /* Localizable.strings */, + 03B1A8692EC6BD49006C353F /* Bridging-Header.h */, + ); + path = Source; + sourceTree = ""; + }; + 03E9A7D22EC47204000D1067 /* Base */ = { + isa = PBXGroup; + children = ( + 03B1A8412EC5CB4F006C353F /* ViewController */, + 03B1A8D62EC6D03A006C353F /* View */, + 03E9A7F02EC4A8DD000D1067 /* Extension */, + 03E9A7E52EC49804000D1067 /* Define */, + 03E9A7D52EC478C7000D1067 /* Networking */, + 03E9A7FB2EC5761A000D1067 /* API */, + ); + path = Base; + sourceTree = ""; + }; + 03E9A7D32EC4720F000D1067 /* Class */ = { + isa = PBXGroup; + children = ( + 03980F542ECEEC990006E317 /* MyShort */, + 03B1A84E2EC5DB13006C353F /* Home */, + 03B1A8EA2EC72BFB006C353F /* Player */, + ); + path = Class; + sourceTree = ""; + }; + 03E9A7D42EC4764A000D1067 /* Libs */ = { + isa = PBXGroup; + children = ( + 03B1A83C2EC5C90F006C353F /* Tool */, + 03B1A8372EC5C8BF006C353F /* SRHud */, + 03E9A7ED2EC4A855000D1067 /* SRAccount */, + 03E9A7E82EC49910000D1067 /* SRDeviceID */, + ); + path = Libs; + sourceTree = ""; + }; + 03E9A7D52EC478C7000D1067 /* Networking */ = { + isa = PBXGroup; + children = ( + 03E9A7DA2EC485B3000D1067 /* SRNetwork.swift */, + 03E9A7E12EC494F9000D1067 /* SRTargetType.swift */, + 03E9A7E32EC49584000D1067 /* SRUrlPath.swift */, + 03E9A7DC2EC485DD000D1067 /* SRNetworkModel.swift */, + 03E9A7D62EC479FE000D1067 /* SRResponseCryptor.swift */, + 03E9A7D82EC47B90000D1067 /* SRNetworkReachableManager.swift */, + ); + path = Networking; + sourceTree = ""; + }; + 03E9A7E52EC49804000D1067 /* Define */ = { + isa = PBXGroup; + children = ( + 03E9A7F72EC4AA4F000D1067 /* SRUserDefaultsKey.swift */, + 03E9A7E62EC49813000D1067 /* SRDefine.swift */, + ); + path = Define; + sourceTree = ""; + }; + 03E9A7E82EC49910000D1067 /* SRDeviceID */ = { + isa = PBXGroup; + children = ( + 03E9A7EB2EC499A9000D1067 /* SRDeviceId.swift */, + 03E9A7E92EC4995D000D1067 /* SRKeychain.swift */, + ); + path = SRDeviceID; + sourceTree = ""; + }; + 03E9A7ED2EC4A855000D1067 /* SRAccount */ = { + isa = PBXGroup; + children = ( + 03E9A7EE2EC4A8AF000D1067 /* SRAccountManager.swift */, + 03E9A7F32EC4A94D000D1067 /* SRAccountToken.swift */, + 03E9A7F52EC4A9B1000D1067 /* SRUserInfo.swift */, + ); + path = SRAccount; + sourceTree = ""; + }; + 03E9A7F02EC4A8DD000D1067 /* Extension */ = { + isa = PBXGroup; + children = ( + 03B1A90C2ECAC512006C353F /* NSNumber+SRAdd.swift */, + 03B1A8FA2EC818B6006C353F /* UIStackView+SRAdd.swift */, + 03B1A8542EC5E429006C353F /* UIFont+SRAdd.swift */, + 03B1A8522EC5E129006C353F /* UIScreen+SRAdd.swift */, + 03E9A7F92EC56CFC000D1067 /* String+SRAdd.swift */, + 03E9A7F12EC4A8EC000D1067 /* UserDefaults+SRAdd.swift */, + 03B1A91A2ECAFFCB006C353F /* UIView+SRAdd.swift */, + 03B1A91C2ECB241B006C353F /* UIScrollView+SRAdd.swift */, + ); + path = Extension; + sourceTree = ""; + }; + 03E9A7FB2EC5761A000D1067 /* API */ = { + isa = PBXGroup; + children = ( + 03B1A9292ECC072C006C353F /* SRShortApi.swift */, + 03B1A8E42EC715DA006C353F /* SRHomeApi.swift */, + 03E9A7FC2EC5763B000D1067 /* SRUserApi.swift */, + ); + path = API; + sourceTree = ""; + }; + 8CAFCEC2C631CAE75726D90C /* Pods */ = { + isa = PBXGroup; + children = ( + 59DC746604B26E9FF802D317 /* Pods-SynthReel.debug.xcconfig */, + AA88214030574193B51DE563 /* Pods-SynthReel.release.xcconfig */, + ); + path = Pods; + sourceTree = ""; + }; + CF8628F3EB7A59852BCAF359 /* Frameworks */ = { + isa = PBXGroup; + children = ( + F9255BF4D4B1CFDDB5CFFB43 /* Pods_SynthReel.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 03E9A7A62EC4716A000D1067 /* SynthReel */ = { + isa = PBXNativeTarget; + buildConfigurationList = 03E9A7BA2EC4716C000D1067 /* Build configuration list for PBXNativeTarget "SynthReel" */; + buildPhases = ( + B73FFE5658F839BD48F75FE4 /* [CP] Check Pods Manifest.lock */, + 03E9A7A32EC4716A000D1067 /* Sources */, + 03E9A7A42EC4716A000D1067 /* Frameworks */, + 03E9A7A52EC4716A000D1067 /* Resources */, + 92A47CFFAED31670C9452A17 /* [CP] Embed Pods Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = SynthReel; + productName = SynthReel; + productReference = 03E9A7A72EC4716A000D1067 /* SynthReel.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 03E9A79F2EC4716A000D1067 /* Project object */ = { + isa = PBXProject; + attributes = { + BuildIndependentTargetsInParallel = 1; + CLASSPREFIX = SR; + LastSwiftUpdateCheck = 2600; + LastUpgradeCheck = 2600; + ORGANIZATIONNAME = SR; + TargetAttributes = { + 03E9A7A62EC4716A000D1067 = { + CreatedOnToolsVersion = 26.0.1; + }; + }; + }; + buildConfigurationList = 03E9A7A22EC4716A000D1067 /* Build configuration list for PBXProject "SynthReel" */; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 03E9A79E2EC4716A000D1067; + minimizedProjectReferenceProxies = 1; + packageReferences = ( + 03B1A8482EC5CE37006C353F /* XCRemoteSwiftPackageReference "ESTabBarController" */, + 03B1A84B2EC5DA43006C353F /* XCRemoteSwiftPackageReference "SnapKit" */, + ); + preferredProjectObjectVersion = 77; + productRefGroup = 03E9A7A82EC4716A000D1067 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 03E9A7A62EC4716A000D1067 /* SynthReel */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 03E9A7A52EC4716A000D1067 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 03E9A7CC2EC47177000D1067 /* Assets.xcassets in Resources */, + 03B1A8582EC5E4F1006C353F /* Localizable.strings in Resources */, + 03B1A8DD2EC6D0EB006C353F /* SRHomeChildCell.xib in Resources */, + 03E9A7CE2EC47177000D1067 /* LaunchScreen.storyboard in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 92A47CFFAED31670C9452A17 /* [CP] Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-SynthReel/Pods-SynthReel-frameworks-${CONFIGURATION}-input-files.xcfilelist", + ); + inputPaths = ( + ); + name = "[CP] Embed Pods Frameworks"; + outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-SynthReel/Pods-SynthReel-frameworks-${CONFIGURATION}-output-files.xcfilelist", + ); + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-SynthReel/Pods-SynthReel-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; + B73FFE5658F839BD48F75FE4 /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-SynthReel-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 03E9A7A32EC4716A000D1067 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 03B1A9402ECC45BA006C353F /* SRTableViewCell.swift in Sources */, + 03E9A7EA2EC4995D000D1067 /* SRKeychain.swift in Sources */, + 03E9A7D92EC47B90000D1067 /* SRNetworkReachableManager.swift in Sources */, + 03B1A8532EC5E12E006C353F /* UIScreen+SRAdd.swift in Sources */, + 03B1A8FB2EC818BE006C353F /* UIStackView+SRAdd.swift in Sources */, + 03B1A8E12EC6D6D3006C353F /* SRHomeMenuDataSource.swift in Sources */, + 03E9A7F82EC4AA54000D1067 /* SRUserDefaultsKey.swift in Sources */, + 03B1A8452EC5CBBB006C353F /* SRNavigationController.swift in Sources */, + 03B1A9092ECAAF55006C353F /* SRHomeTopChartsView.swift in Sources */, + 03E9A7E42EC49593000D1067 /* SRUrlPath.swift in Sources */, + 03B1A9462ECC5679006C353F /* SRSearchResultCell.swift in Sources */, + 03B1A9502ECEB4E6006C353F /* SRRecommendPlayerViewController.swift in Sources */, + 03B1A83E2EC5C91E006C353F /* SRTool.swift in Sources */, + 03B1A9172ECAF14F006C353F /* SRHomeHotView.swift in Sources */, + 03B1A8FD2EC81C62006C353F /* SRHomeBannerCell.swift in Sources */, + 03E9A7DB2EC485BE000D1067 /* SRNetwork.swift in Sources */, + 03E9A7F42EC4A94D000D1067 /* SRAccountToken.swift in Sources */, + 03B1A8E72EC7175D006C353F /* SRCategoryModel.swift in Sources */, + 03B1A94A2ECC79AB006C353F /* SREpSelectorView.swift in Sources */, + 03B1A94E2ECD604B006C353F /* SREpSelectorCell.swift in Sources */, + 03B1A9262ECBFF31006C353F /* SRShortPlayerViewModel.swift in Sources */, + 03B1A9322ECC1167006C353F /* SRSearchHomeView.swift in Sources */, + 03B1A8F32EC809C5006C353F /* SRHomeHeaderView.swift in Sources */, + 03B1A9482ECC6669006C353F /* SRProgressView.swift in Sources */, + 03B1A91D2ECB2424006C353F /* UIScrollView+SRAdd.swift in Sources */, + 03E9A7C92EC47177000D1067 /* AppDelegate.swift in Sources */, + 03E9A7FA2EC56D03000D1067 /* String+SRAdd.swift in Sources */, + 03B1A9192ECAF2E6006C353F /* SRHomePremiereNowView.swift in Sources */, + 03B1A92C2ECC0A7A006C353F /* SRShortDetailPlayerCell.swift in Sources */, + 03B1A8392EC5C8D6006C353F /* SRHud.swift in Sources */, + 03E9A7EC2EC499A9000D1067 /* SRDeviceId.swift in Sources */, + 03E9A7E22EC494F9000D1067 /* SRTargetType.swift in Sources */, + 03980F532ECEDEAB0006E317 /* SRRecommendPlayerControlView.swift in Sources */, + 03B1A90F2ECAC768006C353F /* SRHomeBingeWorthyView.swift in Sources */, + 03B1A9072EC86656006C353F /* SRGradientView.swift in Sources */, + 03E9A7CA2EC47177000D1067 /* SceneDelegate.swift in Sources */, + 03B1A8402EC5CA37006C353F /* AppDelegate+Config.swift in Sources */, + 03B1A9152ECAEE63006C353F /* SRHomeViralHitsCell.swift in Sources */, + 03B1A8472EC5CBCF006C353F /* SRViewController.swift in Sources */, + 03B1A9032EC8555B006C353F /* SRHomeYouLikeView.swift in Sources */, + 03B1A9362ECC1D1D006C353F /* SRSearchRecordView.swift in Sources */, + 03B1A8D82EC6D051006C353F /* SRCollectionView.swift in Sources */, + 03B1A90D2ECAC51A006C353F /* NSNumber+SRAdd.swift in Sources */, + 03E9A7DD2EC485E1000D1067 /* SRNetworkModel.swift in Sources */, + 03B1A9442ECC4ED9006C353F /* SRSearchResultView.swift in Sources */, + 03B1A8FF2EC81C92006C353F /* SRImageView.swift in Sources */, + 03B1A83B2EC5C8E0006C353F /* SRToast.swift in Sources */, + 03B1A9302ECC10D1006C353F /* SRSearchViewController.swift in Sources */, + 03B1A8432EC5CB99006C353F /* SRTabBarController.swift in Sources */, + 03B1A8EF2EC72C78006C353F /* SRShortModel.swift in Sources */, + 03B1A8ED2EC72C1F006C353F /* SRHomeModuleItem.swift in Sources */, + 03B1A9112ECAC927006C353F /* SRHomeBingeWorthyCell.swift in Sources */, + 03E9A7F22EC4A8F6000D1067 /* UserDefaults+SRAdd.swift in Sources */, + 03B1A93A2ECC3F54006C353F /* SRSearchViewModel.swift in Sources */, + 03E9A7F62EC4A9B1000D1067 /* SRUserInfo.swift in Sources */, + 03B1A8F92EC813BC006C353F /* SRScrollView.swift in Sources */, + 03B1A8E92EC721CD006C353F /* SRLabel.swift in Sources */, + 03B1A9282ECC05B1006C353F /* SRShortDetailModel.swift in Sources */, + 03980F592ECEED190006E317 /* SRMyShortViewController.swift in Sources */, + 03B1A92A2ECC0738006C353F /* SRShortApi.swift in Sources */, + 03B1A90B2ECAB2EA006C353F /* SRHomeTopChartsContentView.swift in Sources */, + 03B1A94C2ECC7A2D006C353F /* SRPanModalContentView.swift in Sources */, + 03B1A9052EC857B3006C353F /* SRHomeYouLikeCell.swift in Sources */, + 03B1A92E2ECC0D7E006C353F /* SRShortDetailControlView.swift in Sources */, + 03B1A9382ECC210D006C353F /* SRSearchRecordCell.swift in Sources */, + 03E9A7D72EC47A23000D1067 /* SRResponseCryptor.swift in Sources */, + 03B1A8502EC5DB2E006C353F /* SRHomeViewController.swift in Sources */, + 03B1A8E52EC715E1006C353F /* SRHomeApi.swift in Sources */, + 03B1A8D52EC6CF37006C353F /* SRHomeChildViewController.swift in Sources */, + 03B1A8F12EC72DD7006C353F /* SRHomeViewModel.swift in Sources */, + 03E9A7FD2EC57658000D1067 /* SRUserApi.swift in Sources */, + 03E9A7E72EC49819000D1067 /* SRDefine.swift in Sources */, + 03B1A9012EC852B2006C353F /* SRHomeModuleView.swift in Sources */, + 03E9A7EF2EC4A8AF000D1067 /* SRAccountManager.swift in Sources */, + 03B1A8F52EC81277006C353F /* SRHomeBannerView.swift in Sources */, + 03B1A9132ECAED04006C353F /* SRHomeViralHitsView.swift in Sources */, + 03B1A8DC2EC6D0EB006C353F /* SRHomeChildCell.swift in Sources */, + 03B1A8552EC5E434006C353F /* UIFont+SRAdd.swift in Sources */, + 03980F512ECEBEE20006E317 /* SRRecommendPlayerCell.swift in Sources */, + 03B1A91B2ECAFFD6006C353F /* UIView+SRAdd.swift in Sources */, + 03B1A9222ECB456C006C353F /* SRDetailPlayerViewController.swift in Sources */, + 03B1A91F2ECB2A0E006C353F /* SRHomeBannerMiniCell.swift in Sources */, + 03B1A93E2ECC4568006C353F /* SRTableView.swift in Sources */, + 03980F4F2ECEB91C0006E317 /* SRRecommendPlayerViewModel.swift in Sources */, + 03B1A9422ECC4632006C353F /* SRHotSearchCell.swift in Sources */, + 03B1A9342ECC12D9006C353F /* SRSearchTextView.swift in Sources */, + 03B1A93C2ECC406E006C353F /* SRHotSearchView.swift in Sources */, + 03B1A8E32EC6F577006C353F /* SRHomeMenuCell.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXVariantGroup section */ + 03B1A8562EC5E4F1006C353F /* Localizable.strings */ = { + isa = PBXVariantGroup; + children = ( + 03B1A8572EC5E4F1006C353F /* en */, + ); + name = Localizable.strings; + sourceTree = ""; + }; + 03E9A7C32EC47177000D1067 /* LaunchScreen.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 03E9A7C22EC47177000D1067 /* Base */, + ); + name = LaunchScreen.storyboard; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 03E9A7BB2EC4716C000D1067 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 59DC746604B26E9FF802D317 /* Pods-SynthReel.debug.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = 6XALB8RSYF; + EXCLUDED_ARCHS = ""; + "EXCLUDED_ARCHS[sdk=iphonesimulator*]" = arm64; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_FILE = SynthReel/Source/Info.plist; + INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; + INFOPLIST_KEY_UILaunchStoryboardName = LaunchScreen; + INFOPLIST_KEY_UIMainStoryboardFile = ""; + INFOPLIST_KEY_UISupportedInterfaceOrientations = UIInterfaceOrientationPortrait; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown"; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = com.hbqinjiu.SynthReel; + PRODUCT_NAME = "$(TARGET_NAME)"; + STRING_CATALOG_GENERATE_SYMBOLS = YES; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; + SUPPORTS_MACCATALYST = NO; + SWIFT_APPROACHABLE_CONCURRENCY = YES; + SWIFT_DEFAULT_ACTOR_ISOLATION = MainActor; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_OBJC_BRIDGING_HEADER = "SynthReel/Source/Bridging-Header.h"; + SWIFT_UPCOMING_FEATURE_MEMBER_IMPORT_VISIBILITY = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = 1; + }; + name = Debug; + }; + 03E9A7BC2EC4716C000D1067 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = AA88214030574193B51DE563 /* Pods-SynthReel.release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = 6XALB8RSYF; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_FILE = SynthReel/Source/Info.plist; + INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; + INFOPLIST_KEY_UILaunchStoryboardName = LaunchScreen; + INFOPLIST_KEY_UIMainStoryboardFile = ""; + INFOPLIST_KEY_UISupportedInterfaceOrientations = UIInterfaceOrientationPortrait; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown"; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = com.hbqinjiu.SynthReel; + PRODUCT_NAME = "$(TARGET_NAME)"; + STRING_CATALOG_GENERATE_SYMBOLS = YES; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; + SUPPORTS_MACCATALYST = NO; + SWIFT_APPROACHABLE_CONCURRENCY = YES; + SWIFT_DEFAULT_ACTOR_ISOLATION = MainActor; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_OBJC_BRIDGING_HEADER = "SynthReel/Source/Bridging-Header.h"; + SWIFT_UPCOMING_FEATURE_MEMBER_IMPORT_VISIBILITY = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = 1; + }; + name = Release; + }; + 03E9A7BD2EC4716C000D1067 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + DEVELOPMENT_TEAM = 6XALB8RSYF; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + GCC_C_LANGUAGE_STANDARD = gnu17; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 26.0; + LOCALIZATION_PREFERS_STRING_CATALOGS = YES; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "DEBUG $(inherited)"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + }; + name = Debug; + }; + 03E9A7BE2EC4716C000D1067 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + DEVELOPMENT_TEAM = 6XALB8RSYF; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + GCC_C_LANGUAGE_STANDARD = gnu17; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 26.0; + LOCALIZATION_PREFERS_STRING_CATALOGS = YES; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + SDKROOT = iphoneos; + SWIFT_COMPILATION_MODE = wholemodule; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 03E9A7A22EC4716A000D1067 /* Build configuration list for PBXProject "SynthReel" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 03E9A7BD2EC4716C000D1067 /* Debug */, + 03E9A7BE2EC4716C000D1067 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 03E9A7BA2EC4716C000D1067 /* Build configuration list for PBXNativeTarget "SynthReel" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 03E9A7BB2EC4716C000D1067 /* Debug */, + 03E9A7BC2EC4716C000D1067 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + +/* Begin XCRemoteSwiftPackageReference section */ + 03B1A8482EC5CE37006C353F /* XCRemoteSwiftPackageReference "ESTabBarController" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "https://github.com/eggswift/ESTabBarController.git"; + requirement = { + kind = upToNextMajorVersion; + minimumVersion = 2.9.0; + }; + }; + 03B1A84B2EC5DA43006C353F /* XCRemoteSwiftPackageReference "SnapKit" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "https://github.com/SnapKit/SnapKit"; + requirement = { + kind = upToNextMajorVersion; + minimumVersion = 5.7.1; + }; + }; +/* End XCRemoteSwiftPackageReference section */ + +/* Begin XCSwiftPackageProductDependency section */ + 03B1A8492EC5CE37006C353F /* ESTabBarController */ = { + isa = XCSwiftPackageProductDependency; + package = 03B1A8482EC5CE37006C353F /* XCRemoteSwiftPackageReference "ESTabBarController" */; + productName = ESTabBarController; + }; + 03B1A84C2EC5DA43006C353F /* SnapKit */ = { + isa = XCSwiftPackageProductDependency; + package = 03B1A84B2EC5DA43006C353F /* XCRemoteSwiftPackageReference "SnapKit" */; + productName = SnapKit; + }; +/* End XCSwiftPackageProductDependency section */ + }; + rootObject = 03E9A79F2EC4716A000D1067 /* Project object */; +} diff --git a/SynthReel.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/SynthReel.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..919434a --- /dev/null +++ b/SynthReel.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/SynthReel.xcodeproj/xcshareddata/xcschemes/SynthReel.xcscheme b/SynthReel.xcodeproj/xcshareddata/xcschemes/SynthReel.xcscheme new file mode 100644 index 0000000..4076887 --- /dev/null +++ b/SynthReel.xcodeproj/xcshareddata/xcschemes/SynthReel.xcscheme @@ -0,0 +1,78 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/SynthReel.xcworkspace/contents.xcworkspacedata b/SynthReel.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..0a349e5 --- /dev/null +++ b/SynthReel.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,10 @@ + + + + + + + diff --git a/SynthReel.xcworkspace/xcshareddata/swiftpm/Package.resolved b/SynthReel.xcworkspace/xcshareddata/swiftpm/Package.resolved new file mode 100644 index 0000000..4145a73 --- /dev/null +++ b/SynthReel.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -0,0 +1,24 @@ +{ + "originHash" : "0e62262c59a183f44748a161870cc0f2b76e1b0e46f648559704e4be9de523b9", + "pins" : [ + { + "identity" : "estabbarcontroller", + "kind" : "remoteSourceControl", + "location" : "https://github.com/eggswift/ESTabBarController.git", + "state" : { + "revision" : "93a30b833a05fd916c6d4c5d6e94a270cf3b6636", + "version" : "2.9.0" + } + }, + { + "identity" : "snapkit", + "kind" : "remoteSourceControl", + "location" : "https://github.com/SnapKit/SnapKit", + "state" : { + "revision" : "2842e6e84e82eb9a8dac0100ca90d9444b0307f4", + "version" : "5.7.1" + } + } + ], + "version" : 3 +} diff --git a/SynthReel/Base/API/SRHomeApi.swift b/SynthReel/Base/API/SRHomeApi.swift new file mode 100644 index 0000000..b70aeff --- /dev/null +++ b/SynthReel/Base/API/SRHomeApi.swift @@ -0,0 +1,92 @@ +// +// SRHomeApi.swift +// SynthReel +// +// Created by 湖北秦九 on 2025/11/14. +// Copyright © 2025 SR. All rights reserved. +// + +import UIKit +import Alamofire + + +struct SRHomeApi { + + static func requestCategoryList() async -> [SRCategoryModel]? { + + await withCheckedContinuation { continuation in + var param = SRNetwork.Parameters(path: "/getCategories") + param.method = .get + SRNetwork.request(parameters: param) { (response: SRNetwork.Response>) in + continuation.resume(returning: response.data?.list) + } + } + + } + + static func requestHomeModulesData() async -> [SRHomeModuleItem]? { + await withCheckedContinuation { continuation in + var param = SRNetwork.Parameters(path: "/home/all-modules") + param.method = .get + SRNetwork.request(parameters: param) { (response: SRNetwork.Response>) in + continuation.resume(returning: response.data?.list) + } + } + } + + static func requestCategoryVideoData(_ id: String, page: Int) async -> [SRShortModel]? { + await withCheckedContinuation { continuation in + var param = SRNetwork.Parameters(path: "/videoList") + param.method = .get + param.parameters = [ + "category_id" : id, + "current_page" : page, + "page_size" : 20 + ] + SRNetwork.request(parameters: param) { (response: SRNetwork.Response>) in + continuation.resume(returning: response.data?.list) + } + } + } + + static func requestHotSearchData() async -> [SRShortModel]? { + await withCheckedContinuation { continuation in + var param = SRNetwork.Parameters(path: "/search/hots") + param.method = .get + + SRNetwork.request(parameters: param) { (response: SRNetwork.Response>) in + continuation.resume(returning: response.data?.list) + } + } + } + + static func requestSearch(_ text: String) async -> [SRShortModel]? { + await withCheckedContinuation { continuation in + var param = SRNetwork.Parameters(path: "/search") + param.method = .get + param.parameters = [ + "search" : text + ] + + SRNetwork.request(parameters: param) { (response: SRNetwork.Response>) in + continuation.resume(returning: response.data?.list) + } + } + } + + static func requestHomeRecommendData(page: Int) async -> [SRShortModel]? { + await withCheckedContinuation { continuation in + var param = SRNetwork.Parameters(path: "/getRecommands") + param.method = .get + param.parameters = [ + "page_size" : 20, + "current_page" : page + ] + + SRNetwork.request(parameters: param) { (response: SRNetwork.Response>) in + continuation.resume(returning: response.data?.list) + } + } + } + +} diff --git a/SynthReel/Base/API/SRShortApi.swift b/SynthReel/Base/API/SRShortApi.swift new file mode 100644 index 0000000..615e710 --- /dev/null +++ b/SynthReel/Base/API/SRShortApi.swift @@ -0,0 +1,88 @@ +// +// SRShortApi.swift +// SynthReel +// +// Created by 湖北秦九 on 2025/11/18. +// Copyright © 2025 SR. All rights reserved. +// + +import UIKit +import Alamofire + +struct SRShortApi { + + static func requestShortDetail(_ id: String) async -> (SRShortDetailModel?, Int?, String?) { + await withCheckedContinuation { continuation in + var param = SRNetwork.Parameters(path: "/getVideoDetails") + param.method = .get + param.parameters = [ + "short_play_id" : id, + "video_id" : 0, + ] + SRNetwork.request(parameters: param) { (response: SRNetwork.Response) in + if response.isSuccess { + continuation.resume(returning:(response.data, response.code, response.msg)) + } else { + continuation.resume(returning:(nil, response.code, response.msg)) + } + } + } + } + + static func requestShortCollect(shortId: String, videoId: String?, isCollect: Bool) async -> Bool { + await withCheckedContinuation { continuation in + var path = "" + if isCollect { + path = "/collect" + } else { + path = "/cancelCollect" + } + + var param = SRNetwork.Parameters(path: path) + param.isLoding = true + param.parameters = [ + "short_play_id" : shortId, + "video_id" : videoId ?? "0", + ] + + SRNetwork.request(parameters: param) { (response: SRNetwork.Response) in + if response.isSuccess { + continuation.resume(returning: true) + NotificationCenter.default.post(name: SRShortApi.updateShortCollectStateNotification, object: nil, userInfo: [ + "state" : isCollect, + "id" : shortId, + ]) + } else { + continuation.resume(returning: false) + } + } + } + } + + static func requestCreatePlayHistory(shortId: String?, videoId: String?) async { + guard let shortId = shortId else { return } + + await withCheckedContinuation { continuation in + var param = SRNetwork.Parameters(path: "/createHistory") + param.isToast = false + param.parameters = [ + "short_play_id" : shortId, + "video_id" : videoId ?? "0", + ] + SRNetwork.request(parameters: param) { (response: SRNetwork.Response) in + continuation.resume() + } + } + } + + +} + + +extension SRShortApi { + + + ///更新短剧关注状态 [ "state" : isCollect, "id" : shortPlayId,] + static let updateShortCollectStateNotification = NSNotification.Name(rawValue: "SRShortApi.updateShortCollectStateNotification") + +} diff --git a/SynthReel/Base/API/SRUserApi.swift b/SynthReel/Base/API/SRUserApi.swift new file mode 100644 index 0000000..40d6cc6 --- /dev/null +++ b/SynthReel/Base/API/SRUserApi.swift @@ -0,0 +1,25 @@ +// +// SRUserApi.swift +// SynthReel +// +// Created by 湖北秦九 on 2025/11/13. +// Copyright © 2025 SR. All rights reserved. +// + +import Foundation +import Alamofire + + +struct SRUserApi { + + static func requestUserInfo() async -> SRUserInfo? { + + await withCheckedContinuation { continuation in + var param = SRNetwork.Parameters(path: "/customer/info") + param.method = .get + SRNetwork.request(parameters: param) { (response: SRNetwork.Response) in + continuation.resume(returning: response.data) + } + } + } +} diff --git a/SynthReel/Base/Define/SRDefine.swift b/SynthReel/Base/Define/SRDefine.swift new file mode 100644 index 0000000..356f28d --- /dev/null +++ b/SynthReel/Base/Define/SRDefine.swift @@ -0,0 +1,24 @@ +// +// SRDefine.swift +// SynthReel +// +// Created by 湖北秦九 on 2025/11/12. +// Copyright © 2025 SR. All rights reserved. +// +import UIKit + +///app版本号 +let kSRAPPVersion: String = (Bundle.main.infoDictionary!["CFBundleShortVersionString"] as? String) ?? "0" +let kSRAPPBundleVersion: String = (Bundle.main.infoDictionary!["CFBundleVersion"] as? String) ?? "0" + +let kSRAPPBundleName: String = (Bundle.main.infoDictionary!["CFBundleName"] as? String) ?? "" +let kSRAPPName: String = (Bundle.main.infoDictionary!["CFBundleDisplayName"] as? String) ?? "" + + +#if DEBUG +public func srPrint(message: Any? , file: String = #file, function: String = #function, line: Int = #line) { + print("\n\(Date(timeIntervalSinceNow: 8 * 60 * 60)) \(file.components(separatedBy: "/").last ?? "") \(function) \(line): \(message ?? "")") +} +#else +public func srPrint(message: Any?) { } +#endif diff --git a/SynthReel/Base/Define/SRUserDefaultsKey.swift b/SynthReel/Base/Define/SRUserDefaultsKey.swift new file mode 100644 index 0000000..db5c64d --- /dev/null +++ b/SynthReel/Base/Define/SRUserDefaultsKey.swift @@ -0,0 +1,14 @@ +// +// SRUserDefaultsKey.swift +// SynthReel +// +// Created by 湖北秦九 on 2025/11/12. +// Copyright © 2025 SR. All rights reserved. +// + + +///登录token +let kSRAccountTokenDefaultsKey = "kSRAccountTokenDefaultsKey" + +///用户信息 +let kSRUserInfoDefaultsKey = "kSRUserInfoDefaultsKey" diff --git a/SynthReel/Base/Extension/NSNumber+SRAdd.swift b/SynthReel/Base/Extension/NSNumber+SRAdd.swift new file mode 100644 index 0000000..319ebad --- /dev/null +++ b/SynthReel/Base/Extension/NSNumber+SRAdd.swift @@ -0,0 +1,43 @@ +// +// NSNumber+SRAdd.swift +// SynthReel +// +// Created by 湖北秦九 on 2025/11/17. +// Copyright © 2025 SR. All rights reserved. +// + +import UIKit + +extension NSNumber { + + func toString(maximumFractionDigits: Int = 10, minimumFractionDigits: Int? = nil, roundingMode: NumberFormatter.RoundingMode? = nil) -> String { + let formatter = NumberFormatter() + formatter.minimumIntegerDigits = 1 + formatter.maximumFractionDigits = maximumFractionDigits + if let minimumFractionDigits = minimumFractionDigits { + formatter.minimumFractionDigits = minimumFractionDigits + } + if let roundingMode = roundingMode { + formatter.roundingMode = roundingMode + } + formatter.numberStyle = .none + return formatter.string(from: self) ?? "0" + } +} + +extension Int { + + func formatTimeGroup() -> (String, String, String) { + let seconds = self + + var s: String = "00" + var m: String = "00" + var h: String = "00" + s = String(format: "%02d", Int(Int(seconds) % 60)) + m = String(format: "%02d", Int(seconds / 60) % 60) + h = String(format: "%02d", Int(seconds / 3600)) + + return (h, m, s) + } + +} diff --git a/SynthReel/Base/Extension/String+SRAdd.swift b/SynthReel/Base/Extension/String+SRAdd.swift new file mode 100644 index 0000000..1079396 --- /dev/null +++ b/SynthReel/Base/Extension/String+SRAdd.swift @@ -0,0 +1,26 @@ +// +// String+SRAdd.swift +// SynthReel +// +// Created by 湖北秦九 on 2025/11/13. +// Copyright © 2025 SR. All rights reserved. +// + +import UIKit +import YYCategories + +extension String { + + var localized: String { + return String(localized: LocalizationValue(self)) + } + + func localizedReplace(text: String) -> String { + return self.localized.replacingOccurrences(of: "##", with: text) + } + + func size(_ font: UIFont, _ size: CGSize) -> CGSize { + return (self as NSString).size(for: font, size: size, mode: .byWordWrapping) + } + +} diff --git a/SynthReel/Base/Extension/UIFont+SRAdd.swift b/SynthReel/Base/Extension/UIFont+SRAdd.swift new file mode 100644 index 0000000..c77e250 --- /dev/null +++ b/SynthReel/Base/Extension/UIFont+SRAdd.swift @@ -0,0 +1,18 @@ +// +// UIFont+SRAdd.swift +// SynthReel +// +// Created by 湖北秦九 on 2025/11/13. +// Copyright © 2025 SR. All rights reserved. +// + +import UIKit + + +extension UIFont { + + static func font(ofSize: CGFloat, weight: Weight) -> UIFont { + return .systemFont(ofSize: ofSize, weight: weight) + } + +} diff --git a/SynthReel/Base/Extension/UIScreen+SRAdd.swift b/SynthReel/Base/Extension/UIScreen+SRAdd.swift new file mode 100644 index 0000000..071dadb --- /dev/null +++ b/SynthReel/Base/Extension/UIScreen+SRAdd.swift @@ -0,0 +1,50 @@ +// +// UIScreen+SRAdd.swift +// SynthReel +// +// Created by 湖北秦九 on 2025/11/13. +// Copyright © 2025 SR. All rights reserved. +// + +import UIKit + +extension UIScreen { + + static var screen: UIScreen { + return UIScreen.main + } + + static var width: CGFloat { + return UIScreen.main.bounds.width + } + + static var height: CGFloat { + return UIScreen.main.bounds.height + } + + static var safeTop: CGFloat { + return SRTool.keyWindow?.safeAreaInsets.top ?? 20 + } + + static var safeBottom: CGFloat { + return SRTool.keyWindow?.safeAreaInsets.bottom ?? 0 + } + + static var navBarHeight: CGFloat { + return safeTop + 44 + } + + static var tabBarHeight: CGFloat { + return safeBottom + 49 + } + + ///屏幕宽比 + static var widthRatio: CGFloat { + return UIScreen.width / 375 + } + + static func getRatioWidth(size: CGFloat) -> CGFloat { + return self.widthRatio * size + } + +} diff --git a/SynthReel/Base/Extension/UIScrollView+SRAdd.swift b/SynthReel/Base/Extension/UIScrollView+SRAdd.swift new file mode 100644 index 0000000..d95a0ec --- /dev/null +++ b/SynthReel/Base/Extension/UIScrollView+SRAdd.swift @@ -0,0 +1,46 @@ +// +// UIScrollView+SRAdd.swift +// SynthReel +// +// Created by 湖北秦九 on 2025/11/17. +// Copyright © 2025 SR. All rights reserved. +// + +import MJRefresh + +extension UIScrollView { + + func sr_addRefreshHeader(insetTop: CGFloat = 0, block: (() -> Void)?) { + + self.mj_header = MJRefreshNormalHeader(refreshingBlock: { + block?() + }) + self.mj_header?.ignoredScrollViewContentInsetTop = insetTop + } + + func sr_addRefreshFooter(insetBottom: CGFloat = 0, block: (() -> Void)?) { + self.mj_footer = MJRefreshBackNormalFooter(refreshingBlock: { + block?() + }) + self.mj_footer?.ignoredScrollViewContentInsetBottom = insetBottom + } + + + func sr_endHeaderRefreshing() { + self.mj_header?.endRefreshing() + } + + func sr_endFooterRefreshing() { + if self.mj_footer?.state == .noMoreData { return } + self.mj_footer?.endRefreshing() + } + + ///重置没有更多 + func sr_resetNoMoreData() { + self.mj_footer?.resetNoMoreData() + } + + func sr_endRefreshingWithNoMoreData() { + self.mj_footer?.endRefreshingWithNoMoreData() + } +} diff --git a/SynthReel/Base/Extension/UIStackView+SRAdd.swift b/SynthReel/Base/Extension/UIStackView+SRAdd.swift new file mode 100644 index 0000000..9e251bb --- /dev/null +++ b/SynthReel/Base/Extension/UIStackView+SRAdd.swift @@ -0,0 +1,22 @@ +// +// UIStackView+SRAdd.swift +// SynthReel +// +// Created by 湖北秦九 on 2025/11/15. +// Copyright © 2025 SR. All rights reserved. +// + +import UIKit + +extension UIStackView { + + func sr_removeAllArrangedSubview() { + let arrangedSubviews = self.arrangedSubviews + + arrangedSubviews.forEach { + self.removeArrangedSubview($0) + $0.removeFromSuperview() + } + } +} + diff --git a/SynthReel/Base/Extension/UIView+SRAdd.swift b/SynthReel/Base/Extension/UIView+SRAdd.swift new file mode 100644 index 0000000..df18b12 --- /dev/null +++ b/SynthReel/Base/Extension/UIView+SRAdd.swift @@ -0,0 +1,92 @@ +// +// UIView+SRAdd.swift +// SynthReel +// +// Created by 湖北秦九 on 2025/11/17. +// Copyright © 2025 SR. All rights reserved. +// + +import UIKit + +extension UIView { + + ///绘制正六边形 + func applyHexagonMask(_ cornerRadius: CGFloat = 0) { + let width = bounds.width + let height = bounds.height + let center = CGPoint(x: width / 2, y: height / 2) + + let radius = max(width, height) / 2 + + let path = UIBezierPath() + + // 六边形 6 个点(平顶) + var points: [CGPoint] = [] + for i in 0..<6 { + let angle = CGFloat(i) * (.pi / 3) + let x = center.x + radius * cos(angle) + let y = center.y + radius * sin(angle) + points.append(CGPoint(x: x, y: y)) + } + + // 创建带圆角的六边形 + for i in 0..<6 { + let prev = points[(i + 5) % 6] // 上一个点 + let curr = points[i] // 当前点 + let next = points[(i + 1) % 6] // 下一个点 + + // 当前点方向的两条边的单位向量 + let v1 = CGPoint(x: curr.x - prev.x, y: curr.y - prev.y) + let v2 = CGPoint(x: curr.x - next.x, y: curr.y - next.y) + + let l1 = sqrt(v1.x * v1.x + v1.y * v1.y) + let l2 = sqrt(v2.x * v2.x + v2.y * v2.y) + + let u1 = CGPoint(x: v1.x / l1, y: v1.y / l1) + let u2 = CGPoint(x: v2.x / l2, y: v2.y / l2) + + // 两边分别往内缩 cornerRadius + let p1 = CGPoint(x: curr.x - u1.x * cornerRadius, + y: curr.y - u1.y * cornerRadius) + let p2 = CGPoint(x: curr.x - u2.x * cornerRadius, + y: curr.y - u2.y * cornerRadius) + + if i == 0 { + path.move(to: p1) + } else { + path.addLine(to: p1) + } + + // 两个偏移点之间加圆角弧线 + path.addQuadCurve(to: p2, controlPoint: curr) + } + + path.close() + + // 设置 mask + let maskLayer = CAShapeLayer() + maskLayer.path = path.cgPath + layer.mask = maskLayer + } + + + func addHollowHole(holePath: UIBezierPath, dimColor: UIColor = UIColor.black.withAlphaComponent(0.6)) { + // 1. 整个遮罩 + let fullPath = UIBezierPath(rect: self.bounds) + + // 2. 挖洞 + fullPath.append(holePath) + fullPath.usesEvenOddFillRule = true + + // 3. 蒙层 layer + let shapeLayer = CAShapeLayer() + shapeLayer.path = fullPath.cgPath + shapeLayer.fillRule = .evenOdd + shapeLayer.fillColor = dimColor.cgColor // 半透明遮罩 + shapeLayer.opacity = 1.0 + +// self.layer.sublayers?.forEach { $0.removeFromSuperlayer() } // 如需避免重复叠加 +// self.layer.addSublayer(shapeLayer) + self.layer.mask = shapeLayer + } +} diff --git a/SynthReel/Base/Extension/UserDefaults+SRAdd.swift b/SynthReel/Base/Extension/UserDefaults+SRAdd.swift new file mode 100644 index 0000000..da70b84 --- /dev/null +++ b/SynthReel/Base/Extension/UserDefaults+SRAdd.swift @@ -0,0 +1,46 @@ +// +// UserDefaults+SRAdd.swift +// SynthReel +// +// Created by 湖北秦九 on 2025/11/12. +// Copyright © 2025 SR. All rights reserved. +// + + +import Foundation + + +extension UserDefaults { + + static func sr_setObject(_ obj: NSSecureCoding?, forKey key: String) { + let defaults = UserDefaults.standard + + guard let obj = obj else { + defaults.removeObject(forKey: key) + return + } + + do { + let data = try NSKeyedArchiver.archivedData(withRootObject: obj, requiringSecureCoding: true) + defaults.set(data, forKey: key) + } catch { + print("Error archiving object: \(error)") + } + } + + static func sr_object(forKey key: String, as type: T.Type) -> T? { + let defaults = UserDefaults.standard + + guard let data = defaults.data(forKey: key) else { + return nil + } + + do { + let object = try NSKeyedUnarchiver.unarchivedObject(ofClass: type, from: data) + return object + } catch { + print("Error unarchiving object: \(error)") + return nil + } + } +} diff --git a/SynthReel/Base/Networking/SRNetwork.swift b/SynthReel/Base/Networking/SRNetwork.swift new file mode 100644 index 0000000..4bf2e21 --- /dev/null +++ b/SynthReel/Base/Networking/SRNetwork.swift @@ -0,0 +1,193 @@ +// +// SRNetwork.swift +// SynthReel +// +// Created by 湖北秦九 on 2025/11/12. +// Copyright © 2025 SR. All rights reserved. +// + +import UIKit +import Moya +import SmartCodable + +class SRNetwork: NSObject { + + private static let operationQueue = OperationQueue() + private static var tokenOperation: BlockOperation? + + static let provider = MoyaProvider() + + + static func request(parameters: SRNetwork.Parameters, completion: ((_ response: SRNetwork.Response) -> Void)?) { + + if SRAccountManager.manager.token == nil { + self.requestToken(completer: nil) + } + + + if let tokenOperation = self.tokenOperation, parameters.path != "/customer/register" { + + let requestOperation = BlockOperation { + let semaphore = DispatchSemaphore(value: 0) + _request(parameters: parameters) { (response: SRNetwork.Response) in + semaphore.signal() + completion?(response) + } + semaphore.wait() + } + ///设置依赖关系 + requestOperation.addDependency(tokenOperation) + + operationQueue.addOperation(requestOperation) + } else { + _request(parameters: parameters, completion: completion) + } + } + + @discardableResult + static func _request(parameters: SRNetwork.Parameters, completion: ((_ response: SRNetwork.Response) -> Void)?) -> Cancellable { + + if parameters.isLoding { + SRHud.show() + } + return provider.request(.request(parameters: parameters)) { result in + if parameters.isLoding { + SRHud.dismiss() + } + guard let completion = completion else {return} + _resultDispose(parameters: parameters, result: result, completion: completion) + } + } + + private static func _resultDispose(parameters: SRNetwork.Parameters, result: Result, completion: ((_ response: SRNetwork.Response) -> Void)?) { + + switch result { + case .success(let response): + let code = response.statusCode + if code == 401 || code == 402 || code == 403 { + + if parameters.path == "/customer/register" { + var res = SRNetwork.Response() + res.code = -1 + if parameters.isToast { +// BRToast.show(text: "Error".localized) + } + completion?(res) + } else { +// if code == 402, parameters.isToast { +// BRToast.show(text: "beereel_network_error_1".localized) +// } + ///重新获取token + self.requestToken { token in + if token != nil { + _Concurrency.Task { + await SRAccountManager.manager.updateUserInfo() + } + } + } + + ///将请求失败数据重新请求 + if let tokenOperation = self.tokenOperation, parameters.path != "/customer/register" { + + let requestOperation = BlockOperation { + let semaphore = DispatchSemaphore(value: 0) + _request(parameters: parameters) { (response: SRNetwork.Response) in + semaphore.signal() + completion?(response) + } + semaphore.wait() + } + ///设置依赖关系 + requestOperation.addDependency(tokenOperation) + + operationQueue.addOperation(requestOperation) + } + } + + + return + } + + do { + let tempData = try response.mapString() + srPrint(message: parameters.parameters) + srPrint(message: parameters.path) + + let response: SRNetwork.Response = _deserialize(data: tempData) + if !response.isSuccess{ + if parameters.isToast { +// BRToast.show(text: response.msg) + } + } + completion?(response) + + } catch { + var res = SRNetwork.Response() + res.code = -1 + if parameters.isToast { +// BRToast.show(text: "Error".localized) + } + completion?(res) + } + case .failure(let error): + srPrint(message: error) + var res = SRNetwork.Response() + res.code = -1 + if parameters.isToast { +// BRToast.show(text: "beereel_network".localized) + } + completion?(res) + break + } + + } + + ///解析数据 + static private func _deserialize(data: String) -> SRNetwork.Response { + var response: SRNetwork.Response? + + let decrypted = SRResponseCryptor.decrypt(data: data) + srPrint(message: decrypted) + response = SRNetwork.Response.deserialize(from: decrypted) + response?.rawData = decrypted + + if let response = response { + return response + } else { + var response = SRNetwork.Response() + response.code = -1 + response.msg = "Error".localized + return response + } + } +} + +extension SRNetwork { + ///获取token + static func requestToken(completer: ((_ token: SRAccountToken?) -> Void)?) { + guard self.tokenOperation == nil else { + completer?(nil) + return + } + + self.tokenOperation = BlockOperation(block: { + let semaphore = DispatchSemaphore(value: 0) + let param = SRNetwork.Parameters(path: "/customer/register") + + DispatchQueue.main.async { + SRNetwork.request(parameters: param) { (response: SRNetwork.Response) in + if let token = response.data { + SRAccountManager.manager.setAccountToken(token) + } + do { semaphore.signal() } + self.tokenOperation = nil + completer?(response.data) + } + } + semaphore.wait() + }) + operationQueue.addOperation(self.tokenOperation!) + } + + +} diff --git a/SynthReel/Base/Networking/SRNetworkModel.swift b/SynthReel/Base/Networking/SRNetworkModel.swift new file mode 100644 index 0000000..755634d --- /dev/null +++ b/SynthReel/Base/Networking/SRNetworkModel.swift @@ -0,0 +1,62 @@ +// +// SRNetworkModel.swift +// SynthReel +// +// Created by 湖北秦九 on 2025/11/12. +// Copyright © 2025 SR. All rights reserved. +// + + +import UIKit +import SmartCodable +import Moya +import Alamofire + + +extension SRNetwork { + + struct Parameters { + var baseURL: URL? + var parameters: [String : Any]? + var method: Moya.Method = .post + var path: String + var isLoding: Bool = false + var isToast: Bool = true + } + + struct Response: SmartCodable { + + var code: Int? + var data: T? + var msg: String? + + @SmartIgnored + var rawData: Any? + + var isSuccess: Bool { + return code == 200 + } + } + + struct List: SmartCodable { + var list: [T]? + var pagination: Pagination? + } + + struct Pagination: SmartCodable { + var current_page: Int? + var page_size: Int? + var page_total: Int? + var total_size: Int? + } +} + + + +//extension String: SmartCodable { +// +//} +// +//extension Int: SmartCodable { +// +//} diff --git a/SynthReel/Base/Networking/SRNetworkReachableManager.swift b/SynthReel/Base/Networking/SRNetworkReachableManager.swift new file mode 100644 index 0000000..d98f92a --- /dev/null +++ b/SynthReel/Base/Networking/SRNetworkReachableManager.swift @@ -0,0 +1,75 @@ +// +// SRNetworkReachableManager.swift +// SynthReel +// +// Created by 湖北秦九 on 2025/11/12. +// Copyright © 2025 SR. All rights reserved. +// + +import UIKit +import Network + + +class SRNetworkReachableManager: NSObject { + + static let manager = SRNetworkReachableManager() + ///是否有网 + var isReachable: Bool? + + private var connectionType: NWInterface.InterfaceType? + private var status: NWPath.Status? + + private let monitor = NWPathMonitor() + private let queue = DispatchQueue(label: "NetworkMonitorQueue") + + func startMonitoring() { + + monitor.pathUpdateHandler = { [weak self] path in + guard let self = self else { return } + self.status = path.status + + if path.usesInterfaceType(.wifi) { + self.connectionType = .wifi + } else if path.usesInterfaceType(.cellular) { + self.connectionType = .cellular + } else if path.usesInterfaceType(.wiredEthernet) { + self.connectionType = .wiredEthernet + } else { + self.connectionType = nil + } + + + let agoReachable = self.isReachable + + if path.status == .satisfied, self.connectionType != nil { + self.isReachable = true + if agoReachable == false { + DispatchQueue.main.async { + NotificationCenter.default.post(name: SRNetworkReachableManager.networkStatusDidChangeNotification, object: nil) + } + } + + } else { + self.isReachable = false + if agoReachable == true { + DispatchQueue.main.async { + NotificationCenter.default.post(name: SRNetworkReachableManager.networkStatusDidChangeNotification, object: nil) + } + } + } + } + + + monitor.start(queue: queue) + } + + func stopMonitoring() { + monitor.cancel() + } + +} + +extension SRNetworkReachableManager { + ///网络发生变化 + @objc static let networkStatusDidChangeNotification = NSNotification.Name(rawValue: "SRNetworkReachableManager.networkStatusDidChangeNotification") +} diff --git a/SynthReel/Base/Networking/SRResponseCryptor.swift b/SynthReel/Base/Networking/SRResponseCryptor.swift new file mode 100644 index 0000000..303dec7 --- /dev/null +++ b/SynthReel/Base/Networking/SRResponseCryptor.swift @@ -0,0 +1,95 @@ +// +// SRResponseCryptor.swift +// SynthReel +// +// Created by 湖北秦九 on 2025/11/12. +// Copyright © 2025 SR. All rights reserved. +// + +import UIKit + +struct SRResponseCryptor { + + static func decrypt(data: String) -> String { + guard data.hasPrefix("$") else { + return data + } + + let decryptedData = deStrBytes(data: data) + return String(data: decryptedData, encoding: .utf8) ?? "" + } + + static func deStrBytes(data: String) -> Data { + let hexData = String(data.dropFirst()) + var bytes = Data() + + var index = hexData.startIndex + while index < hexData.endIndex { + let nextIndex = hexData.index(index, offsetBy: 2, limitedBy: hexData.endIndex) ?? hexData.endIndex + let byteString = String(hexData[index.. Data { + guard !data.isEmpty else { + return data + } + + let saltLen = Int(data[data.startIndex]) + guard data.count >= 1 + saltLen else { + return data + } + + let salt = data.subdata(in: 1..<1+saltLen) + let encryptedData = data.subdata(in: 1+saltLen.. Data { + let decryptedData = cxEd(data: data) + return removeSalt(data: decryptedData, salt: salt) + } + + // 加密/解密数据(按位取反) + static func cxEd(data: Data) -> Data { + return Data(data.map { $0 ^ 0xFF }) + } + + // 从数据中移除盐值 + static func removeSalt(data: Data, salt: Data) -> Data { + guard !salt.isEmpty else { + return data + } + + var result = Data() + let saltBytes = [UInt8](salt) + let saltCount = saltBytes.count + + for (index, byte) in data.enumerated() { + let saltByte = saltBytes[index % saltCount] + let decryptedByte = calRemoveSalt(v: byte, s: saltByte) + result.append(decryptedByte) + } + return result + } + + // 计算移除盐值后的字节 + static func calRemoveSalt(v: UInt8, s: UInt8) -> UInt8 { + if v >= s { + return v - s + } else { + return UInt8(0xFF) - (s - v) + 1 + } + } +} diff --git a/SynthReel/Base/Networking/SRTargetType.swift b/SynthReel/Base/Networking/SRTargetType.swift new file mode 100644 index 0000000..6a4dd6c --- /dev/null +++ b/SynthReel/Base/Networking/SRTargetType.swift @@ -0,0 +1,91 @@ +// +// SRTargetType.swift +// SynthReel +// +// Created by 湖北秦九 on 2025/11/12. +// Copyright © 2025 SR. All rights reserved. +// + +import UIKit +import SmartCodable +import Moya +import Alamofire +import AdSupport +import YYCategories + +enum SRTargetType { + case request(parameters: SRNetwork.Parameters) +} + +extension SRTargetType: TargetType { + var baseURL: URL { + return .init(string: SRBaseURL)! + } + + var path: String { + switch self { + case .request(let param): + return SRUrlPathPrefix + param.path + } + } + + var method: Moya.Method { + switch self { + case .request(let param): + return param.method + } + } + + var task: Moya.Task { + switch self { + case .request(let param): + let parameters = param.parameters ?? [:] + return .requestParameters(parameters: parameters, encoding: getEncoding()) + } + } + + var headers: [String : String]? { + var dic: [String : String] = [ + "system-version" : UIDevice.current.systemVersion, + "lang-key" : "en", + "idfa" : ASIdentifierManager.shared().advertisingIdentifier.uuidString, + "time-zone" : SRTargetType.timeZone(), //时区 + "brand" : "apple", //品牌 + "app-version" : kSRAPPVersion, + "app-name" : "SynthReel", + "device-id" : SRDeviceId.shared.id, //设备id + "system-type" : "ios", + "model" : UIDevice.current.machineModelName ?? "", + "authorization" : SRAccountManager.manager.token?.token ?? "", + "device-gaid" : UIDevice.current.identifierForVendor?.uuidString ?? "", + "product-prefix" : "SynthReel" + ] +#if DEBUG + dic["security"] = "false" +#endif + + return dic + } + +} + + +extension SRTargetType { + + var sampleData: Data { return "".data(using: String.Encoding.utf8)! } + + func getEncoding() -> ParameterEncoding { + switch self.method { + case .get, .delete: + return URLEncoding.default + default: + return JSONEncoding.default + } + } + + static func timeZone() -> String { + let timeZone = NSTimeZone.local as NSTimeZone + let timeZoneSecondsFromGMT = timeZone.secondsFromGMT / 3600 + return String(format: "GMT+0%d:00", timeZoneSecondsFromGMT) + } +} diff --git a/SynthReel/Base/Networking/SRUrlPath.swift b/SynthReel/Base/Networking/SRUrlPath.swift new file mode 100644 index 0000000..f015e90 --- /dev/null +++ b/SynthReel/Base/Networking/SRUrlPath.swift @@ -0,0 +1,27 @@ +// +// SRUrlPath.swift +// SynthReel +// +// Created by 湖北秦九 on 2025/11/12. +// Copyright © 2025 SR. All rights reserved. +// + +let SRBaseURL = "https://api-hbqinjiu.hbqinjiu.com" +let SRUrlPathPrefix = "/eon" +let SRWebBaseURL = "https://www.hbqinjiu.com" +let SRCampaignWebURL = "https://campaign.hbqinjiu.com" + + +/* + SynthReel + admin-api https://admin-api-synthreeltv.synthreeltv.com + api https://api-synthreeltv.synthreeltv.com/th + + + 官网:https://www.synthreeltv.com + 协议页面:https://www.synthreeltv.com/xxxxx + 反馈:https://campaign.synthreeltv.com/pages/leave/index 传{theme:theme_16} + 注销:https://campaign.synthreeltv.com/pages/setting/logout 传参{theme: theme_11, device-id:xxxx} + w2a:https://w2a.synthreeltv.com/ + Api:https://api-synthreeltv.synthreeltv.com/th + */ diff --git a/SynthReel/Base/View/SRCollectionView.swift b/SynthReel/Base/View/SRCollectionView.swift new file mode 100644 index 0000000..e0b13ff --- /dev/null +++ b/SynthReel/Base/View/SRCollectionView.swift @@ -0,0 +1,24 @@ +// +// SRCollectionView.swift +// SynthReel +// +// Created by 湖北秦九 on 2025/11/14. +// Copyright © 2025 SR. All rights reserved. +// + +import UIKit + +class SRCollectionView: UICollectionView { + + override init(frame: CGRect, collectionViewLayout layout: UICollectionViewLayout) { + super.init(frame: frame, collectionViewLayout: layout) + self.backgroundColor = .clear + self.contentInsetAdjustmentBehavior = .never + } + + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + +} diff --git a/SynthReel/Base/View/SRGradientView.swift b/SynthReel/Base/View/SRGradientView.swift new file mode 100644 index 0000000..8a48cf1 --- /dev/null +++ b/SynthReel/Base/View/SRGradientView.swift @@ -0,0 +1,45 @@ +// +// SRGradientView.swift +// SynthReel +// +// Created by 湖北秦九 on 2025/11/15. +// Copyright © 2025 SR. All rights reserved. +// + +import UIKit + +class SRGradientView: UIView { + + override class var layerClass: AnyClass { + return CAGradientLayer.self + } + + var gradientLayer: CAGradientLayer { + return self.layer as! CAGradientLayer + } + + var locations: [NSNumber]? { + didSet { + self.gradientLayer.locations = locations + } + } + + var colors: [CGColor]? { + didSet { + self.gradientLayer.colors = colors + } + } + + var startPoint: CGPoint = .zero { + didSet { + self.gradientLayer.startPoint = startPoint + } + } + + var endPoint: CGPoint = .zero { + didSet { + self.gradientLayer.endPoint = endPoint + } + } + +} diff --git a/SynthReel/Base/View/SRImageView.swift b/SynthReel/Base/View/SRImageView.swift new file mode 100644 index 0000000..5b9bb99 --- /dev/null +++ b/SynthReel/Base/View/SRImageView.swift @@ -0,0 +1,100 @@ +// +// SRImageView.swift +// SynthReel +// +// Created by 湖北秦九 on 2025/11/15. +// Copyright © 2025 SR. All rights reserved. +// + +import UIKit +import Kingfisher + +class SRImageView: UIImageView { + + var placeholderColor = UIColor.gray + var placeholderImage = UIImage(named: "placeholder_image") + + private lazy var placeholderImageView: UIImageView = { + let imageView = UIImageView(image: placeholderImage) + imageView.isHidden = true + imageView.contentMode = .scaleAspectFit + return imageView + }() + + override init(frame: CGRect) { + super.init(frame: frame) + _init() + } + + override init(image: UIImage?) { + super.init(image: image) + _init() + } + + override init(image: UIImage?, highlightedImage: UIImage?) { + super.init(image: image, highlightedImage: highlightedImage) + _init() + } + + required init?(coder: NSCoder) { + super.init(coder: coder) + _init() + } + + override func awakeFromNib() { + super.awakeFromNib() + _init() + } + + func _init() { + self.contentMode = .scaleAspectFill + self.layer.masksToBounds = true + if image == nil { + self.backgroundColor = self.placeholderColor + placeholderImageView.isHidden = false + } + addSubview(placeholderImageView) + } + + override var image: UIImage? { + didSet { + if self.backgroundColor == nil && image == nil { + self.backgroundColor = self.placeholderColor + } else if image != nil { + if self.backgroundColor == self.placeholderColor { + self.backgroundColor = nil + } + } + + if image == nil { + placeholderImageView.isHidden = false + } else { + placeholderImageView.isHidden = true + } + } + } + + override func layoutSubviews() { + super.layoutSubviews() + + placeholderImageView.frame = .init(x: 0, y: 0, width: self.bounds.width * (2 / 3), height: self.bounds.height * (2 / 3)) + placeholderImageView.center = .init(x: self.bounds.width / 2, y: self.bounds.height / 2) + } + +} + + +extension UIImageView { + func sr_setImage(_ url: String?, placeholder: UIImage? = nil, completer: ((_ image: UIImage?, _ url: URL?) -> Void)? = nil) { + + self.kf.setImage(with: URL(string: url ?? ""), placeholder: placeholder, options: nil) { result in + switch result { + case .success(let value): + completer?(value.image, value.source.url) + default : + completer?(nil, nil) + break + } + } + } +} diff --git a/SynthReel/Base/View/SRLabel.swift b/SynthReel/Base/View/SRLabel.swift new file mode 100644 index 0000000..41b8fad --- /dev/null +++ b/SynthReel/Base/View/SRLabel.swift @@ -0,0 +1,55 @@ +// +// SRLabel.swift +// SynthReel +// +// Created by 湖北秦九 on 2025/11/14. +// Copyright © 2025 SR. All rights reserved. +// + +import UIKit +import YYText + +class SRLabel: UILabel { + + var textColors: [CGColor]? + var textStartPoint: CGPoint? + var textEndPoint: CGPoint? + + + override func layoutSubviews() { + super.layoutSubviews() + + let size = self.bounds.size + if let text = self.text, text.count > 0, let colors = self.textColors, let startPoint = self.textStartPoint, let endPoine = self.textEndPoint { + self.textColor = UIColor(patternImage: UIImage.sr_getGradientImage(size: size, colors: colors, startPoint: startPoint, endPoint: endPoine)) + } + } + + +} + +extension UIImage { + + static func sr_getGradientImage(size: CGSize, colors: [CGColor], startPoint: CGPoint, endPoint: CGPoint) -> UIImage{ + + UIGraphicsBeginImageContextWithOptions(size, false, UIScreen.main.scale) + guard let context = UIGraphicsGetCurrentContext() else{return UIImage()} + let colorSpace = CGColorSpaceCreateDeviceRGB() + ///设置渐变颜色 + let gradientRef = CGGradient(colorsSpace: colorSpace, colors: colors as CFArray, locations: nil)! + let startPoint = CGPoint(x: size.width * startPoint.x, y: size.height * startPoint.y) + let endPoint = CGPoint(x: size.width * endPoint.x, y: size.height * endPoint.y) + context.drawLinearGradient(gradientRef, start: startPoint, end: endPoint, options: CGGradientDrawingOptions(arrayLiteral: .drawsBeforeStartLocation,.drawsAfterEndLocation)) + let gradientImage = UIGraphicsGetImageFromCurrentImageContext() + UIGraphicsEndImageContext() + return gradientImage ?? UIImage() + } + + func sr_resized(to size: CGSize) -> UIImage { + let renderer = UIGraphicsImageRenderer(size: size) + return renderer.image { _ in + self.draw(in: CGRect(origin: .zero, size: size)) + } + } + +} diff --git a/SynthReel/Base/View/SRPanModalContentView.swift b/SynthReel/Base/View/SRPanModalContentView.swift new file mode 100644 index 0000000..07604c3 --- /dev/null +++ b/SynthReel/Base/View/SRPanModalContentView.swift @@ -0,0 +1,84 @@ +// +// SRPanModalContentView.swift +// SynthReel +// +// Created by 湖北秦九 on 2025/11/18. +// Copyright © 2025 SR. All rights reserved. +// + +import UIKit +import HWPanModal +import SnapKit + +class SRPanModalContentView: HWPanModalContentView { + + + var contentHeight = UIScreen.height * (2 / 3) + + ///更新UI contentSize发生变化时调用 + func setNeedsLayoutUpdate() { + self.panModalSetNeedsLayoutUpdate() + } + + lazy var bgImageView: UIImageView = { + let imageView = UIImageView(image: UIImage(named: "pan_bg_image_01")) + return imageView + }() + + + override init(frame: CGRect) { + super.init(frame: frame) + addSubview(bgImageView) + + bgImageView.snp.makeConstraints { make in + make.edges.equalToSuperview() + } + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + //MARK: HWPanModalPresentable + override func panScrollable() -> UIScrollView? { + return nil + } + + override func longFormHeight() -> PanModalHeight { + return PanModalHeightMake(.content, contentHeight) + } + + override func showDragIndicator() -> Bool { + return false + } + + override func backgroundConfig() -> HWBackgroundConfig { + let config = HWBackgroundConfig() + config.backgroundAlpha = 0.6 + return config + } + + override func allowsTapBackgroundToDismiss() -> Bool { + return true + } + + override func allowsDragToDismiss() -> Bool { + return false + } + + override func allowsPullDownWhenShortState() -> Bool { + return false + } + + override func showsScrollableVerticalScrollIndicator() -> Bool { + return false + } + + override func springDamping() -> CGFloat { + return 1 + } + + override func cornerRadius() -> CGFloat { + return 0 + } +} diff --git a/SynthReel/Base/View/SRScrollView.swift b/SynthReel/Base/View/SRScrollView.swift new file mode 100644 index 0000000..4d3470b --- /dev/null +++ b/SynthReel/Base/View/SRScrollView.swift @@ -0,0 +1,21 @@ +// +// SRScrollView.swift +// SynthReel +// +// Created by 湖北秦九 on 2025/11/15. +// Copyright © 2025 SR. All rights reserved. +// + +import UIKit + +class SRScrollView: UIScrollView { + + override init(frame: CGRect) { + super.init(frame: frame) + self.contentInsetAdjustmentBehavior = .never + } + + required init?(coder: NSCoder) { + super.init(coder: coder) + } +} diff --git a/SynthReel/Base/View/SRTableView.swift b/SynthReel/Base/View/SRTableView.swift new file mode 100644 index 0000000..b1f62ba --- /dev/null +++ b/SynthReel/Base/View/SRTableView.swift @@ -0,0 +1,49 @@ +// +// SRTableView.swift +// SynthReel +// +// Created by 湖北秦九 on 2025/11/18. +// Copyright © 2025 SR. All rights reserved. +// + +import UIKit + +class SRTableView: UITableView { + + var insetGroupedMargins: CGFloat = 15 + + override init(frame: CGRect, style: UITableView.Style) { + super.init(frame: frame, style: style) + separatorInset = .init(top: 0, left: 15, bottom: 0, right: 15) + self.backgroundColor = .clear + self.contentInsetAdjustmentBehavior = .never + + if style == .insetGrouped || style == .grouped { + sectionFooterHeight = 14 + sectionHeaderHeight = 0.1 + } else if style == .plain { + if #available(iOS 15.0, *) { + sectionHeaderTopPadding = 0 + } + } + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + override var layoutMargins: UIEdgeInsets { + set { + super.layoutMargins = newValue + } + get { + var margins = super.layoutMargins + if self.style == .insetGrouped { + margins.left = self.safeAreaInsets.left + insetGroupedMargins + margins.right = self.safeAreaInsets.right + insetGroupedMargins + } + return margins + } + } + +} diff --git a/SynthReel/Base/View/SRTableViewCell.swift b/SynthReel/Base/View/SRTableViewCell.swift new file mode 100644 index 0000000..87b0307 --- /dev/null +++ b/SynthReel/Base/View/SRTableViewCell.swift @@ -0,0 +1,48 @@ +// +// SRTableViewCell.swift +// SynthReel +// +// Created by 湖北秦九 on 2025/11/18. +// Copyright © 2025 SR. All rights reserved. +// + +import UIKit + +class SRTableViewCell: UITableViewCell { + + override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) { + super.init(style: style, reuseIdentifier: reuseIdentifier) + _init() + } + + required init?(coder: NSCoder) { + super.init(coder: coder) + _init() + } + + override func awakeFromNib() { + super.awakeFromNib() + } + + override func setSelected(_ selected: Bool, animated: Bool) { + super.setSelected(selected, animated: animated) + + // Configure the view for the selected state + } + + + private func _init() { + self.layer.rasterizationScale = UIScreen.main.scale + self.layer.shouldRasterize = true + self.selectionStyle = .none + self.backgroundColor = .clear + } + +} + +extension UITableViewCell { + + var fa_tableView: UITableView? { + return self.value(forKey: "_tableView") as? UITableView + } +} diff --git a/SynthReel/Base/ViewController/SRNavigationController.swift b/SynthReel/Base/ViewController/SRNavigationController.swift new file mode 100644 index 0000000..33453e2 --- /dev/null +++ b/SynthReel/Base/ViewController/SRNavigationController.swift @@ -0,0 +1,36 @@ +// +// SRNavigationController.swift +// SynthReel +// +// Created by 湖北秦九 on 2025/11/13. +// Copyright © 2025 SR. All rights reserved. +// + +import UIKit + +class SRNavigationController: UINavigationController { + + override func viewDidLoad() { + super.viewDidLoad() + + // Do any additional setup after loading the view. + } + + + override func pushViewController(_ viewController: UIViewController, animated: Bool) { + if children.count > 0 { + viewController.hidesBottomBarWhenPushed = true + } + super.pushViewController(viewController, animated: animated) + } + + override func setViewControllers(_ viewControllers: [UIViewController], animated: Bool) { + for (index, value) in viewControllers.enumerated() { + if index != 0 { + value.hidesBottomBarWhenPushed = true + } + } + super.setViewControllers(viewControllers, animated: animated) + } + +} diff --git a/SynthReel/Base/ViewController/SRTabBarController.swift b/SynthReel/Base/ViewController/SRTabBarController.swift new file mode 100644 index 0000000..e90e470 --- /dev/null +++ b/SynthReel/Base/ViewController/SRTabBarController.swift @@ -0,0 +1,51 @@ +// +// SRTabBarController.swift +// SynthReel +// +// Created by 湖北秦九 on 2025/11/13. +// Copyright © 2025 SR. All rights reserved. +// + +import UIKit +import ESTabBarController + +class SRTabBarController: ESTabBarController { + + override func viewDidLoad() { + super.viewDidLoad() + view.backgroundColor = ._010101 + + let nav1 = createNavigationView(SRHomeViewController(), image: UIImage(named: "tabbar_icon_01"), selectedImage: UIImage(named: "tabbar_icon_01_selected")) + let nav2 = createNavigationView(SRRecommendPlayerViewController(), image: UIImage(named: "tabbar_icon_02"), selectedImage: UIImage(named: "tabbar_icon_02_selected")) + let nav3 = createNavigationView(SRMyShortViewController(), image: UIImage(named: "tabbar_icon_03"), selectedImage: UIImage(named: "tabbar_icon_03_selected")) + let nav4 = createNavigationView(SRViewController(), image: UIImage(named: "tabbar_icon_04"), selectedImage: UIImage(named: "tabbar_icon_04_selected")) + + + viewControllers = [nav1, nav2, nav3, nav4] + + let appearance = UITabBarAppearance() + appearance.backgroundColor = ._010101 + appearance.shadowColor = .clear + appearance.backgroundImage = UIImage() + appearance.shadowImage = UIImage() + + self.tabBar.standardAppearance = appearance + self.tabBar.scrollEdgeAppearance = appearance + self.tabBar.isTranslucent = false + } + + + func createNavigationView(_ viewController: UIViewController, image: UIImage?, selectedImage: UIImage?) -> UINavigationController { + + let contentView = ESTabBarItemContentView() + contentView.itemContentMode = .alwaysOriginal + contentView.renderingMode = .alwaysOriginal + + let tabBarItem = ESTabBarItem(contentView, image: image, selectedImage: selectedImage) + + let nav = SRNavigationController(rootViewController: viewController) + nav.tabBarItem = tabBarItem + return nav + } + +} diff --git a/SynthReel/Base/ViewController/SRViewController.swift b/SynthReel/Base/ViewController/SRViewController.swift new file mode 100644 index 0000000..17d0c70 --- /dev/null +++ b/SynthReel/Base/ViewController/SRViewController.swift @@ -0,0 +1,82 @@ +// +// SRViewController.swift +// SynthReel +// +// Created by 湖北秦九 on 2025/11/13. +// Copyright © 2025 SR. All rights reserved. +// + +import UIKit +import SnapKit +import JXPagingView + +class SRViewController: UIViewController { + + var didScrollCallback: ((_ : UIScrollView) -> Void)? + + lazy var backgroundImageView = UIImageView(image: UIImage(named: "background_image_01")) + + override func viewDidLoad() { + super.viewDidLoad() + self.edgesForExtendedLayout = [.top] + self.view.backgroundColor = ._010101 + + view.addSubview(backgroundImageView) + + backgroundImageView.snp.makeConstraints { make in + make.left.right.top.equalToSuperview() + } + } + + func handleHeaderRefresh(_ completer: (() -> Void)?) { + completer?() + } + + func handleFooterRefresh(_ completer: (() -> Void)?) { + completer?() + } + +} + +//MARK: JXPagingSmoothViewListViewDelegate +extension SRViewController: JXPagingSmoothViewListViewDelegate, JXPagingViewListViewDelegate { + func listViewDidScrollCallback(callback: @escaping (UIScrollView) -> ()) { + self.didScrollCallback = callback + } + + func listView() -> UIView { + return self.view + } + + func listScrollView() -> UIScrollView { + return UIScrollView() + } +} + +extension UIViewController { +// func configNavigationBack(_ imageName: String = "Frame 3011") { +// let image = UIImage(named: imageName) +// +// let leftBarButtonItem = UIBarButtonItem(image: image, style: .plain ,target: self,action: #selector(handleNavigationBack)) +// navigationItem.leftBarButtonItem = leftBarButtonItem +// } + + @objc func sr_handleNavigationBack() { + self.sr_toLastViewController(animated: true) + } + + func sr_toLastViewController(animated: Bool) { + if self.navigationController != nil + { + if self.navigationController?.viewControllers.count == 1 + { + self.dismiss(animated: animated, completion: nil) + } else { + self.navigationController?.popViewController(animated: animated) + } + } + else if self.presentingViewController != nil { + self.dismiss(animated: animated, completion: nil) + } + } +} diff --git a/SynthReel/Class/Home/M/SRCategoryModel.swift b/SynthReel/Class/Home/M/SRCategoryModel.swift new file mode 100644 index 0000000..5b2c67b --- /dev/null +++ b/SynthReel/Class/Home/M/SRCategoryModel.swift @@ -0,0 +1,16 @@ +// +// SRCategoryModel.swift +// SynthReel +// +// Created by 湖北秦九 on 2025/11/14. +// Copyright © 2025 SR. All rights reserved. +// + +import UIKit +import SmartCodable + +struct SRCategoryModel: SmartCodable { + + var id: String? + var name: String? +} diff --git a/SynthReel/Class/Home/M/SRHomeModuleItem.swift b/SynthReel/Class/Home/M/SRHomeModuleItem.swift new file mode 100644 index 0000000..90f1ad3 --- /dev/null +++ b/SynthReel/Class/Home/M/SRHomeModuleItem.swift @@ -0,0 +1,56 @@ +// +// SRHomeModuleItem.swift +// SynthReel +// +// Created by 湖北秦九 on 2025/11/14. +// Copyright © 2025 SR. All rights reserved. +// + +import UIKit +import SmartCodable + +class SRHomeModuleItem: NSObject, SmartCodable { + + required override init() { } + + enum ModuleKey: String, SmartCaseDefaultable { + case banner = "home_banner" + ///猜你喜欢 + case detailsRecommand = "get_details_recommand" + case popular = "home_v3_recommand" + case updates = "week_ranking" + case bingeWorthy = "week_highest_recommend" + case viralHits = "highest_payment_hot_video" + case premiereNow = "new_recommand" + } + + + var title: String? + var module_key: ModuleKey? + var list: [SRShortModel] = [] + + @SmartAny + var data: Any? + + + func didFinishMapping() { + if let data = data as? [[String : Any]] { + self.list = [SRShortModel].deserialize(from: data) ?? [] + } else if let data = data as? [String : Any] { + var dataList: [[String : Any]]? + if let list = data["list"] as? [[String : Any]] { + self.title = data["title"] as? String + dataList = list + + } else if let list = data["shortPlayList"] as? [[String : Any]] { + self.title = data["category_name"] as? String + dataList = list + } + + if let dataList = dataList { + self.list = [SRShortModel].deserialize(from: dataList) ?? [] + } + } + } +} + diff --git a/SynthReel/Class/Home/V/SRHomeBannerCell.swift b/SynthReel/Class/Home/V/SRHomeBannerCell.swift new file mode 100644 index 0000000..2d8e9f0 --- /dev/null +++ b/SynthReel/Class/Home/V/SRHomeBannerCell.swift @@ -0,0 +1,42 @@ +// +// SRHomeBannerCell.swift +// SynthReel +// +// Created by 湖北秦九 on 2025/11/15. +// Copyright © 2025 SR. All rights reserved. +// + +import UIKit +import FSPagerView +import SnapKit + +class SRHomeBannerCell: FSPagerViewCell { + + var model: SRShortModel? { + didSet { + if let image = model?.horizontally_img, image.count > 0 { + coverImageView.sr_setImage(image) + } else { + coverImageView.sr_setImage(model?.image_url) + } + } + } + + lazy var coverImageView: SRImageView = { + let imageView = SRImageView() + return imageView + }() + + override init(frame: CGRect) { + super.init(frame: frame) + contentView.addSubview(coverImageView) + + coverImageView.snp.makeConstraints { make in + make.edges.equalToSuperview() + } + } + + @MainActor required init?(coder aDecoder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } +} diff --git a/SynthReel/Class/Home/V/SRHomeBannerMiniCell.swift b/SynthReel/Class/Home/V/SRHomeBannerMiniCell.swift new file mode 100644 index 0000000..c8d56d3 --- /dev/null +++ b/SynthReel/Class/Home/V/SRHomeBannerMiniCell.swift @@ -0,0 +1,40 @@ +// +// SRHomeBannerMiniCell.swift +// SynthReel +// +// Created by 湖北秦九 on 2025/11/17. +// Copyright © 2025 SR. All rights reserved. +// + +import UIKit +import SnapKit + +class SRHomeBannerMiniCell: UICollectionViewCell { + + var model: SRShortModel? { + didSet { + coverImageView.sr_setImage(model?.image_url) + } + } + + lazy var coverImageView: SRImageView = { + let imageView = SRImageView() + imageView.layer.cornerRadius = 2 + imageView.layer.masksToBounds = true + return imageView + }() + + override init(frame: CGRect) { + super.init(frame: frame) + + contentView.addSubview(coverImageView) + + coverImageView.snp.makeConstraints { make in + make.edges.equalToSuperview() + } + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } +} diff --git a/SynthReel/Class/Home/V/SRHomeBannerView.swift b/SynthReel/Class/Home/V/SRHomeBannerView.swift new file mode 100644 index 0000000..460c680 --- /dev/null +++ b/SynthReel/Class/Home/V/SRHomeBannerView.swift @@ -0,0 +1,177 @@ +// +// SRHomeBannerView.swift +// SynthReel +// +// Created by 湖北秦九 on 2025/11/15. +// Copyright © 2025 SR. All rights reserved. +// + +import UIKit +import SnapKit +import FSPagerView + +class SRHomeBannerView: UIView { + + var dataArr: [SRShortModel]? { + didSet { + self.bannerView.reloadData() + self.miniCollectionView.reloadData() + } + } + + var didSelectedShort: ((_ model: SRShortModel?) -> Void)? + + lazy var bgImageView = UIImageView(image: UIImage(named: "home_banner_bg")) + + lazy var bannerView: FSPagerView = { + let view = FSPagerView() + view.delegate = self + view.dataSource = self + view.isInfinite = true + view.automaticSlidingInterval = 5 + view.register(SRHomeBannerCell.self, forCellWithReuseIdentifier: "cell") + return view + }() + +// lazy var miniBgView: UIView = { +// let view = UIView() +// view.layer.cornerRadius = 4 +// view.layer.masksToBounds = true +// view.backgroundColor = ._051_B_22.withAlphaComponent(0.5) +// return view +// }() + + lazy var miniCollectionViewLayout: UICollectionViewFlowLayout = { + let layout = UICollectionViewFlowLayout() + layout.itemSize = .init(width: 36, height: 46) + layout.minimumLineSpacing = 4 + return layout + }() + + lazy var miniCollectionView: SRCollectionView = { + let collectionView = SRCollectionView(frame: .zero, collectionViewLayout: miniCollectionViewLayout) + collectionView.layer.cornerRadius = 4 + collectionView.layer.masksToBounds = true + collectionView.backgroundColor = ._051_B_22.withAlphaComponent(0.5) + collectionView.delegate = self + collectionView.dataSource = self + collectionView.showsVerticalScrollIndicator = false + collectionView.contentInset = .init(top: 5, left: 0, bottom: 5, right: 0) + collectionView.register(SRHomeBannerMiniCell.self, forCellWithReuseIdentifier: "cell") + return collectionView + }() + + override init(frame: CGRect) { + super.init(frame: frame) + sr_setupUI() + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + override func layoutSubviews() { + super.layoutSubviews() + applyHeteromorphicLayer() + } + + ///添加异形切边 + func applyHeteromorphicLayer() { + let viewSize = bannerView.bounds.size + let path = UIBezierPath() + let layer = CAShapeLayer() + + //右上角边长 + let topRight = UIScreen.getRatioWidth(size: 25) + //左下角边长 + let bottomLeft = UIScreen.getRatioWidth(size: 10) + + path.move(to: .init(x: 0, y: 0)) + path.addLine(to: .init(x: viewSize.width - topRight, y: 0)) + path.addLine(to: .init(x: viewSize.width, y: topRight)) + path.addLine(to: .init(x: viewSize.width, y: viewSize.height)) + path.addLine(to: .init(x: bottomLeft, y: viewSize.height)) + path.addLine(to: .init(x: 0, y: viewSize.height - bottomLeft)) + path.close() + + layer.path = path.cgPath + bannerView.layer.mask = layer + } + +} + +extension SRHomeBannerView { + +func sr_setupUI() { + let bgImage = self.bgImageView.image! + let bgWidth = UIScreen.width - 30 + let bgHeight = bgImage.size.height / bgImage.size.width * bgWidth + + addSubview(bgImageView) + addSubview(bannerView) + addSubview(miniCollectionView) + + bgImageView.snp.makeConstraints { make in + make.left.equalToSuperview().offset(15) + make.right.equalToSuperview().offset(-15) + make.top.equalToSuperview() + make.bottom.equalToSuperview() + make.height.equalTo(bgHeight) + } + + bannerView.snp.makeConstraints { make in + make.left.equalTo(bgImageView).offset(11) + make.right.equalTo(bgImageView).offset(-11) + make.top.equalTo(bgImageView).offset(18) + make.bottom.equalTo(bgImageView).offset(-12) + } + + miniCollectionView.snp.makeConstraints { make in + make.left.equalTo(bannerView).offset(7) + make.centerY.equalTo(bannerView) + make.top.equalTo(bannerView).offset(7) + make.width.equalTo(46) + } + } +} + +//MARK: FSPagerViewDelegate FSPagerViewDataSource +extension SRHomeBannerView: FSPagerViewDelegate, FSPagerViewDataSource { + func numberOfItems(in pagerView: FSPagerView) -> Int { + return self.dataArr?.count ?? 0 + } + + func pagerView(_ pagerView: FSPagerView, cellForItemAt index: Int) -> FSPagerViewCell { + let cell = pagerView.dequeueReusableCell(withReuseIdentifier: "cell", at: index) as! SRHomeBannerCell + cell.model = self.dataArr?[index] + return cell + } + + + func pagerView(_ pagerView: FSPagerView, didSelectItemAt index: Int) { + self.didSelectedShort?(self.dataArr?[index]) + } + + +} + +//MARK: UICollectionViewDelegate UICollectionViewDataSource +extension SRHomeBannerView: UICollectionViewDelegate, UICollectionViewDataSource { + + func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { + let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath) as! SRHomeBannerMiniCell + cell.model = self.dataArr?[indexPath.row] + return cell + } + + func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { + return self.dataArr?.count ?? 0 + } + + func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { + if indexPath.row == self.bannerView.currentIndex { return } + + self.bannerView.selectItem(at: indexPath.row, animated: true) + } + +} diff --git a/SynthReel/Class/Home/V/SRHomeBingeWorthyCell.swift b/SynthReel/Class/Home/V/SRHomeBingeWorthyCell.swift new file mode 100644 index 0000000..5467fd4 --- /dev/null +++ b/SynthReel/Class/Home/V/SRHomeBingeWorthyCell.swift @@ -0,0 +1,135 @@ +// +// SRHomeBingeWorthyCell.swift +// SynthReel +// +// Created by 湖北秦九 on 2025/11/17. +// Copyright © 2025 SR. All rights reserved. +// + +import UIKit +import SnapKit + +class SRHomeBingeWorthyCell: UICollectionViewCell { + + var model: SRShortModel? { + didSet { + coverImageView.sr_setImage(model?.image_url) + titleLabel.text = model?.name + desLabel.text = model?.sr_description + if let text = model?.category?.first, text.count > 0 { + categoryLabel.text = "#\(text)" + } else { + categoryLabel.text = nil + } + } + } + + lazy var bgImageView = UIImageView(image: UIImage(named: "home_binge_worthy_cell_image")) + + lazy var coverImageView: SRImageView = { + let imageView = SRImageView() + imageView.layer.cornerRadius = 4 + imageView.layer.masksToBounds = true + return imageView + }() + + lazy var titleLabel: UILabel = { + let label = UILabel() + label.font = .font(ofSize: 14, weight: .medium) + label.textColor = .white + return label + }() + + lazy var categoryLabel: SRLabel = { + let label = SRLabel() + label.font = .font(ofSize: 11, weight: .regular) + label.textColors = [UIColor.srGreen.cgColor, UIColor.srBlue.cgColor] + label.textStartPoint = .init(x: 0.5, y: 0) + label.textEndPoint = .init(x: 0.5, y: 1) + return label + }() + + lazy var desLabel: UILabel = { + let label = UILabel() + label.font = .font(ofSize: 11, weight: .regular) + label.textColor = .A_6_A_6_A_6 + label.numberOfLines = 3 + return label + }() + + lazy var playImageView = UIImageView(image: UIImage(named: "play_icon_01")) + + lazy var playLabel: UILabel = { + let label = SRLabel() + label.font = .font(ofSize: 11, weight: .regular) + label.textColors = [UIColor.srGreen.cgColor, UIColor.srBlue.cgColor] + label.textStartPoint = .init(x: 0.5, y: 0) + label.textEndPoint = .init(x: 0.5, y: 1) + label.text = "Play" + return label + }() + + override init(frame: CGRect) { + super.init(frame: frame) + + sr_setupUI() + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + +} + +extension SRHomeBingeWorthyCell { + + private func sr_setupUI() { + contentView.addSubview(bgImageView) + contentView.addSubview(coverImageView) + contentView.addSubview(titleLabel) + contentView.addSubview(categoryLabel) + contentView.addSubview(desLabel) + contentView.addSubview(playImageView) + playImageView.addSubview(playLabel) + + bgImageView.snp.makeConstraints { make in + make.edges.equalToSuperview() + } + + coverImageView.snp.makeConstraints { make in + make.left.equalToSuperview().offset(10) + make.top.equalToSuperview().offset(10) + make.width.equalTo(126) + make.height.equalTo(168) + } + + titleLabel.snp.makeConstraints { make in + make.left.equalTo(coverImageView.snp.right).offset(11) + make.top.equalToSuperview().offset(27) + make.right.lessThanOrEqualToSuperview().offset(-15) + } + + categoryLabel.snp.makeConstraints { make in + make.left.equalTo(titleLabel) + make.top.equalTo(titleLabel.snp.bottom).offset(12) + make.right.lessThanOrEqualToSuperview().offset(-15) + } + + desLabel.snp.makeConstraints { make in + make.left.equalTo(titleLabel) + make.top.equalTo(titleLabel.snp.bottom).offset(43) + make.right.lessThanOrEqualToSuperview().offset(-15) + } + + playImageView.snp.makeConstraints { make in + make.left.equalTo(coverImageView.snp.right).offset(11) + make.bottom.equalTo(coverImageView).offset(1) + } + + playLabel.snp.makeConstraints { make in + make.left.equalToSuperview().offset(45) + make.top.equalToSuperview().offset(9) + } + } + +} diff --git a/SynthReel/Class/Home/V/SRHomeBingeWorthyView.swift b/SynthReel/Class/Home/V/SRHomeBingeWorthyView.swift new file mode 100644 index 0000000..2c50343 --- /dev/null +++ b/SynthReel/Class/Home/V/SRHomeBingeWorthyView.swift @@ -0,0 +1,75 @@ +// +// SRHomeBingeWorthyView.swift +// SynthReel +// +// Created by 湖北秦九 on 2025/11/17. +// Copyright © 2025 SR. All rights reserved. +// + +import UIKit +import SnapKit + +class SRHomeBingeWorthyView: SRHomeModuleView { + + var dataArr: [SRShortModel]? { + didSet { + collectionView.reloadData() + } + } + + lazy var collectionViewLayout: UICollectionViewFlowLayout = { + let layout = UICollectionViewFlowLayout() + layout.scrollDirection = .horizontal + layout.minimumLineSpacing = 12 + layout.itemSize = .init(width: 320, height: 192) + return layout + }() + + lazy var collectionView: SRCollectionView = { + let collectionView = SRCollectionView(frame: .zero, collectionViewLayout: collectionViewLayout) + collectionView.delegate = self + collectionView.dataSource = self + collectionView.showsHorizontalScrollIndicator = false + collectionView.contentInset = .init(top: 0, left: 15, bottom: 0, right: 15) + collectionView.register(SRHomeBingeWorthyCell.self, forCellWithReuseIdentifier: "cell") + return collectionView + }() + + override init(frame: CGRect) { + super.init(frame: frame) + self.titleLabel.text = "Binge-Worthy".localized + + addSubview(collectionView) + + collectionView.snp.makeConstraints { make in + make.left.right.bottom.equalToSuperview() + make.top.equalTo(button.snp.bottom).offset(6) + make.height.equalTo(collectionViewLayout.itemSize.height) + } + + } + + @MainActor required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + +} + +//MARK: UICollectionViewDataSource UICollectionViewDelegate +extension SRHomeBingeWorthyView: UICollectionViewDataSource, UICollectionViewDelegate { + + func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { + let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath) as! SRHomeBingeWorthyCell + cell.model = self.dataArr?[indexPath.row] + return cell + } + + func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { + return self.dataArr?.count ?? 0 + } + + func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { + self.didSelectedShort?(self.dataArr?[indexPath.row]) + } +} diff --git a/SynthReel/Class/Home/V/SRHomeChildCell.swift b/SynthReel/Class/Home/V/SRHomeChildCell.swift new file mode 100644 index 0000000..cf707cb --- /dev/null +++ b/SynthReel/Class/Home/V/SRHomeChildCell.swift @@ -0,0 +1,28 @@ +// +// SRHomeChildCell.swift +// SynthReel +// +// Created by 湖北秦九 on 2025/11/14. +// Copyright © 2025 SR. All rights reserved. +// + +import UIKit + +class SRHomeChildCell: UICollectionViewCell { + + + var model: SRShortModel? { + didSet { + coverImageView.sr_setImage(model?.image_url) + } + } + + @IBOutlet weak var coverImageView: SRImageView! + + override func awakeFromNib() { + super.awakeFromNib() + coverImageView.layer.cornerRadius = 2 + coverImageView.layer.masksToBounds = true + } + +} diff --git a/SynthReel/Class/Home/V/SRHomeChildCell.xib b/SynthReel/Class/Home/V/SRHomeChildCell.xib new file mode 100644 index 0000000..0c42e12 --- /dev/null +++ b/SynthReel/Class/Home/V/SRHomeChildCell.xib @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/SynthReel/Class/Home/V/SRHomeHeaderView.swift b/SynthReel/Class/Home/V/SRHomeHeaderView.swift new file mode 100644 index 0000000..9b74866 --- /dev/null +++ b/SynthReel/Class/Home/V/SRHomeHeaderView.swift @@ -0,0 +1,156 @@ +// +// SRHomeHeaderView.swift +// SynthReel +// +// Created by 湖北秦九 on 2025/11/15. +// Copyright © 2025 SR. All rights reserved. +// + +import UIKit +import SnapKit +import YYCategories + +class SRHomeHeaderView: UIView { + + var contentHeight: CGFloat { + return scrollView.contentSize.height + 1 + 20 + } + + var heightDidChange: (() -> Void)? + + weak var viewModel: SRHomeViewModel? + + lazy var scrollView: SRScrollView = { + let scrollView = SRScrollView() + scrollView.isScrollEnabled = false + scrollView.addObserver(self, forKeyPath: "contentSize", context: nil) + return scrollView + }() + + lazy var stackView: UIStackView = { + let view = UIStackView() + view.axis = .vertical + view.spacing = 20 + return view + }() + + lazy var bannerView: SRHomeBannerView = { + let view = SRHomeBannerView() + view.didSelectedShort = { [weak self] model in + self?.pushShortDetail(model) + } + return view + }() + + lazy var youLikeView: SRHomeYouLikeView = { + let view = SRHomeYouLikeView() + view.didSelectedShort = { [weak self] model in + self?.pushShortDetail(model) + } + return view + }() + + lazy var topChartsView: SRHomeTopChartsView = { + let view = SRHomeTopChartsView() + view.didSelectedShort = { [weak self] model in + self?.pushShortDetail(model) + } + return view + }() + + lazy var bingeWorthyView: SRHomeBingeWorthyView = { + let view = SRHomeBingeWorthyView() + view.didSelectedShort = { [weak self] model in + self?.pushShortDetail(model) + } + return view + }() + + lazy var viralHitsView: SRHomeViralHitsView = { + let view = SRHomeViralHitsView() + view.didSelectedShort = { [weak self] model in + self?.pushShortDetail(model) + } + return view + }() + + lazy var premiereNowView: SRHomePremiereNowView = { + let view = SRHomePremiereNowView() + view.didSelectedShort = { [weak self] model in + self?.pushShortDetail(model) + } + return view + }() + + override init(frame: CGRect) { + super.init(frame: frame) + + addSubview(scrollView) + scrollView.addSubview(stackView) + + scrollView.snp.makeConstraints { make in + make.left.right.top.equalToSuperview() + make.bottom.equalToSuperview().offset(-20) + } + + stackView.snp.makeConstraints { make in + make.left.centerX.top.bottom.equalToSuperview() + } + + reloadData() + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) { + if keyPath == "contentSize" { + self.heightDidChange?() + } + } + + + func reloadData() { + stackView.sr_removeAllArrangedSubview() + + var popularArr: [SRShortModel]? = nil + var updatesArr: [SRShortModel]? = nil + + self.viewModel?.moduleArr.forEach { + if $0.module_key == .banner { + bannerView.dataArr = $0.list + stackView.addArrangedSubview(bannerView) + } else if $0.module_key == .detailsRecommand { + youLikeView.dataArr = $0.list + stackView.addArrangedSubview(youLikeView) + } else if $0.module_key == .popular { + popularArr = $0.list + stackView.addArrangedSubview(topChartsView) + } else if $0.module_key == .updates { + updatesArr = $0.list + stackView.addArrangedSubview(topChartsView) + } else if $0.module_key == .bingeWorthy { + bingeWorthyView.dataArr = $0.list + stackView.addArrangedSubview(bingeWorthyView) + } else if $0.module_key == .viralHits { + viralHitsView.dataArr = $0.list + stackView.addArrangedSubview(viralHitsView) + } else if $0.module_key == .premiereNow { + premiereNowView.dataArr = $0.list + stackView.addArrangedSubview(premiereNowView) + } + } + + + self.topChartsView.popularArr = popularArr + self.topChartsView.updatesArr = updatesArr + self.topChartsView.reloadData() + } + + func pushShortDetail(_ model: SRShortModel?) { + let vc = SRDetailPlayerViewController() + vc.shortId = model?.short_play_id + self.viewController?.navigationController?.pushViewController(vc, animated: true) + } +} diff --git a/SynthReel/Class/Home/V/SRHomeHotView.swift b/SynthReel/Class/Home/V/SRHomeHotView.swift new file mode 100644 index 0000000..e0e6479 --- /dev/null +++ b/SynthReel/Class/Home/V/SRHomeHotView.swift @@ -0,0 +1,61 @@ +// +// SRHomeHotView.swift +// SynthReel +// +// Created by 湖北秦九 on 2025/11/17. +// Copyright © 2025 SR. All rights reserved. +// + +import UIKit +import SnapKit + +class SRHomeHotView: UIView { + + var count: Int = 0 { + didSet { + + if count > 1000 { + countLabel.text = NSNumber(value: CGFloat(count) / 1000).toString(maximumFractionDigits: 1) + "k" + + } else { + countLabel.text = "\(count)" + } + + } + } + + lazy var iconImageView = UIImageView(image: UIImage(named: "hot_icon_01")) + + lazy var countLabel: SRLabel = { + let label = SRLabel() + label.font = .font(ofSize: 10, weight: .regular) + label.textColors = [UIColor._4_CFFD_4.cgColor, UIColor._51_D_4_FF.cgColor] + label.textStartPoint = .init(x: 0.5, y: 0) + label.textEndPoint = .init(x: 0.5, y: 1) + return label + }() + + override init(frame: CGRect) { + super.init(frame: frame) + + addSubview(iconImageView) + addSubview(countLabel) + + iconImageView.snp.makeConstraints { make in + make.left.equalToSuperview() + make.top.equalToSuperview().offset(1) + make.centerY.equalToSuperview() + } + + countLabel.snp.makeConstraints { make in + make.centerY.equalToSuperview() + make.right.equalToSuperview() + make.left.equalTo(iconImageView.snp.right).offset(3) + } + } + + @MainActor required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + +} diff --git a/SynthReel/Class/Home/V/SRHomeMenuCell.swift b/SynthReel/Class/Home/V/SRHomeMenuCell.swift new file mode 100644 index 0000000..d052887 --- /dev/null +++ b/SynthReel/Class/Home/V/SRHomeMenuCell.swift @@ -0,0 +1,51 @@ +// +// SRHomeMenuCell.swift +// SynthReel +// +// Created by 湖北秦九 on 2025/11/14. +// Copyright © 2025 SR. All rights reserved. +// + +import UIKit +import JXSegmentedView +import SnapKit + +class SRHomeMenuCell: JXSegmentedTitleGradientCell/*JXSegmentedTitleCell*/ { + + + lazy var bgImageView: UIImageView = { + let imageView = UIImageView() + return imageView + }() + +// lazy var gTitleLabel: SRLabel = { +// let +// }() + + override func commonInit() { + super.commonInit() +// self.titleLabel.removeFromSuperview() +// self.maskTitleLabel.removeFromSuperview() + + self.contentView.addSubview(bgImageView) + + bgImageView.snp.makeConstraints { make in + make.edges.equalToSuperview() + } + + self.contentView.sendSubviewToBack(bgImageView) + } + + + + override func reloadData(itemModel: JXSegmentedBaseItemModel, selectedType: JXSegmentedViewItemSelectedType) { + super.reloadData(itemModel: itemModel, selectedType: selectedType) + + if itemModel.isSelected { + bgImageView.image = UIImage(named: "home_menu_bg_image_selected") + } else { + bgImageView.image = UIImage(named: "home_menu_bg_image") + } + + } +} diff --git a/SynthReel/Class/Home/V/SRHomeModuleView.swift b/SynthReel/Class/Home/V/SRHomeModuleView.swift new file mode 100644 index 0000000..0bab06d --- /dev/null +++ b/SynthReel/Class/Home/V/SRHomeModuleView.swift @@ -0,0 +1,65 @@ +// +// SRHomeModuleView.swift +// SynthReel +// +// Created by 湖北秦九 on 2025/11/15. +// Copyright © 2025 SR. All rights reserved. +// + +import UIKit +import SnapKit + +class SRHomeModuleView: UIView { + + var didSelectedShort: ((_ model: SRShortModel?) -> Void)? + + lazy var titleLabel: UILabel = { + let label = UILabel() + label.font = .font(ofSize: 18, weight: .bold) + label.textColor = .white + return label + }() + + lazy var indicatorImageView = UIImageView(image: UIImage(named: "arrow_right_icon_01")) + + lazy var button: UIControl = { + let button = UIControl(frame: .zero, primaryAction: UIAction(handler: { [weak self] _ in + guard let self = self else { return } + + })) + return button + }() + + + override init(frame: CGRect) { + super.init(frame: frame) + + + addSubview(button) + button.addSubview(titleLabel) + button.addSubview(indicatorImageView) + + button.snp.makeConstraints { make in + make.left.equalToSuperview().offset(15) + make.right.equalToSuperview().offset(-15) + make.top.equalToSuperview() + make.height.equalTo(40) + } + + titleLabel.snp.makeConstraints { make in + make.centerY.equalToSuperview() + make.left.equalToSuperview() + } + + indicatorImageView.snp.makeConstraints { make in + make.centerY.equalToSuperview() + make.right.equalToSuperview() + } + + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + +} diff --git a/SynthReel/Class/Home/V/SRHomePremiereNowView.swift b/SynthReel/Class/Home/V/SRHomePremiereNowView.swift new file mode 100644 index 0000000..f6942aa --- /dev/null +++ b/SynthReel/Class/Home/V/SRHomePremiereNowView.swift @@ -0,0 +1,198 @@ +// +// SRHomePremiereNowView.swift +// SynthReel +// +// Created by 湖北秦九 on 2025/11/17. +// Copyright © 2025 SR. All rights reserved. +// + +import UIKit +import SnapKit + +class SRHomePremiereNowView: SRHomeModuleView { + + + var dataArr: [SRShortModel]? { + didSet { + let count = dataArr?.count ?? 0 + + self.oneModel = dataArr?.first + + if count >= 2 { + self.twoModel = dataArr?[1] + } else { + self.twoModel = nil + } + + if count >= 3 { + self.threeModel = dataArr?[2] + } else { + self.threeModel = nil + } + + + } + } + + var oneModel: SRShortModel? { + didSet { + oneCoverImageView.sr_setImage(oneModel?.image_url) + + oneTitleLabel.text = oneModel?.name + } + } + + var twoModel: SRShortModel? { + didSet { + if let model = twoModel { + twoCoverImageView.sr_setImage(model.image_url) + twoCoverImageView.isHidden = false + } else { + twoCoverImageView.isHidden = true + } + } + } + + var threeModel: SRShortModel? { + didSet { + if let model = threeModel { + threeCoverImageView.sr_setImage(model.image_url) + threeCoverImageView.isHidden = false + } else { + threeCoverImageView.isHidden = true + } + } + } + + + lazy var bgImageView = UIImageView(image: UIImage(named: "premiere_now_bg_image_01")) + + lazy var oneBgImageView = UIImageView(image: UIImage(named: "premiere_now_bg_image_02")) + + lazy var oneCoverImageView: SRImageView = { + let imageView = SRImageView() + imageView.isUserInteractionEnabled = true + let tap = UITapGestureRecognizer { [weak self] _ in + guard let self = self else { return } + self.didSelectedShort?(self.oneModel) + } + imageView.addGestureRecognizer(tap) + return imageView + }() + + lazy var oneTitleBgView = UIImageView(image: UIImage(named: "premiere_now_title_bg")) + lazy var oneTitleLabel: UILabel = { + let label = SRLabel() + label.font = .font(ofSize: UIScreen.getRatioWidth(size: 12), weight: .medium) + label.numberOfLines = 2 + label.textAlignment = .center + label.textColors = [UIColor.srGreen.cgColor, UIColor.srBlue.cgColor] + label.textStartPoint = .init(x: 0.5, y: 0) + label.textEndPoint = .init(x: 0.5, y: 1) + return label + }() + + lazy var twoCoverImageView: SRImageView = { + let imageView = SRImageView() + imageView.isUserInteractionEnabled = true + let tap = UITapGestureRecognizer { [weak self] _ in + guard let self = self else { return } + self.didSelectedShort?(self.twoModel) + } + imageView.addGestureRecognizer(tap) + return imageView + }() + + lazy var threeCoverImageView: SRImageView = { + let imageView = SRImageView() + imageView.isUserInteractionEnabled = true + let tap = UITapGestureRecognizer { [weak self] _ in + guard let self = self else { return } + self.didSelectedShort?(self.threeModel) + } + imageView.addGestureRecognizer(tap) + return imageView + }() + + + override init(frame: CGRect) { + super.init(frame: frame) + self.titleLabel.text = "Premiere Now".localized + sr_setupUI() + } + + @MainActor required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + override func layoutSubviews() { + super.layoutSubviews() + oneCoverImageView.applyHexagonMask(2) + twoCoverImageView.applyHexagonMask(2) + threeCoverImageView.applyHexagonMask(2) + } + + +} + +extension SRHomePremiereNowView { + + private func sr_setupUI() { + oneBgImageView.isUserInteractionEnabled = true + + addSubview(bgImageView) + addSubview(oneBgImageView) + oneBgImageView.addSubview(oneCoverImageView) + oneCoverImageView.addSubview(oneTitleBgView) + oneTitleBgView.addSubview(oneTitleLabel) + addSubview(twoCoverImageView) + addSubview(threeCoverImageView) + + bgImageView.snp.makeConstraints { make in + make.left.right.equalToSuperview() + make.centerY.equalTo(oneBgImageView) + make.height.equalTo(UIScreen.getRatioWidth(size: 155)) + } + + oneBgImageView.snp.makeConstraints { make in + make.centerX.equalToSuperview() + make.bottom.equalToSuperview() + make.top.equalTo(button.snp.bottom).offset(8) + make.width.equalTo(UIScreen.getRatioWidth(size: 200)) + make.height.equalTo(UIScreen.getRatioWidth(size: 175)) + } + + oneCoverImageView.snp.makeConstraints { make in + make.center.equalToSuperview() + make.width.equalTo(UIScreen.getRatioWidth(size: 190)) + make.height.equalTo(UIScreen.getRatioWidth(size: 166)) + } + + oneTitleBgView.snp.makeConstraints { make in + make.bottom.equalToSuperview() + make.left.equalToSuperview().offset(UIScreen.getRatioWidth(size: 24.5)) + make.right.equalToSuperview().offset(-UIScreen.getRatioWidth(size: 27)) + make.height.equalTo(UIScreen.getRatioWidth(size: 41)) + } + + oneTitleLabel.snp.makeConstraints { make in + make.centerY.equalTo(oneTitleBgView.snp.top).offset(UIScreen.getRatioWidth(size: 23)) + make.centerX.equalToSuperview().offset(UIScreen.getRatioWidth(size: 1.5)) + make.right.lessThanOrEqualToSuperview().offset(-UIScreen.getRatioWidth(size: 15)) + } + + twoCoverImageView.snp.makeConstraints { make in + make.centerY.equalTo(oneBgImageView) + make.left.equalToSuperview().offset(UIScreen.getRatioWidth(size: 20)) + make.width.equalTo(UIScreen.getRatioWidth(size: 62)) + make.height.equalTo(UIScreen.getRatioWidth(size: 54)) + } + + threeCoverImageView.snp.makeConstraints { make in + make.centerY.equalTo(oneBgImageView) + make.right.equalToSuperview().offset(-UIScreen.getRatioWidth(size: 20)) + make.width.height.equalTo(twoCoverImageView) + } + } + +} diff --git a/SynthReel/Class/Home/V/SRHomeTopChartsContentView.swift b/SynthReel/Class/Home/V/SRHomeTopChartsContentView.swift new file mode 100644 index 0000000..229831e --- /dev/null +++ b/SynthReel/Class/Home/V/SRHomeTopChartsContentView.swift @@ -0,0 +1,196 @@ +// +// SRHomeTopChartsContentView.swift +// SynthReel +// +// Created by 湖北秦九 on 2025/11/17. +// Copyright © 2025 SR. All rights reserved. +// + +import UIKit +import SnapKit + + +extension SRHomeTopChartsView { + + class ContentView: UIView { + + var didSelectedShort: ((_ model: SRShortModel?) -> Void)? + + var dataArr: [SRShortModel]? { + didSet { + self.collectionView.reloadData() + } + } + + lazy var bgImageView = UIImageView() + + lazy var trophyImageView = UIImageView(image: UIImage(named: "trophy_icon_01")) + + lazy var titleLabel: UILabel = { + let label = UILabel() + label.font = .font(ofSize: 15, weight: .bold) + label.textColor = .white + return label + }() + + lazy var collectionViewLayout: UICollectionViewFlowLayout = { + let layout = UICollectionViewFlowLayout() + layout.itemSize = .init(width: 198, height: 53) + layout.minimumLineSpacing = 9 + return layout + }() + + lazy var collectionView: SRCollectionView = { + let collectionView = SRCollectionView(frame: .zero, collectionViewLayout: collectionViewLayout) + collectionView.delegate = self + collectionView.dataSource = self + collectionView.isScrollEnabled = false + collectionView.register(ContentCell.self, forCellWithReuseIdentifier: "cell") + return collectionView + }() + + + override init(frame: CGRect) { + super.init(frame: frame) + bgImageView.isUserInteractionEnabled = true + + addSubview(bgImageView) + addSubview(trophyImageView) + bgImageView.addSubview(titleLabel) + bgImageView.addSubview(collectionView) + + bgImageView.snp.makeConstraints { make in + make.left.right.bottom.equalToSuperview() + make.top.equalToSuperview().offset(16) + make.width.equalTo(198) + } + + trophyImageView.snp.makeConstraints { make in + make.top.right.equalToSuperview() + } + + titleLabel.snp.makeConstraints { make in + make.left.equalToSuperview().offset(10) + make.top.equalToSuperview().offset(13) + } + + collectionView.snp.makeConstraints { make in + make.left.equalToSuperview() + make.right.equalToSuperview() + make.top.equalToSuperview().offset(46) + make.bottom.equalToSuperview() + } + + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + } + +} + +//MARK: UICollectionViewDelegate UICollectionViewDataSource +extension SRHomeTopChartsView.ContentView: UICollectionViewDelegate, UICollectionViewDataSource { + + func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { + return min(3, self.dataArr?.count ?? 0) + } + + func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { + + let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath) as! SRHomeTopChartsView.ContentCell + cell.row = indexPath.row + cell.model = self.dataArr?[indexPath.row] + return cell + } + + func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { + self.didSelectedShort?(self.dataArr?[indexPath.row]) + } + +} + + +extension SRHomeTopChartsView { + class ContentCell: UICollectionViewCell { + + var model: SRShortModel? { + didSet { + coverImageView.sr_setImage(model?.image_url) + titleLabel.text = model?.name + hotView.count = model?.watch_total ?? 0 + } + } + + var row: Int = 0 { + didSet { + numLabel.text = "\(row + 1)" + } + } + + lazy var numLabel: UILabel = { + let label = UILabel() + label.font = .font(ofSize: 12, weight: .bold) + label.textColor = .white + return label + }() + + lazy var coverImageView: SRImageView = { + let imageView = SRImageView() + imageView.layer.cornerRadius = 2 + imageView.layer.masksToBounds = true + return imageView + }() + + lazy var titleLabel: UILabel = { + let label = UILabel() + label.font = .font(ofSize: 12, weight: .medium) + label.textColor = .white + return label + }() + + lazy var hotView: SRHomeHotView = { + let view = SRHomeHotView() + return view + }() + + override init(frame: CGRect) { + super.init(frame: frame) + + contentView.addSubview(numLabel) + contentView.addSubview(coverImageView) + contentView.addSubview(titleLabel) + contentView.addSubview(hotView) + + numLabel.snp.makeConstraints { make in + make.centerY.equalToSuperview() + make.centerX.equalTo(self.contentView.snp.left).offset(14) + } + + coverImageView.snp.makeConstraints { make in + make.top.bottom.equalToSuperview() + make.left.equalToSuperview().offset(24) + make.width.equalTo(40) + } + + titleLabel.snp.makeConstraints { make in + make.top.equalToSuperview().offset(10) + make.left.equalTo(coverImageView.snp.right).offset(6) + make.right.lessThanOrEqualToSuperview().offset(-9) + } + + hotView.snp.makeConstraints { make in + make.left.equalTo(coverImageView.snp.right).offset(6) + make.bottom.equalToSuperview().offset(-7) + } + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + } +} + diff --git a/SynthReel/Class/Home/V/SRHomeTopChartsView.swift b/SynthReel/Class/Home/V/SRHomeTopChartsView.swift new file mode 100644 index 0000000..5e675de --- /dev/null +++ b/SynthReel/Class/Home/V/SRHomeTopChartsView.swift @@ -0,0 +1,106 @@ +// +// SRHomeTopChartsView.swift +// SynthReel +// +// Created by 湖北秦九 on 2025/11/17. +// Copyright © 2025 SR. All rights reserved. +// + +import UIKit +import SnapKit + +class SRHomeTopChartsView: SRHomeModuleView { + + var popularArr: [SRShortModel]? { + didSet { + popularView.dataArr = popularArr + } + } + + var updatesArr: [SRShortModel]? { + didSet { + updatesView.dataArr = updatesArr + } + } + + + lazy var scrollView: SRScrollView = { + let scrollView = SRScrollView() + scrollView.showsHorizontalScrollIndicator = false + return scrollView + }() + + lazy var stackView: UIStackView = { + let view = UIStackView() + view.axis = .horizontal + view.spacing = 16 + return view + }() + + lazy var popularView: ContentView = { + let view = ContentView() + view.titleLabel.text = "Popular".localized + view.bgImageView.image = UIImage(named: "popular_bg_image") + view.didSelectedShort = { [weak self] model in + self?.didSelectedShort?(model) + } + return view + }() + + lazy var updatesView: ContentView = { + let view = ContentView() + view.titleLabel.text = "Updates".localized + view.bgImageView.image = UIImage(named: "updates_bg_image") + view.didSelectedShort = { [weak self] model in + self?.didSelectedShort?(model) + } + return view + }() + + + override init(frame: CGRect) { + super.init(frame: frame) + self.titleLabel.text = "Top Charts".localized + + sr_setupUI() + } + + @MainActor required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + func reloadData() { + stackView.sr_removeAllArrangedSubview() + + if let arr = self.popularArr, arr.count > 0 { + stackView.addArrangedSubview(popularView) + } + + if let arr = self.updatesArr, arr.count > 0 { + stackView.addArrangedSubview(updatesView) + } + } + +} + +extension SRHomeTopChartsView { + + private func sr_setupUI() { + addSubview(scrollView) + scrollView.addSubview(stackView) + + scrollView.snp.makeConstraints { make in + make.left.right.equalToSuperview() + make.top.equalTo(self.button.snp.bottom) + make.height.equalTo(238 + 16) + make.bottom.equalToSuperview() + } + + stackView.snp.makeConstraints { make in + make.top.equalToSuperview() + make.left.equalToSuperview().offset(15) + make.right.equalToSuperview().offset(-15) + make.height.equalTo(238 + 16) + } + } +} diff --git a/SynthReel/Class/Home/V/SRHomeViralHitsCell.swift b/SynthReel/Class/Home/V/SRHomeViralHitsCell.swift new file mode 100644 index 0000000..ea1ad2e --- /dev/null +++ b/SynthReel/Class/Home/V/SRHomeViralHitsCell.swift @@ -0,0 +1,86 @@ +// +// SRHomeViralHitsCell.swift +// SynthReel +// +// Created by 湖北秦九 on 2025/11/17. +// Copyright © 2025 SR. All rights reserved. +// + +import UIKit +import SnapKit + +class SRHomeViralHitsCell: UICollectionViewCell { + + var model: SRShortModel? { + didSet { + coverImageView.sr_setImage(model?.image_url) + titleLabel.text = model?.name + hotView.count = model?.watch_total ?? 0 + } + } + + lazy var bgImageView = UIImageView(image: UIImage(named: "home_viral_hits_cell_image")) + + lazy var coverImageView: SRImageView = { + let imageView = SRImageView() + imageView.layer.cornerRadius = 2 + imageView.layer.masksToBounds = true + return imageView + }() + + lazy var titleLabel: UILabel = { + let label = UILabel() + label.font = .font(ofSize: 12, weight: .medium) + label.textColor = .white + return label + }() + + lazy var hotView: SRHomeHotView = { + let view = SRHomeHotView() + return view + }() + + override init(frame: CGRect) { + super.init(frame: frame) + + sr_setupUI() + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } +} + +extension SRHomeViralHitsCell { + + private func sr_setupUI() { + contentView.addSubview(bgImageView) + contentView.addSubview(coverImageView) + coverImageView.addSubview(hotView) + contentView.addSubview(titleLabel) + + bgImageView.snp.makeConstraints { make in + make.edges.equalToSuperview() + } + + coverImageView.snp.makeConstraints { make in + make.centerX.equalToSuperview() + make.left.equalToSuperview().offset(13) + make.top.equalToSuperview().offset(21) + make.height.equalTo(180) + } + + hotView.snp.makeConstraints { make in + make.right.equalToSuperview().offset(-5) + make.top.equalToSuperview().offset(4) + } + + titleLabel.snp.makeConstraints { make in + make.left.equalToSuperview().offset(13) + make.right.lessThanOrEqualToSuperview().offset(-13) + make.top.equalTo(coverImageView.snp.bottom).offset(4) + } + + } + +} diff --git a/SynthReel/Class/Home/V/SRHomeViralHitsView.swift b/SynthReel/Class/Home/V/SRHomeViralHitsView.swift new file mode 100644 index 0000000..c6e276c --- /dev/null +++ b/SynthReel/Class/Home/V/SRHomeViralHitsView.swift @@ -0,0 +1,74 @@ +// +// SRHomeViralHitsView.swift +// SynthReel +// +// Created by 湖北秦九 on 2025/11/17. +// Copyright © 2025 SR. All rights reserved. +// + +import UIKit +import SnapKit + +class SRHomeViralHitsView: SRHomeModuleView { + + var dataArr: [SRShortModel]? { + didSet { + collectionView.reloadData() + } + } + + lazy var collectionViewLayout: UICollectionViewFlowLayout = { + let layout = UICollectionViewFlowLayout() + layout.scrollDirection = .horizontal + layout.minimumLineSpacing = 12 + layout.itemSize = .init(width: 161, height: 237) + return layout + }() + + lazy var collectionView: SRCollectionView = { + let collectionView = SRCollectionView(frame: .zero, collectionViewLayout: collectionViewLayout) + collectionView.delegate = self + collectionView.dataSource = self + collectionView.showsHorizontalScrollIndicator = false + collectionView.contentInset = .init(top: 0, left: 15, bottom: 0, right: 15) + collectionView.register(SRHomeViralHitsCell.self, forCellWithReuseIdentifier: "cell") + return collectionView + }() + + override init(frame: CGRect) { + super.init(frame: frame) + self.titleLabel.text = "Viral Hits".localized + + addSubview(collectionView) + + collectionView.snp.makeConstraints { make in + make.left.right.bottom.equalToSuperview() + make.top.equalTo(button.snp.bottom).offset(6) + make.height.equalTo(collectionViewLayout.itemSize.height) + } + } + + @MainActor required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + +} + + +//MARK: UICollectionViewDelegate UICollectionViewDataSource +extension SRHomeViralHitsView: UICollectionViewDelegate, UICollectionViewDataSource { + + func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { + let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath) as! SRHomeViralHitsCell + cell.model = dataArr?[indexPath.row] + return cell + } + + func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { + return self.dataArr?.count ?? 0 + } + + func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { + self.didSelectedShort?(self.dataArr?[indexPath.row]) + } +} diff --git a/SynthReel/Class/Home/V/SRHomeYouLikeCell.swift b/SynthReel/Class/Home/V/SRHomeYouLikeCell.swift new file mode 100644 index 0000000..2ca2866 --- /dev/null +++ b/SynthReel/Class/Home/V/SRHomeYouLikeCell.swift @@ -0,0 +1,120 @@ +// +// SRHomeYouLikeCell.swift +// SynthReel +// +// Created by 湖北秦九 on 2025/11/15. +// Copyright © 2025 SR. All rights reserved. +// + +import UIKit +import SnapKit + +class SRHomeYouLikeCell: UICollectionViewCell { + + var model: SRShortModel? { + didSet { + coverImageView.sr_setImage(model?.image_url) + + titleLabel.text = model?.name + desLabel.text = model?.sr_description + } + } + + lazy var bgView: UIView = UIImageView(image: UIImage(named: "cell_bg_image_01")) + + lazy var coverBgView: UIView = { + let view = UIView() + view.layer.cornerRadius = 34 + view.layer.masksToBounds = true + view.layer.borderWidth = 0.7 + view.layer.borderColor = UIColor._4_CFFD_4.withAlphaComponent(0.25).cgColor + return view + }() + + lazy var coverBorderView: SRGradientView = { + let view = SRGradientView() + view.layer.cornerRadius = 31 + view.layer.masksToBounds = true + view.colors = [UIColor._4_CFFD_4.cgColor, UIColor._51_D_4_FF.cgColor] + view.startPoint = .init(x: 0, y: 0) + view.endPoint = .init(x: 1, y: 1) + return view + }() + + lazy var coverImageView: SRImageView = { + let imageView = SRImageView() + imageView.layer.cornerRadius = 30.25 + imageView.layer.masksToBounds = true + return imageView + }() + + lazy var titleLabel: UILabel = { + let label = UILabel() + label.font = .font(ofSize: 14, weight: .medium) + label.textColor = .white + return label + }() + + lazy var desLabel: UILabel = { + let label = UILabel() + label.font = .font(ofSize: 11, weight: .regular) + label.textColor = .A_6_A_6_A_6 + label.numberOfLines = 2 + return label + }() + + override init(frame: CGRect) { + super.init(frame: frame) + + sr_setupUI() + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } +} + +extension SRHomeYouLikeCell { + + private func sr_setupUI() { + contentView.addSubview(bgView) + bgView.addSubview(coverBgView) + coverBgView.addSubview(coverBorderView) + coverBgView.addSubview(coverImageView) + bgView.addSubview(titleLabel) + bgView.addSubview(desLabel) + + bgView.snp.makeConstraints { make in + make.edges.equalToSuperview() + } + + coverBgView.snp.makeConstraints { make in + make.centerY.equalToSuperview() + make.left.equalToSuperview().offset(8) + make.width.height.equalTo(68) + } + + coverBorderView.snp.makeConstraints { make in + make.center.equalToSuperview() + make.width.height.equalTo(62) + } + + coverImageView.snp.makeConstraints { make in + make.center.equalToSuperview() + make.width.height.equalTo(60.5) + } + + titleLabel.snp.makeConstraints { make in + make.left.equalTo(coverBgView.snp.right).offset(9) + make.top.equalToSuperview().offset(17) + make.right.lessThanOrEqualToSuperview().offset(-12) + } + + desLabel.snp.makeConstraints { make in + make.left.equalTo(titleLabel) + make.top.equalTo(titleLabel.snp.bottom).offset(11) + make.right.lessThanOrEqualToSuperview().offset(-12) + } + } + +} diff --git a/SynthReel/Class/Home/V/SRHomeYouLikeView.swift b/SynthReel/Class/Home/V/SRHomeYouLikeView.swift new file mode 100644 index 0000000..33d894a --- /dev/null +++ b/SynthReel/Class/Home/V/SRHomeYouLikeView.swift @@ -0,0 +1,81 @@ +// +// SRHomeYouLikeView.swift +// SynthReel +// +// Created by 湖北秦九 on 2025/11/15. +// Copyright © 2025 SR. All rights reserved. +// + +import UIKit +import SnapKit + +class SRHomeYouLikeView: UIView { + + var dataArr: [SRShortModel]? { + didSet { + self.collectionView.reloadData() + } + } + + var didSelectedShort: ((_ model: SRShortModel?) -> Void)? + + lazy var collectionViewLayout: UICollectionViewFlowLayout = { + let layout = UICollectionViewFlowLayout() + layout.scrollDirection = .horizontal + layout.minimumLineSpacing = 14 + layout.itemSize = .init(width: 220, height: 82) + return layout + }() + + lazy var collectionView: SRCollectionView = { + let collectionView = SRCollectionView(frame: .zero, collectionViewLayout: collectionViewLayout) + collectionView.delegate = self + collectionView.dataSource = self + collectionView.showsHorizontalScrollIndicator = false + collectionView.contentInset = .init(top: 0, left: 15, bottom: 0, right: 15) + collectionView.register(SRHomeYouLikeCell.self, forCellWithReuseIdentifier: "cell") + return collectionView + }() + + override init(frame: CGRect) { + super.init(frame: frame) + + sr_setupUI() + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + +} + +extension SRHomeYouLikeView { + + func sr_setupUI() { + + addSubview(collectionView) + + collectionView.snp.makeConstraints { make in + make.left.right.top.bottom.equalToSuperview() + make.height.equalTo(82) + } + } + +} + +//MARK: UICollectionViewDelegate UICollectionViewDataSource +extension SRHomeYouLikeView: UICollectionViewDelegate, UICollectionViewDataSource { + func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { + let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath) as! SRHomeYouLikeCell + cell.model = self.dataArr?[indexPath.row] + return cell + } + + func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { + return self.dataArr?.count ?? 0 + } + + func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { + self.didSelectedShort?(self.dataArr?[indexPath.row]) + } +} diff --git a/SynthReel/Class/Home/V/SRHotSearchCell.swift b/SynthReel/Class/Home/V/SRHotSearchCell.swift new file mode 100644 index 0000000..28713bf --- /dev/null +++ b/SynthReel/Class/Home/V/SRHotSearchCell.swift @@ -0,0 +1,114 @@ +// +// SRHotSearchCell.swift +// SynthReel +// +// Created by 湖北秦九 on 2025/11/18. +// Copyright © 2025 SR. All rights reserved. +// + +import UIKit +import SnapKit + +class SRHotSearchCell: SRTableViewCell { + + var model: SRShortModel? { + didSet { + coverImageView.sr_setImage(model?.image_url) + titleLabel.text = model?.name + hotView.count = model?.watch_total ?? 0 + desLabel.text = model?.sr_description + } + } + + var row: Int = 0 { + didSet { + numLabel.text = "\(row + 1)" + } + } + + lazy var numLabel: UILabel = { + let label = UILabel() + label.font = .font(ofSize: 12, weight: .bold) + label.textColor = .white + return label + }() + + lazy var coverImageView: SRImageView = { + let imageView = SRImageView() + imageView.layer.cornerRadius = 2 + imageView.layer.masksToBounds = true + return imageView + }() + + lazy var titleLabel: UILabel = { + let label = UILabel() + label.font = .font(ofSize: 14, weight: .medium) + label.textColor = .white + return label + }() + + lazy var hotView: SRHomeHotView = { + let view = SRHomeHotView() + return view + }() + + lazy var desLabel: UILabel = { + let label = UILabel() + label.font = .font(ofSize: 11, weight: .regular) + label.textColor = .A_6_A_6_A_6 + return label + }() + + override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) { + super.init(style: style, reuseIdentifier: reuseIdentifier) + + sr_setupUI() + } + + @MainActor required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + +} + +extension SRHotSearchCell { + + private func sr_setupUI() { + contentView.addSubview(numLabel) + contentView.addSubview(coverImageView) + contentView.addSubview(titleLabel) + contentView.addSubview(hotView) + contentView.addSubview(desLabel) + + coverImageView.snp.makeConstraints { make in + make.left.equalToSuperview().offset(24) + make.width.equalTo(40) + make.height.equalTo(53) + make.top.equalToSuperview().offset(8) + make.bottom.equalToSuperview().offset(-8) + } + + numLabel.snp.makeConstraints { make in + make.centerX.equalTo(self.contentView.snp.left).offset(14) + make.centerY.equalToSuperview() + } + + titleLabel.snp.makeConstraints { make in + make.left.equalTo(coverImageView.snp.right).offset(6) + make.top.equalTo(coverImageView).offset(8) + } + + hotView.snp.makeConstraints { make in + make.left.equalTo(titleLabel.snp.right).offset(15) + make.right.lessThanOrEqualToSuperview().offset(-30) + make.centerY.equalTo(titleLabel) + } + + desLabel.snp.makeConstraints { make in + make.left.equalTo(titleLabel) + make.bottom.equalTo(coverImageView).offset(-6) + make.right.equalToSuperview().offset(-27) + } + } + +} diff --git a/SynthReel/Class/Home/V/SRHotSearchView.swift b/SynthReel/Class/Home/V/SRHotSearchView.swift new file mode 100644 index 0000000..127a01c --- /dev/null +++ b/SynthReel/Class/Home/V/SRHotSearchView.swift @@ -0,0 +1,115 @@ +// +// SRHotSearchView.swift +// SynthReel +// +// Created by 湖北秦九 on 2025/11/18. +// Copyright © 2025 SR. All rights reserved. +// + +import UIKit +import SnapKit +import YYCategories + +class SRHotSearchView: UIView { + + override var intrinsicContentSize: CGSize { + return .init(width: UIScreen.width, height: UIScreen.height) + } + + var dataArr: [SRShortModel] = [] { + didSet { + self.tableView.reloadData() + } + } + + lazy var bgImageView: UIImageView = { + let imageView = UIImageView(image: UIImage(named: "search_hot_bg_image")) + imageView.isUserInteractionEnabled = true + return imageView + }() + + lazy var titleLabel: UILabel = { + let label = SRLabel() + label.font = .font(ofSize: 15, weight: .semibold) + label.textColors = [UIColor._7_AF_4_E_0.cgColor, UIColor.white.cgColor, UIColor._7_AF_4_E_0.cgColor] + label.textStartPoint = .init(x: 0, y: 0.5) + label.textEndPoint = .init(x: 1, y: 0.5) + label.text = "Premium Picks".localized + return label + }() + + lazy var tableView: SRTableView = { + let tableView = SRTableView(frame: .zero, style: .plain) + tableView.delegate = self + tableView.dataSource = self + tableView.separatorStyle = .none + tableView.showsVerticalScrollIndicator = false + tableView.keyboardDismissMode = .onDrag + tableView.contentInset = .init(top: 0, left: 0, bottom: 5, right: 0) + tableView.register(SRHotSearchCell.self, forCellReuseIdentifier: "cell") + return tableView + }() + + + override init(frame: CGRect) { + super.init(frame: frame) + + sr_setupUI() + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + +} + +extension SRHotSearchView { + + private func sr_setupUI() { + addSubview(bgImageView) + bgImageView.addSubview(titleLabel) + bgImageView.addSubview(tableView) + + bgImageView.snp.makeConstraints { make in + make.left.equalToSuperview().offset(15) + make.centerX.equalToSuperview() + make.top.equalToSuperview() + make.bottom.equalToSuperview().offset(-(UIScreen.safeBottom + 10)) + } + + titleLabel.snp.makeConstraints { make in + make.left.equalToSuperview().offset(10) + make.top.equalToSuperview().offset(13) + } + + tableView.snp.makeConstraints { make in + make.left.right.equalToSuperview() + make.top.equalToSuperview().offset(38) + make.bottom.equalToSuperview() + } + } + +} + +//MARK: UITableViewDelegate UITableViewDataSource +extension SRHotSearchView: UITableViewDelegate, UITableViewDataSource { + + func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { + let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! SRHotSearchCell + cell.row = indexPath.row + cell.model = dataArr[indexPath.row] + return cell + } + + func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { + return self.dataArr.count + } + + func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { + let model = dataArr[indexPath.row] + let vc = SRDetailPlayerViewController() + vc.shortId = model.short_play_id + self.viewController?.navigationController?.pushViewController(vc, animated: true) + } +} diff --git a/SynthReel/Class/Home/V/SRSearchHomeView.swift b/SynthReel/Class/Home/V/SRSearchHomeView.swift new file mode 100644 index 0000000..3223680 --- /dev/null +++ b/SynthReel/Class/Home/V/SRSearchHomeView.swift @@ -0,0 +1,93 @@ +// +// SRSearchHomeView.swift +// SynthReel +// +// Created by 湖北秦九 on 2025/11/18. +// Copyright © 2025 SR. All rights reserved. +// + +import UIKit +import SnapKit + +class SRSearchHomeView: UIView { + + var didSearch: ((_ text: String) -> Void)? + + weak var viewModel: SRSearchViewModel? { + didSet { + viewModel?.addObserver(self, forKeyPath: "hotDataArr", context: nil) + viewModel?.addObserver(self, forKeyPath: "recordList", context: nil) + + self.hotView.dataArr = self.viewModel?.hotDataArr ?? [] + self.recordView.dataArr = self.viewModel?.recordList ?? [] + updateLayout() + } + } + + lazy var stackView: UIStackView = { + let view = UIStackView() + view.spacing = 20 + view.axis = .vertical + return view + }() + + lazy var recordView: SRSearchRecordView = { + let view = SRSearchRecordView() + view.didSearch = { [weak self] text in + self?.didSearch?(text) + } + view.didDeleteAll = { [weak self] in + self?.viewModel?.clearSearchRecord() + } + return view + }() + + lazy var hotView: SRHotSearchView = { + let view = SRHotSearchView() + return view + }() + + deinit { + viewModel?.removeObserver(self, forKeyPath: "hotDataArr") + viewModel?.removeObserver(self, forKeyPath: "recordList") + } + + override init(frame: CGRect) { + super.init(frame: frame) + + addSubview(stackView) + + stackView.snp.makeConstraints { make in + make.left.right.equalToSuperview() + make.top.equalToSuperview().offset(14) + make.bottom.lessThanOrEqualToSuperview() + } + + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) { + if keyPath == "hotDataArr" { + self.hotView.dataArr = self.viewModel?.hotDataArr ?? [] + } else if keyPath == "recordList" { + self.recordView.dataArr = self.viewModel?.recordList ?? [] + } + updateLayout() + } + + func updateLayout() { + stackView.sr_removeAllArrangedSubview() + + if self.recordView.dataArr.count > 0 { + stackView.addArrangedSubview(recordView) + } + if self.hotView.dataArr.count > 0 { + stackView.addArrangedSubview(self.hotView) + } + + } + +} diff --git a/SynthReel/Class/Home/V/SRSearchRecordCell.swift b/SynthReel/Class/Home/V/SRSearchRecordCell.swift new file mode 100644 index 0000000..2da3169 --- /dev/null +++ b/SynthReel/Class/Home/V/SRSearchRecordCell.swift @@ -0,0 +1,42 @@ +// +// SRSearchRecordCell.swift +// SynthReel +// +// Created by 湖北秦九 on 2025/11/18. +// Copyright © 2025 SR. All rights reserved. +// + +import UIKit +import SnapKit + +class SRSearchRecordCell: UICollectionViewCell { + + static let TextFont: UIFont = .font(ofSize: 12, weight: .regular) + + lazy var textLabel: UILabel = { + let label = UILabel() + label.font = Self.TextFont + label.textColor = .A_6_A_6_A_6 + return label + }() + + override init(frame: CGRect) { + super.init(frame: frame) + contentView.backgroundColor = ._010101.withAlphaComponent(0.2) + contentView.layer.cornerRadius = 14 + contentView.layer.masksToBounds = true + contentView.layer.borderWidth = 1 + contentView.layer.borderColor = UIColor._4_CFFD_4.withAlphaComponent(0.25).cgColor + + contentView.addSubview(textLabel) + + textLabel.snp.makeConstraints { make in + make.center.equalToSuperview() + } + + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } +} diff --git a/SynthReel/Class/Home/V/SRSearchRecordView.swift b/SynthReel/Class/Home/V/SRSearchRecordView.swift new file mode 100644 index 0000000..b48cd4b --- /dev/null +++ b/SynthReel/Class/Home/V/SRSearchRecordView.swift @@ -0,0 +1,135 @@ +// +// SRSearchRecordView.swift +// SynthReel +// +// Created by 湖北秦九 on 2025/11/18. +// Copyright © 2025 SR. All rights reserved. +// + +import UIKit +import SnapKit +import collection_view_layouts + +class SRSearchRecordView: UIView { + + var didSearch: ((_ text: String) -> Void)? + var didDeleteAll: (() -> Void)? + + var dataArr: [String] = [] { + didSet { + self.collectionView.reloadData() + } + } + + lazy var titleLabel: UILabel = { + let label = UILabel() + label.font = .font(ofSize: 12, weight: .medium) + label.textColor = .CCCCCC + label.text = "Search History".localized + return label + }() + + lazy var deleteButton: UIButton = { + let button = UIButton(type: .custom, primaryAction: UIAction(handler: { [weak self] _ in + guard let self = self else { return } + self.didDeleteAll?() + })) + button.setImage(UIImage(named: "delete_icon_01"), for: .normal) + return button + }() + + private lazy var collectionViewLayout: TagsLayout = { + let layout = TagsLayout() + layout.delegate = self + layout.contentPadding = ItemsPadding(horizontal: 15, vertical: 0) + layout.cellsPadding = ItemsPadding(horizontal: 9, vertical: 10) + return layout + }() + + private lazy var collectionView: SRCollectionView = { + let collectionView = SRCollectionView(frame: .zero, collectionViewLayout: collectionViewLayout) + collectionView.delegate = self + collectionView.dataSource = self + collectionView.addObserver(self, forKeyPath: "contentSize", context: nil) + collectionView.register(SRSearchRecordCell.self, forCellWithReuseIdentifier: "tagCell") + return collectionView + }() + + deinit { + self.collectionView.removeObserver(self, forKeyPath: "contentSize") + } + + override init(frame: CGRect) { + super.init(frame: frame) + sr_setupUI() + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) { + if keyPath == "contentSize" { + let height = self.collectionView.contentSize.height + self.collectionView.snp.updateConstraints { make in + make.height.equalTo(height + 1) + } + } + } +} + +extension SRSearchRecordView { + + private func sr_setupUI() { + addSubview(titleLabel) + addSubview(deleteButton) + addSubview(collectionView) + + titleLabel.snp.makeConstraints { make in + make.left.equalToSuperview().offset(14) + make.centerY.equalTo(deleteButton) + } + + deleteButton.snp.makeConstraints { make in + make.right.equalToSuperview().offset(-5) + make.top.equalToSuperview().offset(-10) + make.width.equalTo(36) + make.height.equalTo(36) + } + + collectionView.snp.makeConstraints { make in + make.top.equalToSuperview().offset(24) + make.left.equalToSuperview() + make.right.equalToSuperview() + make.bottom.equalToSuperview() + make.height.equalTo(1) + } + } + +} + +//MARK: UICollectionViewDelegate UICollectionViewDataSource +extension SRSearchRecordView: UICollectionViewDelegate, UICollectionViewDataSource { + func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { + return dataArr.count + } + + func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { + let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "tagCell", for: indexPath) as! SRSearchRecordCell + cell.textLabel.text = dataArr[indexPath.row] + return cell + } + + func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { + self.didSearch?(dataArr[indexPath.row]) + } + +} + +extension SRSearchRecordView: LayoutDelegate { + func cellSize(indexPath: IndexPath) -> CGSize { + let text = dataArr[indexPath.row] + let size = text.size(SRSearchRecordCell.TextFont, .init(width: UIScreen.width, height: 24)) + return .init(width: size.width + 20, height: 28) + } +} diff --git a/SynthReel/Class/Home/V/SRSearchResultCell.swift b/SynthReel/Class/Home/V/SRSearchResultCell.swift new file mode 100644 index 0000000..6278326 --- /dev/null +++ b/SynthReel/Class/Home/V/SRSearchResultCell.swift @@ -0,0 +1,139 @@ +// +// SRSearchResultCell.swift +// SynthReel +// +// Created by 湖北秦九 on 2025/11/18. +// Copyright © 2025 SR. All rights reserved. +// + +import UIKit +import SnapKit + +class SRSearchResultCell: UICollectionViewCell { + + + var model: SRShortModel? { + didSet { + coverImageView.sr_setImage(model?.image_url) + titleLabel.text = model?.name + desLabel.text = model?.sr_description + if let category = model?.categoryList?.first?.name, category.count > 0 { + categoryLabel.text = "#\(category)" + } else { + categoryLabel.text = "" + } + } + } + + lazy var bgImageView: UIImageView = { + let imageView = UIImageView(image: UIImage(named: "search_result_cell_bg_image")) + return imageView + }() + + lazy var coverImageView: SRImageView = { + let imageView = SRImageView() + imageView.layer.cornerRadius = 4 + imageView.layer.masksToBounds = true + return imageView + }() + + lazy var titleLabel: UILabel = { + let label = UILabel() + label.font = .font(ofSize: 14, weight: .medium) + label.textColor = .white + return label + }() + + lazy var categoryLabel: SRLabel = { + let label = SRLabel() + label.font = .font(ofSize: 11, weight: .regular) + label.textColors = [UIColor.srGreen.cgColor, UIColor.srBlue.cgColor] + label.textStartPoint = .init(x: 0.5, y: 0) + label.textEndPoint = .init(x: 0.5, y: 1) + return label + }() + + lazy var desLabel: UILabel = { + let label = UILabel() + label.font = .font(ofSize: 11, weight: .regular) + label.textColor = .A_6_A_6_A_6 + label.numberOfLines = 3 + return label + }() + + lazy var playImageView = UIImageView(image: UIImage(named: "play_icon_01")) + + lazy var playLabel: UILabel = { + let label = SRLabel() + label.font = .font(ofSize: 11, weight: .regular) + label.textColors = [UIColor.srGreen.cgColor, UIColor.srBlue.cgColor] + label.textStartPoint = .init(x: 0.5, y: 0) + label.textEndPoint = .init(x: 0.5, y: 1) + label.text = "Play" + return label + }() + + override init(frame: CGRect) { + super.init(frame: frame) + + sr_setupUI() + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + +} + +extension SRSearchResultCell { + + private func sr_setupUI() { + contentView.addSubview(bgImageView) + contentView.addSubview(coverImageView) + contentView.addSubview(titleLabel) + contentView.addSubview(categoryLabel) + contentView.addSubview(desLabel) + contentView.addSubview(playImageView) + playImageView.addSubview(playLabel) + + bgImageView.snp.makeConstraints { make in + make.edges.equalToSuperview() + } + + coverImageView.snp.makeConstraints { make in + make.left.equalToSuperview().offset(10) + make.centerY.equalToSuperview() + make.width.equalTo(126) + make.height.equalTo(168) + } + + titleLabel.snp.makeConstraints { make in + make.top.equalTo(coverImageView).offset(17) + make.left.equalTo(coverImageView.snp.right).offset(10) + make.right.lessThanOrEqualToSuperview().offset(-13) + } + + categoryLabel.snp.makeConstraints { make in + make.left.equalTo(titleLabel) + make.top.equalTo(titleLabel.snp.bottom).offset(12) + } + + desLabel.snp.makeConstraints { make in + make.left.equalTo(titleLabel) + make.top.equalTo(titleLabel.snp.bottom).offset(43) + make.right.lessThanOrEqualToSuperview().offset(-12) + } + + playImageView.snp.makeConstraints { make in + make.left.equalTo(titleLabel) + make.bottom.equalTo(coverImageView) + } + + playLabel.snp.makeConstraints { make in + make.left.equalToSuperview().offset(45) + make.top.equalToSuperview().offset(9) + } + } + +} diff --git a/SynthReel/Class/Home/V/SRSearchResultView.swift b/SynthReel/Class/Home/V/SRSearchResultView.swift new file mode 100644 index 0000000..b53cbf7 --- /dev/null +++ b/SynthReel/Class/Home/V/SRSearchResultView.swift @@ -0,0 +1,111 @@ +// +// SRSearchResultView.swift +// SynthReel +// +// Created by 湖北秦九 on 2025/11/18. +// Copyright © 2025 SR. All rights reserved. +// + +import UIKit +import SnapKit +import YYCategories + +class SRSearchResultView: UIView { + + weak var viewModel: SRSearchViewModel? + + lazy var dataArr: [SRShortModel] = [] + + lazy var titleLabel: UILabel = { + let label = SRLabel() + label.font = .font(ofSize: 15, weight: .semibold) + label.textColors = [UIColor._7_AF_4_E_0.cgColor, UIColor.white.cgColor, UIColor._7_AF_4_E_0.cgColor] + label.textStartPoint = .init(x: 0, y: 0.5) + label.textEndPoint = .init(x: 1, y: 0.5) + label.text = "Search Results".localized + return label + }() + + lazy var collectionViewLayout: UICollectionViewFlowLayout = { + let layout = UICollectionViewFlowLayout() + layout.itemSize = .init(width: UIScreen.width - 30, height: 192) + layout.minimumLineSpacing = 10 + return layout + }() + + lazy var collectionView: SRCollectionView = { + let collectionView = SRCollectionView(frame: .zero, collectionViewLayout: collectionViewLayout) + collectionView.delegate = self + collectionView.dataSource = self + collectionView.keyboardDismissMode = .onDrag + collectionView.showsVerticalScrollIndicator = false + collectionView.contentInset = .init(top: 0, left: 0, bottom: UIScreen.safeBottom + 10, right: 0) + collectionView.register(SRSearchResultCell.self, forCellWithReuseIdentifier: "cell") + return collectionView + }() + + override init(frame: CGRect) { + super.init(frame: frame) + + sr_setupUI() + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + func search(_ text: String) { + self.dataArr.removeAll() + self.collectionView.reloadData() + + Task { + if let arr = await SRHomeApi.requestSearch(text) { + self.dataArr = arr + self.collectionView.reloadData() + } + } + + } +} + +extension SRSearchResultView { + + private func sr_setupUI() { + addSubview(titleLabel) + addSubview(collectionView) + + titleLabel.snp.makeConstraints { make in + make.left.equalToSuperview().offset(15) + make.top.equalToSuperview().offset(30) + } + + collectionView.snp.makeConstraints { make in + make.left.right.equalToSuperview() + make.bottom.equalToSuperview() + make.top.equalToSuperview().offset(59) + } + } + +} + +//MARK: UICollectionViewDelegate UICollectionViewDataSource +extension SRSearchResultView: UICollectionViewDelegate, UICollectionViewDataSource { + + func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { + let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath) as! SRSearchResultCell + cell.model = dataArr[indexPath.row] + return cell + } + + func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { + return dataArr.count + } + + func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { + let model = dataArr[indexPath.row] + let vc = SRDetailPlayerViewController() + vc.shortId = model.short_play_id + self.viewController?.navigationController?.pushViewController(vc, animated: true) + } + +} diff --git a/SynthReel/Class/Home/V/SRSearchTextView.swift b/SynthReel/Class/Home/V/SRSearchTextView.swift new file mode 100644 index 0000000..c85262d --- /dev/null +++ b/SynthReel/Class/Home/V/SRSearchTextView.swift @@ -0,0 +1,125 @@ +// +// SRSearchTextView.swift +// SynthReel +// +// Created by 湖北秦九 on 2025/11/18. +// Copyright © 2025 SR. All rights reserved. +// + +import UIKit +import SnapKit + +class SRSearchTextView: UIView { + + var didSearch: ((_ text: String) -> Void)? + + var text: String? { + get { + return textField.text + } + set { + textField.text = newValue + } + } + + lazy var bgImageView = UIImageView(image: UIImage(named: "search_text_bg_image")) + + lazy var button: UIButton = { + var configuration = UIButton.Configuration.plain() + configuration.background.cornerRadius = 0 + configuration.background.image = UIImage(named: "search_text_button") + configuration.contentInsets = .init(top: 0, leading: 10, bottom: 0, trailing: 10) + configuration.attributedTitle = AttributedString("Search".localized, attributes: AttributeContainer([ + .font : UIFont.font(ofSize: 14, weight: .medium), + .foregroundColor : UIColor._010101 + ])) + let button = UIButton(configuration: configuration, primaryAction: UIAction(handler: { [weak self] _ in + guard let self = self else { return } + self.handleSearch() + })) + button.setContentHuggingPriority(.required, for: .horizontal) + button.setContentCompressionResistancePriority(.required, for: .horizontal) + return button + }() + + lazy var textField: UITextField = { + let textField = UITextField(frame: .zero) + textField.tintColor = UIColor.white.withAlphaComponent(0.5) + textField.delegate = self + textField.returnKeyType = .search + textField.font = .font(ofSize: 12, weight: .medium) + textField.textColor = .white + textField.attributedPlaceholder = NSAttributedString(string: "search_placeholder_text".localized, attributes: [ + .font : UIFont.font(ofSize: 12, weight: .medium), + .foregroundColor : UIColor.white.withAlphaComponent(0.3) + ]) + return textField + }() + + override init(frame: CGRect) { + super.init(frame: frame) + + sr_setupUI() + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + @discardableResult + override func becomeFirstResponder() -> Bool { + super.becomeFirstResponder() + return self.textField.becomeFirstResponder() + } + + @discardableResult + override func resignFirstResponder() -> Bool { + super.resignFirstResponder() + return self.textField.resignFirstResponder() + } + + private func handleSearch() { + if let text = textField.text { + self.didSearch?(text) + } + } + +} + + +extension SRSearchTextView { + + private func sr_setupUI() { + addSubview(bgImageView) + addSubview(button) + addSubview(textField) + + bgImageView.snp.makeConstraints { make in + make.top.bottom.left.equalToSuperview() + make.right.equalToSuperview().offset(-8) + make.height.equalTo(40) + } + + button.snp.makeConstraints { make in + make.top.bottom.equalToSuperview() + make.right.equalToSuperview() + } + + textField.snp.makeConstraints { make in + make.top.bottom.equalToSuperview() + make.left.equalToSuperview().offset(14) + make.right.equalTo(button.snp.left).offset(-15) + } + } + +} + +//MARK: UITextFieldDelegate +extension SRSearchTextView: UITextFieldDelegate { + + func textFieldShouldReturn(_ textField: UITextField) -> Bool { + handleSearch() + return true + } + +} diff --git a/SynthReel/Class/Home/VC/SRHomeChildViewController.swift b/SynthReel/Class/Home/VC/SRHomeChildViewController.swift new file mode 100644 index 0000000..6641a92 --- /dev/null +++ b/SynthReel/Class/Home/VC/SRHomeChildViewController.swift @@ -0,0 +1,143 @@ +// +// SRHomeChildViewController.swift +// SynthReel +// +// Created by 湖北秦九 on 2025/11/14. +// Copyright © 2025 SR. All rights reserved. +// + +import UIKit +import SnapKit + +class SRHomeChildViewController: SRViewController { + + var categoryId: String? + + var dataArr: [SRShortModel] = [] + var page = 1 + + lazy var bgImageView = UIImageView(image: UIImage(named: "home_list_bg_image")) + + lazy var collectionViewLayout: UICollectionViewFlowLayout = { + let itemWidth = floor((UIScreen.width - 30 - 26 - 10) / 2) + let itemHeight = 206.0 / 155.0 * itemWidth + + let layout = UICollectionViewFlowLayout() + layout.minimumInteritemSpacing = 10 + layout.minimumLineSpacing = 10 + layout.itemSize = .init(width: itemWidth, height: itemHeight) + layout.sectionInset = .init(top: 0, left: 13 + 15, bottom: 0, right: 13 + 15) + return layout + }() + + lazy var collectionView: SRCollectionView = { + let collectionView = SRCollectionView(frame: .zero, collectionViewLayout: collectionViewLayout) + collectionView.delegate = self + collectionView.dataSource = self + collectionView.showsVerticalScrollIndicator = false + collectionView.showsHorizontalScrollIndicator = false + collectionView.register(UINib(nibName: "SRHomeChildCell", bundle: nil), forCellWithReuseIdentifier: "cell") + collectionView.sr_addRefreshFooter { [weak self] in + self?.handleFooterRefresh(nil) + } + return collectionView + }() + + override func viewDidLoad() { + super.viewDidLoad() + self.view.backgroundColor = .clear + self.backgroundImageView.isHidden = true + + sr_setupUI() + + Task { + await requestDataArr(page: self.page) + } + } + + + override func listScrollView() -> UIScrollView { + return collectionView + } + + + override func handleHeaderRefresh(_ completer: (() -> Void)?) { + Task { + await self.requestDataArr(page: 1) + completer?() + } + } + + override func handleFooterRefresh(_ completer: (() -> Void)?) { + Task { + await self.requestDataArr(page: self.page + 1) + self.collectionView.sr_endFooterRefreshing() + completer?() + } + } + +} + +extension SRHomeChildViewController { + + private func sr_setupUI() { + view.addSubview(bgImageView) + view.addSubview(collectionView) + + bgImageView.snp.makeConstraints { make in + make.top.equalToSuperview().offset(20) + make.left.equalToSuperview().offset(15) + make.centerX.equalToSuperview() + make.bottom.equalToSuperview().offset(-15) + } + + collectionView.snp.makeConstraints { make in + make.left.right.equalToSuperview() + make.top.equalTo(bgImageView).offset(30) + make.bottom.equalTo(bgImageView).offset(-27) + } + } + +} + +//MARK: UICollectionViewDelegate UICollectionViewDataSource +extension SRHomeChildViewController: UICollectionViewDelegate, UICollectionViewDataSource { + func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { + let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath) as! SRHomeChildCell + cell.model = self.dataArr[indexPath.row] + return cell + } + + func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { + return self.dataArr.count + } + + func scrollViewDidScroll(_ scrollView: UIScrollView) { + self.didScrollCallback?(scrollView) + } + + func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { + let model = dataArr[indexPath.row] + + let vc = SRDetailPlayerViewController() + vc.shortId = model.short_play_id + self.navigationController?.pushViewController(vc, animated: true) + } +} + +extension SRHomeChildViewController { + + private func requestDataArr(page: Int) async { + guard let id = categoryId else { return } + + if let dataArr = await SRHomeApi.requestCategoryVideoData(id, page: page) { + if page == 1 { + self.dataArr.removeAll() + } + self.dataArr += dataArr + self.page = page + self.collectionView.reloadData() + } + } + +} diff --git a/SynthReel/Class/Home/VC/SRHomeViewController.swift b/SynthReel/Class/Home/VC/SRHomeViewController.swift new file mode 100644 index 0000000..a14df19 --- /dev/null +++ b/SynthReel/Class/Home/VC/SRHomeViewController.swift @@ -0,0 +1,279 @@ +// +// SRHomeViewController.swift +// SynthReel +// +// Created by 湖北秦九 on 2025/11/13. +// Copyright © 2025 SR. All rights reserved. +// + +import UIKit +import SnapKit +import YYCategories +import JXPagingView +import JXSegmentedView + + +extension JXPagingListContainerView: @retroactive JXSegmentedViewListContainer { } + +class SRHomeViewController: SRViewController { + + var viewModel = SRHomeViewModel() + + + lazy var searchButton: UIButton = { + var configuration = UIButton.Configuration.plain() + configuration.image = UIImage(named: "search_icon_01") + configuration.contentInsets = .init(top: 0, leading: 15, bottom: 0, trailing: 15) + + let button = UIButton(configuration: configuration, primaryAction: UIAction(handler: { [weak self] _ in + guard let self = self else { return } + let vc = SRSearchViewController() + self.navigationController?.pushViewController(vc, animated: true) + })) + + return button + }() + + lazy var titleImageView = UIImageView(image: UIImage(named: "home_title_image")) + + lazy var titleLabel: UILabel = { + let label = UILabel() + label.font = .font(ofSize: UIScreen.getRatioWidth(size: 20), weight: .bold).withBoldItalic() + label.textColor = .white + label.text = "Drama Center".localized + return label + }() + + lazy var menuContentView: UIView = { + let view = UIView() + return view + }() + + lazy var moreButton: UIControl = { + let view = UIControl() + return view + }() + + lazy var moreTitleLabel: UILabel = { + let label = UILabel() + label.font = .font(ofSize: 18, weight: .bold) + label.textColor = .white + label.text = "Categories".localized + return label + }() + + lazy var moreIconImageView = UIImageView(image: UIImage(named: "arrow_right_icon_01")) + + lazy var menuDataSource: JXSegmentedTitleGradientDataSource = { + let dataSource = SRHomeMenuDataSource() + dataSource.titleNormalGradientColors = [UIColor.white.cgColor, UIColor._96_E_5_FF.cgColor, UIColor.white.cgColor] + dataSource.titleSelectedGradientColors = [UIColor.white.cgColor, UIColor._96_E_5_FF.cgColor, UIColor.white.cgColor] + dataSource.titleGradientStartPoint = .init(x: 0.5, y: 0) + dataSource.titleGradientEndPoint = .init(x: 0.5, y: 1) + dataSource.titleNormalFont = .font(ofSize: 13, weight: .medium) + dataSource.titleSelectedFont = .font(ofSize: 13, weight: .medium) + dataSource.itemWidth = 100 + dataSource.itemWidthIncrement = 5 + dataSource.titleNumberOfLines = 2 + dataSource.itemSpacing = 5 + return dataSource + }() + + lazy var menuView: JXSegmentedView = { + let view = JXSegmentedView() + view.dataSource = menuDataSource + view.contentEdgeInsetLeft = 15 + view.contentEdgeInsetRight = 15 + return view + }() + + lazy var pageView: JXPagingView = { + let view = JXPagingView(delegate: self) + view.layer.masksToBounds = true + view.mainTableView.backgroundColor = .clear + view.listContainerView.listCellBackgroundColor = .clear + view.mainTableView.gestureDelegate = self + view.automaticallyDisplayListVerticalScrollIndicator = false + view.mainTableView.sr_addRefreshHeader { [weak self] in + self?.handleHeaderRefresh(nil) + } + return view + }() + + lazy var headerView: SRHomeHeaderView = { + let view = SRHomeHeaderView() + view.viewModel = self.viewModel + view.heightDidChange = { [weak self] in + guard let self = self else { return } + self.pageView.resizeTableHeaderViewHeight(animatable: false) + } + return view + }() + + @MainActor + deinit { + srPrint(message: "销毁") + } + + override func viewDidLoad() { + super.viewDidLoad() + sr_setupUI() + + Task { + await requestModuleList() + await requestCategoryList() + } + } + + + override func viewWillAppear(_ animated: Bool) { + super.viewWillAppear(animated) + self.navigationController?.setNavigationBarHidden(true, animated: true) + } + + override func handleHeaderRefresh(_ completer: (() -> Void)?) { + Task { + await requestModuleList() + self.pageView.mainTableView.sr_endHeaderRefreshing() + } + if let vc = self.pageView.listContainerView.validListDict[self.pageView.listContainerView.currentIndex] as? SRViewController { + vc.handleHeaderRefresh(nil) + } + } + +} + +extension SRHomeViewController { + + func sr_setupUI() { + view.addSubview(searchButton) + view.addSubview(titleImageView) + titleImageView.addSubview(titleLabel) + view.addSubview(pageView) + menuContentView.addSubview(menuView) + menuContentView.addSubview(moreButton) + moreButton.addSubview(moreTitleLabel) + moreButton.addSubview(moreIconImageView) + + menuView.listContainer = pageView.listContainerView + + searchButton.snp.makeConstraints { make in + make.height.equalTo(44) + make.right.equalToSuperview() + make.top.equalToSuperview().offset(UIScreen.safeTop) + } + + titleImageView.snp.makeConstraints { make in + make.left.equalToSuperview().offset(15) + make.top.equalToSuperview().offset(UIScreen.safeTop + 12) + make.width.equalTo(UIScreen.getRatioWidth(size: titleImageView.image?.size.width ?? 0)) + make.height.equalTo(UIScreen.getRatioWidth(size: titleImageView.image?.size.height ?? 0)) + } + + titleLabel.snp.makeConstraints { make in + make.left.equalToSuperview().offset(UIScreen.getRatioWidth(size: 15)) + make.centerY.equalTo(titleImageView.snp.top).offset(UIScreen.getRatioWidth(size: 21)) + } + + pageView.snp.makeConstraints { make in + make.left.right.bottom.equalToSuperview() + make.top.equalTo(titleImageView.snp.bottom).offset(0) + } + + menuView.snp.makeConstraints { make in + make.left.right.bottom.equalToSuperview() + make.height.equalTo(40) + } + + moreButton.snp.makeConstraints { make in + make.left.equalToSuperview().offset(15) + make.right.equalToSuperview().offset(-15) + make.height.equalTo(40) + make.top.equalToSuperview() + } + + moreTitleLabel.snp.makeConstraints { make in + make.centerY.equalToSuperview() + make.left.equalToSuperview() + } + + moreIconImageView.snp.makeConstraints { make in + make.centerY.equalToSuperview() + make.right.equalToSuperview() + } + } + +} + +//MARK: JXPagingSmoothViewDataSource +extension SRHomeViewController: JXPagingViewDelegate { + func tableHeaderViewHeight(in pagingView: JXPagingView) -> Int { + return Int(ceil(self.headerView.contentHeight)) + } + + func tableHeaderView(in pagingView: JXPagingView) -> UIView { + return self.headerView + } + + func heightForPinSectionHeader(in pagingView: JXPagingView) -> Int { + return 90 + } + + func viewForPinSectionHeader(in pagingView: JXPagingView) -> UIView { + return self.menuContentView + } + + func numberOfLists(in pagingView: JXPagingView) -> Int { + return self.menuDataSource.titles.count + } + + func pagingView(_ pagingView: JXPagingView, initListAtIndex index: Int) -> any JXPagingViewListViewDelegate { + let vc = SRHomeChildViewController() + vc.categoryId = self.viewModel.categoryArr[index].id + return vc + } + +} + +//MARK: JXPagingMainTableViewGestureDelegate +extension SRHomeViewController: JXPagingMainTableViewGestureDelegate { + func mainTableViewGestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool { + if otherGestureRecognizer == menuView.collectionView.panGestureRecognizer { + return false + } + + if let view = otherGestureRecognizer.view { + var superview: UIView? = view.superview + while superview != nil { + if superview?.isKind(of: SRHomeHeaderView.self) == true { + return false + } + superview = superview?.superview + } + } + + return gestureRecognizer.isKind(of: UIPanGestureRecognizer.self) && otherGestureRecognizer.isKind(of: UIPanGestureRecognizer.self) + } + +} + +extension SRHomeViewController { + + func requestCategoryList() async { + await self.viewModel.requestCategoryList() + + self.menuDataSource.titles = self.viewModel.categoryTitleArr + + self.pageView.reloadData() + self.menuView.reloadData() + } + + func requestModuleList() async { + await self.viewModel.requestModuleList() + + self.headerView.reloadData() + } + + +} + diff --git a/SynthReel/Class/Home/VC/SRSearchViewController.swift b/SynthReel/Class/Home/VC/SRSearchViewController.swift new file mode 100644 index 0000000..cf877cc --- /dev/null +++ b/SynthReel/Class/Home/VC/SRSearchViewController.swift @@ -0,0 +1,113 @@ +// +// SRSearchViewController.swift +// SynthReel +// +// Created by 湖北秦九 on 2025/11/18. +// Copyright © 2025 SR. All rights reserved. +// + +import UIKit +import SnapKit + +class SRSearchViewController: SRViewController { + + lazy var viewModel = SRSearchViewModel() + + lazy var returnButton: UIButton = { + let button = UIButton(type: .custom, primaryAction: UIAction(handler: { [weak self] _ in + guard let self = self else { return } + self.sr_handleNavigationBack() + })) + button.setImage(UIImage(named: "arrow_left_icon_01"), for: .normal) + return button + }() + + lazy var textView: SRSearchTextView = { + let view = SRSearchTextView() + view.didSearch = { [weak self] text in + self?.search(text) + } + return view + }() + + lazy var homeView: SRSearchHomeView = { + let view = SRSearchHomeView() + view.viewModel = self.viewModel + view.didSearch = { [weak self] text in + self?.textView.text = text + self?.search(text) + } + return view + }() + + lazy var resultView: SRSearchResultView = { + let view = SRSearchResultView() + view.viewModel = self.viewModel + return view + }() + + override func viewDidLoad() { + super.viewDidLoad() + + sr_setupUI() + self.resultView.isHidden = true + + Task { + await self.viewModel.requestHotSearchData() + } + } + + override func viewWillAppear(_ animated: Bool) { + super.viewWillAppear(animated) + self.navigationController?.setNavigationBarHidden(true, animated: true) + } + + private func search(_ text: String) { + if text.isEmpty { + homeView.isHidden = false + resultView.isHidden = true + } else { + textView.resignFirstResponder() + homeView.isHidden = true + resultView.isHidden = false + resultView.search(text) + self.viewModel.addSearchRecord(text) + } + + } + +} + +extension SRSearchViewController { + + private func sr_setupUI() { + view.addSubview(returnButton) + view.addSubview(textView) + view.addSubview(homeView) + view.addSubview(resultView) + + + returnButton.snp.makeConstraints { make in + make.width.height.equalTo(44) + make.left.equalToSuperview().offset(10) + make.top.equalToSuperview().offset(UIScreen.safeTop) + } + + textView.snp.makeConstraints { make in + make.left.equalTo(returnButton.snp.right).offset(10) + make.right.equalToSuperview().offset(-15) + make.centerY.equalTo(returnButton) + } + + homeView.snp.makeConstraints { make in + make.left.right.equalToSuperview() + make.bottom.equalToSuperview() + make.top.equalTo(returnButton.snp.bottom) + } + + resultView.snp.makeConstraints { make in + make.edges.equalTo(homeView) + } + } + +} diff --git a/SynthReel/Class/Home/VM/SRHomeMenuDataSource.swift b/SynthReel/Class/Home/VM/SRHomeMenuDataSource.swift new file mode 100644 index 0000000..51bb545 --- /dev/null +++ b/SynthReel/Class/Home/VM/SRHomeMenuDataSource.swift @@ -0,0 +1,36 @@ +// +// SRHomeMenuDataSource.swift +// SynthReel +// +// Created by 湖北秦九 on 2025/11/14. +// Copyright © 2025 SR. All rights reserved. +// + +import UIKit +import JXSegmentedView + + +class SRHomeMenuDataSource: JXSegmentedTitleGradientDataSource { + + nonisolated override init() { + super.init() + } + + + + nonisolated override func registerCellClass(in segmentedView: JXSegmentedView) { + MainActor.assumeIsolated { + segmentedView.collectionView.register(SRHomeMenuCell.self, forCellWithReuseIdentifier: "SRHomeMenuCell") + } + } + + nonisolated override func segmentedView(_ segmentedView: JXSegmentedView, cellForItemAt index: Int) -> JXSegmentedBaseCell { + return MainActor.assumeIsolated { + let cell = segmentedView.dequeueReusableCell(withReuseIdentifier: "SRHomeMenuCell", at: index) + return cell + } + } + + + +} diff --git a/SynthReel/Class/Home/VM/SRHomeViewModel.swift b/SynthReel/Class/Home/VM/SRHomeViewModel.swift new file mode 100644 index 0000000..d96cc6a --- /dev/null +++ b/SynthReel/Class/Home/VM/SRHomeViewModel.swift @@ -0,0 +1,107 @@ +// +// SRHomeViewModel.swift +// SynthReel +// +// Created by 湖北秦九 on 2025/11/14. +// Copyright © 2025 SR. All rights reserved. +// + +import UIKit + +class SRHomeViewModel: NSObject { + + lazy var categoryArr: [SRCategoryModel] = [] + lazy var categoryTitleArr: [String] = [] + + lazy var moduleArr: [SRHomeModuleItem] = [] + + func requestCategoryList() async { + if let list = await SRHomeApi.requestCategoryList() { + self.categoryArr = list + var titles: [String] = [] + self.categoryArr.forEach { + titles.append($0.name ?? "") + } + self.categoryTitleArr = titles + } + } + + func requestModuleList() async { + guard let list = await SRHomeApi.requestHomeModulesData() else { return } + + /* + 第一项 get_details_recommand + popular = home_v3_recommand + updates = week_ranking + Binge-Worthy = week_highest_recommend + Viral Hits = highest_payment_hot_video + Premiere Now = new_recommand + */ + + var bannerItem: SRHomeModuleItem? = nil + var detailsRecommandItem: SRHomeModuleItem? = nil + var popularItem: SRHomeModuleItem? = nil + var updatesItem: SRHomeModuleItem? = nil + var bingeWorthyItem: SRHomeModuleItem? = nil + var viralHitsItem: SRHomeModuleItem? = nil + var premiereNowItem: SRHomeModuleItem? = nil + + + list.forEach { + switch $0.module_key { + case .banner: + bannerItem = $0 + + case .detailsRecommand: + detailsRecommandItem = $0 + + case .popular: + popularItem = $0 + + case .updates: + updatesItem = $0 + + case .bingeWorthy: + bingeWorthyItem = $0 + + case .viralHits: + viralHitsItem = $0 + + case .premiereNow: + premiereNowItem = $0 + + default: + break + } + } + + moduleArr.removeAll() + + if let item = bannerItem { + moduleArr.append(item) + } + if let item = detailsRecommandItem { + moduleArr.append(item) + } + if let item = popularItem { + moduleArr.append(item) + } + if let item = updatesItem { + moduleArr.append(item) + } + if let item = bingeWorthyItem { + moduleArr.append(item) + } + if let item = viralHitsItem { + moduleArr.append(item) + } + if let item = premiereNowItem { + moduleArr.append(item) + } + + + + } + + +} diff --git a/SynthReel/Class/Home/VM/SRSearchViewModel.swift b/SynthReel/Class/Home/VM/SRSearchViewModel.swift new file mode 100644 index 0000000..68b837a --- /dev/null +++ b/SynthReel/Class/Home/VM/SRSearchViewModel.swift @@ -0,0 +1,53 @@ +// +// SRSearchViewModel.swift +// SynthReel +// +// Created by 湖北秦九 on 2025/11/18. +// Copyright © 2025 SR. All rights reserved. +// + +import UIKit + +class SRSearchViewModel: NSObject { + + static let searchRecordUserDefaultKey = "SRSearchViewModel.searchRecordUserDefaultKey" + + @objc dynamic private(set) var recordList: [String] = (UserDefaults.standard.object(forKey: SRSearchViewModel.searchRecordUserDefaultKey) as? [String]) ?? [] + + @objc dynamic private(set) lazy var hotDataArr: [SRShortModel] = [] + + func addSearchRecord(_ text: String) { + guard !text.isEmpty else { return } + var list = recordList + + for (index, value) in list.enumerated() { + if value == text { + list.remove(at: index) + break + } + } + + list.insert(text, at: 0) + + if list.count > 10 { + list.removeLast() + } + recordList = list + + UserDefaults.standard.set(list, forKey: SRSearchViewModel.searchRecordUserDefaultKey) + } + + func clearSearchRecord() { + recordList.removeAll() + UserDefaults.standard.set(recordList, forKey: SRSearchViewModel.searchRecordUserDefaultKey) + } + + ///获取热门搜索 + func requestHotSearchData() async { + if let list = await SRHomeApi.requestHotSearchData(), list.count > 0 { + self.hotDataArr = list + } + } + + +} diff --git a/SynthReel/Class/MyShort/VC/SRMyShortViewController.swift b/SynthReel/Class/MyShort/VC/SRMyShortViewController.swift new file mode 100644 index 0000000..dc560bb --- /dev/null +++ b/SynthReel/Class/MyShort/VC/SRMyShortViewController.swift @@ -0,0 +1,37 @@ +// +// SRMyShortViewController.swift +// SynthReel +// +// Created by 湖北秦九 on 2025/11/20. +// Copyright © 2025 SR. All rights reserved. +// + +import UIKit +import SnapKit + +class SRMyShortViewController: SRViewController { + + override func viewDidLoad() { + super.viewDidLoad() + self.backgroundImageView.image = UIImage(named: "my_short_bg_image") + self.backgroundImageView.contentMode = .scaleAspectFit + + sr_setupUI() + } + + override func viewWillAppear(_ animated: Bool) { + super.viewWillAppear(animated) + self.navigationController?.setNavigationBarHidden(true, animated: true) + } + +} + +extension SRMyShortViewController { + private func sr_setupUI() { + + self.backgroundImageView.snp.remakeConstraints { make in + make.edges.equalToSuperview() + } + } + +} diff --git a/SynthReel/Class/Player/M/SRShortDetailModel.swift b/SynthReel/Class/Player/M/SRShortDetailModel.swift new file mode 100644 index 0000000..25a3606 --- /dev/null +++ b/SynthReel/Class/Player/M/SRShortDetailModel.swift @@ -0,0 +1,20 @@ +// +// SRShortDetailModel.swift +// SynthReel +// +// Created by 湖北秦九 on 2025/11/18. +// Copyright © 2025 SR. All rights reserved. +// + +import UIKit +import SmartCodable + +class SRShortDetailModel: NSObject, SmartCodable { + required override init() { } + + var episodeList: [SRVideoInfoModel]? + var video_info: SRVideoInfoModel? + var shortPlayInfo: SRShortModel? + var is_collect: Bool? + var share_coin: Int? +} diff --git a/SynthReel/Class/Player/M/SRShortModel.swift b/SynthReel/Class/Player/M/SRShortModel.swift new file mode 100644 index 0000000..cc752f3 --- /dev/null +++ b/SynthReel/Class/Player/M/SRShortModel.swift @@ -0,0 +1,58 @@ +// +// SRShortModel.swift +// SynthReel +// +// Created by 湖北秦九 on 2025/11/14. +// Copyright © 2025 SR. All rights reserved. +// + +import UIKit +import SmartCodable + +class SRShortModel: NSObject, SmartCodable { + + required override init() { } + + var id: String? + var sr_description: String? + var name: String? + var watch_total: Int? + var collect_total: Int? + var current_episode: String? + var short_play_video_id: String? + var image_url: String? + var is_collect: Bool? + var episode_total: Int? + var horizontally_img: String? + var category: [String]? + var video_url: String? + var categoryList: [SRCategoryModel]? + var short_play_id: String? + var video_info: SRVideoInfoModel? + + @SmartIgnored + var cellHeight: CGFloat = 0 + + + static func mappingForKey() -> [SmartKeyTransformer]? { + return [ + CodingKeys.sr_description <--- ["description", "short_video_description"], + CodingKeys.name <--- ["short_video_title", "name"] + ] + } +} + +class SRVideoInfoModel: NSObject, SmartCodable { + required override init() { } + + var episode: String? + var short_play_id: String? + var coins: Int? + var video_url: String? + ///是否锁定,购买后解锁 + var is_lock: Bool? + var short_play_video_id: String? + ///播放进度,毫秒 + var play_seconds: Int? + var image_url: String? +} diff --git a/SynthReel/Class/Player/V/SREpSelectorCell.swift b/SynthReel/Class/Player/V/SREpSelectorCell.swift new file mode 100644 index 0000000..cfbec62 --- /dev/null +++ b/SynthReel/Class/Player/V/SREpSelectorCell.swift @@ -0,0 +1,91 @@ +// +// SREpSelectorCell.swift +// SynthReel +// +// Created by 湖北秦九 on 2025/11/19. +// Copyright © 2025 SR. All rights reserved. +// + +import UIKit +import SnapKit + +class SREpSelectorCell: UICollectionViewCell { + + + var model: SRVideoInfoModel? { + didSet { + numLabel.text = model?.episode + } + } + + var sr_isSelected: Bool = false { + didSet { + if sr_isSelected { + numLabel.textColors = [UIColor.srGreen.cgColor, UIColor.srBlue.cgColor] + boderView.isHidden = false + } else { + numLabel.textColors = [UIColor.white.cgColor, UIColor.white.cgColor] + boderView.isHidden = true + } + } + } + + lazy var numLabel: SRLabel = { + let label = SRLabel() + label.font = .font(ofSize: 14, weight: .regular) + label.textStartPoint = .init(x: 0.5, y: 0) + label.textEndPoint = .init(x: 0.5, y: 1) + return label + }() + + lazy var boderView: SRGradientView = { + let view = SRGradientView() + view.colors = [UIColor.srGreen.cgColor, UIColor.srBlue.cgColor] + view.startPoint = .init(x: 0.5, y: 0) + view.endPoint = .init(x: 0.5, y: 1) + view.layer.cornerRadius = 10 + view.layer.masksToBounds = true + return view + }() + + lazy var boderLayer: CAShapeLayer = { + let layer = CAShapeLayer() + return layer + }() + + override init(frame: CGRect) { + super.init(frame: frame) + contentView.layer.cornerRadius = 10 + contentView.layer.masksToBounds = true + contentView.backgroundColor = ._1_B_1_B_1_B + boderLayer.fillColor = contentView.backgroundColor?.cgColor // 设置为透明填充,实现镂空效果 + + + contentView.addSubview(boderView) + boderView.layer.addSublayer(boderLayer) + contentView.addSubview(numLabel) + + numLabel.snp.makeConstraints { make in + make.center.equalToSuperview() + } + + boderView.snp.makeConstraints { make in + make.edges.equalToSuperview() + } + + } + + + override func layoutSubviews() { + super.layoutSubviews() + let size = self.bounds.size + let boderWidth: CGFloat = 1 + + boderLayer.path = UIBezierPath(roundedRect: .init(x: boderWidth, y: boderWidth, width: size.width - boderWidth * 2, height: size.height - boderWidth * 2), cornerRadius: 9.5).cgPath + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + +} diff --git a/SynthReel/Class/Player/V/SREpSelectorView.swift b/SynthReel/Class/Player/V/SREpSelectorView.swift new file mode 100644 index 0000000..64aab68 --- /dev/null +++ b/SynthReel/Class/Player/V/SREpSelectorView.swift @@ -0,0 +1,197 @@ +// +// SREpSelectorView.swift +// SynthReel +// +// Created by 湖北秦九 on 2025/11/18. +// Copyright © 2025 SR. All rights reserved. +// + +import UIKit +import HWPanModal +import SnapKit + +class SREpSelectorView: SRPanModalContentView { + + var didSelected: ((_ index: Int) -> Void)? + + var model: SRShortDetailModel? { + didSet { + coverImageView.sr_setImage(model?.shortPlayInfo?.image_url) + shortNameLabel.text = model?.shortPlayInfo?.name + desLabel.text = model?.shortPlayInfo?.sr_description + + subtitleLabel.text = "all_episodes_text".localizedReplace(text: "\(model?.shortPlayInfo?.episode_total ?? 0)") + + if let text = model?.shortPlayInfo?.category?.first, text.count > 0 { + cagetoryLabel.text = "#" + text + } else { + cagetoryLabel.text = "" + } + self.collectionView.reloadData() + } + } + var selectedIndex: Int = 0 { + didSet { + self.collectionView.reloadData() + } + } + + lazy var coverBgView = UIImageView(image: UIImage(named: "ep_cover_bg_image")) + lazy var coverImageView: UIImageView = { + let imageView = SRImageView() + imageView.layer.cornerRadius = 2 + return imageView + }() + + lazy var shortNameLabel: UILabel = { + let label = UILabel() + label.font = .font(ofSize: 15, weight: .semibold) + label.textColor = .srBlue + return label + }() + + lazy var cagetoryLabel: SRLabel = { + let label = SRLabel() + label.font = .font(ofSize: 12, weight: .regular) + label.textColors = [UIColor.srGreen.cgColor, UIColor.srBlue.cgColor] + label.textStartPoint = .init(x: 0.5, y: 0) + label.textEndPoint = .init(x: 0.5, y: 1) + return label + }() + + lazy var desLabel: UILabel = { + let label = UILabel() + label.font = .font(ofSize: 12, weight: .regular) + label.textColor = .A_6_A_6_A_6 + label.numberOfLines = 3 + return label + }() + + lazy var titleLabel: UILabel = { + let label = UILabel() + label.font = .font(ofSize: 15, weight: .medium) + label.textColor = .white + label.text = "Select Episode".localized + return label + }() + + lazy var subtitleLabel: UILabel = { + let label = UILabel() + label.font = .font(ofSize: 12, weight: .regular) + label.textColor = .CCCCCC + return label + }() + + lazy var collectionViewLayout: UICollectionViewFlowLayout = { + let itemWidth = (UIScreen.width - 30 - 40) / 5 + + let layout = UICollectionViewFlowLayout() + layout.minimumLineSpacing = 10 + layout.minimumInteritemSpacing = 10 + layout.sectionInset = .init(top: 0, left: 15, bottom: 0, right: 15) + layout.itemSize = .init(width: floor(itemWidth), height: 50) + return layout + }() + + lazy var collectionView: SRCollectionView = { + let collectionView = SRCollectionView(frame: .zero, collectionViewLayout: collectionViewLayout) + collectionView.delegate = self + collectionView.dataSource = self + collectionView.showsVerticalScrollIndicator = false + collectionView.contentInset = .init(top: 0, left: 0, bottom: UIScreen.safeBottom + 10, right: 0) + collectionView.register(SREpSelectorCell.self, forCellWithReuseIdentifier: "cell") + return collectionView + }() + + override init(frame: CGRect) { + super.init(frame: frame) + + sr_setupUI() + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + +} + + +extension SREpSelectorView { + + private func sr_setupUI() { + addSubview(coverBgView) + addSubview(coverImageView) + addSubview(shortNameLabel) + addSubview(cagetoryLabel) + addSubview(desLabel) + addSubview(titleLabel) + addSubview(subtitleLabel) + addSubview(collectionView) + + coverBgView.snp.makeConstraints { make in + make.left.equalToSuperview().offset(15) + make.top.equalToSuperview().offset(18) + } + + coverImageView.snp.makeConstraints { make in + make.center.equalTo(coverBgView) + make.width.equalTo(63) + make.height.equalTo(84) + } + + shortNameLabel.snp.makeConstraints { make in + make.left.equalTo(coverImageView.snp.right).offset(10) + make.top.equalToSuperview().offset(24) + make.right.lessThanOrEqualToSuperview().offset(-15) + } + + cagetoryLabel.snp.makeConstraints { make in + make.left.equalTo(shortNameLabel) + make.top.equalTo(shortNameLabel.snp.bottom).offset(8) + } + + desLabel.snp.makeConstraints { make in + make.left.equalTo(shortNameLabel) + make.right.lessThanOrEqualToSuperview().offset(-15) + make.top.equalTo(shortNameLabel.snp.bottom).offset(32) + } + + titleLabel.snp.makeConstraints { make in + make.left.equalToSuperview().offset(15) + make.top.equalTo(coverBgView.snp.bottom).offset(16) + } + + subtitleLabel.snp.makeConstraints { make in + make.centerY.equalTo(titleLabel) + make.left.equalTo(titleLabel.snp.right).offset(3) + } + + collectionView.snp.makeConstraints { make in + make.left.right.equalToSuperview() + make.top.equalToSuperview().offset(166) + make.bottom.equalToSuperview() + } + } + +} + +//MARK: UICollectionViewDelegate UICollectionViewDataSource +extension SREpSelectorView: UICollectionViewDelegate, UICollectionViewDataSource { + func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { + let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath) as! SREpSelectorCell + cell.model = self.model?.episodeList?[indexPath.row] + cell.sr_isSelected = indexPath.row == self.selectedIndex + return cell + } + + func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { + return self.model?.episodeList?.count ?? 0 + } + + func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { + self.didSelected?(indexPath.row) + Task { + await self.dismiss(animated: true) + } + } +} diff --git a/SynthReel/Class/Player/V/SRProgressView.swift b/SynthReel/Class/Player/V/SRProgressView.swift new file mode 100644 index 0000000..6e9976b --- /dev/null +++ b/SynthReel/Class/Player/V/SRProgressView.swift @@ -0,0 +1,216 @@ +// +// SRProgressView.swift +// SynthReel +// +// Created by 湖北秦九 on 2025/11/18. +// Copyright © 2025 SR. All rights reserved. +// + +import UIKit +import YYText +import YYCategories + +class SRProgressView: UIView { + + ///滑动开始 + var panStart: (() -> Void)? + + ///滑动中 + var panChange: ((_ progress: CGFloat) -> Void)? + + ///滑动完成回调 + var panFinish: ((_ progress: CGFloat) -> Void)? + + var progress: CGFloat = 0 { + didSet { + if !isPaning { + setNeedsDisplay() + } + } + } + + ///用来记录滑动时的当前进度 + private var tempProgress: CGFloat = 0 + + ///滑动进度 + private var panProgress: CGFloat = 0 + + var progressColor = UIColor.white.withAlphaComponent(0.2) + var currentProgress = UIColor.white + + var lineWidth: CGFloat = 3 + + ///加载中状态 + var isLoading = false { + didSet { + if isLoading { + if gradientTimer == nil { + gradientTimer = Timer.scheduledTimer(timeInterval: 0.05, target: YYTextWeakProxy(target: self), selector: #selector(handleGradientTimer), userInfo: nil, repeats: true) + } + } else { + gradientTimer?.invalidate() + gradientTimer = nil + } + } + } + + var insets: UIEdgeInsets = .init(top: 0, left: 0, bottom: 0, right: 0) { + didSet { + self.invalidateIntrinsicContentSize() + setNeedsDisplay() + } + } + + private(set) lazy var panGesture: UIPanGestureRecognizer = { + let pan = UIPanGestureRecognizer(target: self, action: #selector(handlePanGesture(sender:))) + return pan + }() + + private(set) lazy var tagGesture: UITapGestureRecognizer = { + let tap = UITapGestureRecognizer(target: self, action: #selector(handleTapGesture(sender:))) + return tap + }() + + ///是否在滑动中 + private var isPaning: Bool = false + + private var gradientTimer: Timer? + + private var gradientValue: CGFloat = 0 + + override var intrinsicContentSize: CGSize { + return .init(width: UIScreen.width, height: lineWidth + insets.top + insets.bottom) + } + + override init(frame: CGRect) { + super.init(frame: frame) +// self.backgroundColor = progressColor + self.backgroundColor = .clear + + self.addGestureRecognizer(panGesture) + self.addGestureRecognizer(tagGesture) + + + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + + override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) { + super.traitCollectionDidChange(previousTraitCollection) + setNeedsDisplay() + } + + @objc private func handleGradientTimer() { + gradientValue += 0.1 + if gradientValue > 1 { + gradientValue = 0 + } + setNeedsDisplay() + } + + override func draw(_ rect: CGRect) { + super.draw(rect) + guard let context = UIGraphicsGetCurrentContext() else { return } + let width = rect.width + + let progressX = insets.left + let progressY = insets.top + let progressWidth = width - insets.left - insets.right + + if isLoading, !isPaning { + // 定义颜色空间 + let colorSpace = CGColorSpaceCreateDeviceRGB() + let colors: [CGColor] = [ + UIColor.clear.cgColor, + UIColor.white.cgColor, + UIColor.clear.cgColor + ] + let locations: [CGFloat] = [0.0, gradientValue, 1.0] + + guard let gradient = CGGradient(colorsSpace: colorSpace, colors: colors as CFArray, locations: locations) else { + return + } + + let gradientRect = CGRect(x: progressX, + y: progressY, + width: progressWidth, + height: lineWidth) + + // 定义渐变的起点和终点 + let startPoint = CGPoint(x: rect.minX, y: rect.minY) + let endPoint = CGPoint(x: rect.maxX, y: rect.maxY) + + // 裁剪到渐变区域 + context.saveGState() + context.clip(to: gradientRect) + + // 绘制渐变 + context.drawLinearGradient(gradient, start: startPoint, end: endPoint, options: []) + } else { + var progress = self.progress + if self.isPaning { + progress = self.panProgress + } + let currentProgressWidth = progressWidth * progress + + ///绘制进度 + let progressPath = UIBezierPath(roundedRect: CGRect(x: progressX, y: progressY, width: progressWidth, height: lineWidth), cornerRadius: lineWidth / 2) + context.addPath(progressPath.cgPath) + context.setFillColor(progressColor.cgColor) + context.fillPath() + + ///绘制当前进度 + let currentPath = UIBezierPath(roundedRect: CGRect(x: progressX, y: progressY, width: progressWidth * progress, height: lineWidth), cornerRadius: lineWidth / 2) + context.addPath(currentPath.cgPath) + context.setFillColor(currentProgress.cgColor) + context.fillPath() + + ///绘制一个点 + let path = UIBezierPath(arcCenter: .init(x: currentProgressWidth + progressX, y: progressY + lineWidth / 2), radius: 3, startAngle: 0, endAngle: CGFloat.pi * 2, clockwise: true) + context.addPath(path.cgPath) + context.setFillColor(currentProgress.cgColor) + context.fillPath() + } + + + } + +} + +extension SRProgressView { + @objc func handlePanGesture(sender: UIPanGestureRecognizer) { + + switch sender.state { + case .began: + self.isPaning = true + self.tempProgress = self.progress + sender.setTranslation(CGPoint(x: 0, y: 0), in: self) + self.panStart?() + + case .changed: + let point = sender.translation(in: self) + let offsetX = point.x / (self.width - self.insets.left - self.insets.right) + self.panProgress = self.tempProgress + offsetX + if self.panProgress < 0 { + self.panProgress = 0 + } + self.panChange?(self.panProgress) + setNeedsDisplay() + + default: + self.isPaning = false + self.panFinish?(self.panProgress) + + self.panProgress = 0 + } + } + + @objc func handleTapGesture(sender: UITapGestureRecognizer) { + let point = sender.location(in: self) + let offsetX = (point.x - self.insets.left) / (self.width - self.insets.left - self.insets.right) + self.panFinish?(offsetX) + } +} diff --git a/SynthReel/Class/Player/V/SRRecommendPlayerCell.swift b/SynthReel/Class/Player/V/SRRecommendPlayerCell.swift new file mode 100644 index 0000000..3b77847 --- /dev/null +++ b/SynthReel/Class/Player/V/SRRecommendPlayerCell.swift @@ -0,0 +1,26 @@ +// +// SRRecommendPlayerCell.swift +// SynthReel +// +// Created by 湖北秦九 on 2025/11/20. +// Copyright © 2025 SR. All rights reserved. +// + +import UIKit +import JXPlayer + +class SRRecommendPlayerCell: JXPlayerListCell { + + override var ControlViewClass: JXPlayerListControlView.Type { + return SRRecommendPlayerControlView.self + } + + override var model: Any? { + didSet { + let model = self.model as? SRShortModel + let videoInfo = model?.video_info + self.player.setPlayUrl(url: videoInfo?.video_url ?? "") + self.player.coverImageView?.sr_setImage(model?.image_url) + } + } +} diff --git a/SynthReel/Class/Player/V/SRRecommendPlayerControlView.swift b/SynthReel/Class/Player/V/SRRecommendPlayerControlView.swift new file mode 100644 index 0000000..3eec91e --- /dev/null +++ b/SynthReel/Class/Player/V/SRRecommendPlayerControlView.swift @@ -0,0 +1,226 @@ +// +// SRRecommendPlayerControlView.swift +// SynthReel +// +// Created by 湖北秦九 on 2025/11/20. +// Copyright © 2025 SR. All rights reserved. +// + +import UIKit +import JXPlayer +import SnapKit +import YYCategories + +class SRRecommendPlayerControlView: JXPlayerListControlView { + + override var viewModel: JXPlayerListViewModel? { + didSet { + self.viewModel?.addObserver(self, forKeyPath: "isPlaying", context: nil) + } + } + + override var model: Any? { + didSet { + let model = model as! SRShortModel + + shortNameLabel.text = model.name + + stackView.sr_removeAllArrangedSubview() + if let text = model.category?.first, text.count > 0 { + categoryLabel.text = "#" + text + stackView.addArrangedSubview(categoryLabel) + } + + if let text = model.sr_description, text.count > 0 { + desLabel.text = text + stackView.addArrangedSubview(desLabel) + } + + } + } + + override var isCurrent: Bool { + didSet { + updatePlayerViewStatus() + } + } + + lazy var controlerView: UIImageView = { + let imageView = UIImageView(image: UIImage(named: "short_progress_bg_image")) + imageView.isUserInteractionEnabled = true + return imageView + }() + + lazy var shortNameLabel: UILabel = { + let label = UILabel() + label.font = .font(ofSize: 14, weight: .semibold) + label.textColor = .srBlue + return label + }() + + lazy var stackView: UIStackView = { + let view = UIStackView() + view.axis = .vertical + view.spacing = 8 + return view + }() + + lazy var categoryLabel: SRLabel = { + let label = SRLabel() + label.font = .font(ofSize: 11, weight: .regular) + label.textColors = [UIColor.srGreen.cgColor, UIColor.srBlue.cgColor] + label.textStartPoint = .init(x: 0.5, y: 0) + label.textEndPoint = .init(x: 0.5, y: 1) + return label + }() + + lazy var desLabel: UILabel = { + let label = UILabel() + label.font = .font(ofSize: 11, weight: .regular) + label.textColor = .A_6_A_6_A_6 + label.numberOfLines = 2 + return label + }() + + lazy var epBgView: UIView = { + let view = SRGradientView() + view.colors = [UIColor._51_D_4_FF.withAlphaComponent(0.5).cgColor, UIColor._4_CFFD_4.withAlphaComponent(0.1).cgColor] + view.startPoint = .init(x: 0, y: 0.5) + view.endPoint = .init(x: 1, y: 0.5) + view.layer.cornerRadius = 2 + view.layer.masksToBounds = true + let tap = UITapGestureRecognizer { [weak self] _ in + guard let self = self else { return } + let vc = SRDetailPlayerViewController() + vc.shortId = (self.model as? SRShortModel)?.short_play_id + self.viewController?.navigationController?.pushViewController(vc, animated: true) + } + view.addGestureRecognizer(tap) + return view + }() + + lazy var epIconImageView: UIImageView = { + let imageView = UIImageView(image: UIImage(named: "ep_icon_02")) + imageView.setContentHuggingPriority(.required, for: .horizontal) + imageView.setContentCompressionResistancePriority(.required, for: .horizontal) + return imageView + }() + + lazy var epTextLabel: UILabel = { + let label = UILabel() + label.font = .font(ofSize: 12, weight: .regular) + label.textColor = .white + label.text = "recommend_ep_text".localized + return label + }() + + lazy var indicatorImageView: UIImageView = { + let imageView = UIImageView(image: UIImage(named: "arrow_right_icon_02")) + imageView.setContentHuggingPriority(.required, for: .horizontal) + imageView.setContentCompressionResistancePriority(.required, for: .horizontal) + return imageView + }() + + lazy var playerImageView: UIImageView = { + let imageView = UIImageView(image: UIImage(named: "play_icon_02")) + imageView.isHidden = true + return imageView + }() + + deinit { + self.viewModel?.removeObserver(self, forKeyPath: "isPlaying") + } + + override init(frame: CGRect) { + super.init(frame: frame) + sr_setupUI() + + let tap = UITapGestureRecognizer { [weak self] _ in + guard let self = self else { return } + self.viewModel?.userSwitchPlayAndPause() + } + self.addGestureRecognizer(tap) + } + + @MainActor required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) { + if keyPath == "isPlaying" { + updatePlayerViewStatus() + } + } + + + func updatePlayerViewStatus() { + if self.viewModel?.isPlaying == true || !isCurrent { + playerImageView.isHidden = true + } else { + playerImageView.isHidden = false + } + + } + +} + +extension SRRecommendPlayerControlView { + + private func sr_setupUI() { + addSubview(controlerView) + controlerView.addSubview(shortNameLabel) + controlerView.addSubview(stackView) + controlerView.addSubview(epBgView) + epBgView.addSubview(epIconImageView) + epBgView.addSubview(epTextLabel) + epBgView.addSubview(indicatorImageView) + addSubview(playerImageView) + + controlerView.snp.makeConstraints { make in + make.left.equalToSuperview().offset(15) + make.centerX.equalToSuperview() + make.bottom.equalToSuperview().offset(-10) + } + + shortNameLabel.snp.makeConstraints { make in + make.left.equalToSuperview().offset(12) + make.right.lessThanOrEqualToSuperview().offset(-12) + make.top.equalToSuperview().offset(13) + } + + stackView.snp.makeConstraints { make in + make.left.equalToSuperview().offset(12) + make.right.lessThanOrEqualToSuperview().offset(-12) + make.top.equalTo(shortNameLabel.snp.bottom).offset(8) + make.bottom.equalToSuperview().offset(-52) + } + + epBgView.snp.makeConstraints { make in + make.left.equalToSuperview().offset(12) + make.right.equalToSuperview().offset(-12) + make.bottom.equalToSuperview().offset(-18) + make.height.equalTo(26) + } + + epIconImageView.snp.makeConstraints { make in + make.centerY.equalToSuperview() + make.left.equalToSuperview().offset(8) + } + + epTextLabel.snp.makeConstraints { make in + make.centerY.equalToSuperview() + make.left.equalTo(epIconImageView.snp.right).offset(4) + make.right.lessThanOrEqualTo(self.indicatorImageView.snp.left).offset(-5) + } + + indicatorImageView.snp.makeConstraints { make in + make.centerY.equalToSuperview() + make.right.equalToSuperview().offset(-12) + } + + playerImageView.snp.makeConstraints { make in + make.center.equalToSuperview() + } + } + +} diff --git a/SynthReel/Class/Player/V/SRShortDetailControlView.swift b/SynthReel/Class/Player/V/SRShortDetailControlView.swift new file mode 100644 index 0000000..febdfb7 --- /dev/null +++ b/SynthReel/Class/Player/V/SRShortDetailControlView.swift @@ -0,0 +1,239 @@ +// +// SRShortDetailControlView.swift +// SynthReel +// +// Created by 湖北秦九 on 2025/11/18. +// Copyright © 2025 SR. All rights reserved. +// + +import UIKit +import JXPlayer +import SnapKit + +class SRShortDetailControlView: JXPlayerListControlView { + + var sr_viewModel: SRShortPlayerViewModel? { + return self.viewModel as? SRShortPlayerViewModel + } + + override var viewModel: JXPlayerListViewModel? { + didSet { + self.viewModel?.addObserver(self, forKeyPath: "isPlaying", context: nil) + } + } + + var shortModel: SRShortModel? { + didSet { + titleLabel.text = shortModel?.name + collectButton.isSelected = shortModel?.is_collect == true + } + } + + override var durationTime: TimeInterval { + didSet { + updateProgress() + let (_, m, s) = Int(durationTime).formatTimeGroup() + totalTimeLabel.text = "\(m):\(s)" + } + } + + override var currentTime: TimeInterval { + didSet { + updateProgress() + let (_, m, s) = Int(currentTime).formatTimeGroup() + currentTimeLabel.text = "\(m):\(s)" + } + } + + override var isLoading: Bool { + didSet { + progressView.isLoading = isLoading + } + } + + lazy var progressBgView: UIImageView = { + let imageView = UIImageView(image: UIImage(named: "short_progress_bg_image")) + imageView.isUserInteractionEnabled = true + return imageView + }() + + lazy var titleLabel: UILabel = { + let label = UILabel() + label.font = .font(ofSize: 14, weight: .medium) + label.textColor = .srBlue + return label + }() + + lazy var progressView: SRProgressView = { + let view = SRProgressView() + view.insets = .init(top: 10, left: 5, bottom: 10, right: 5) + view.panFinish = { [weak self] progress in + guard let self = self else { return } + self.viewModel?.seekTo(Float(progress)) + } + return view + }() + + lazy var totalTimeLabel: UILabel = { + let label = UILabel() + label.font = .font(ofSize: 10, weight: .regular) + label.textColor = .DFDFDF + label.text = "00:00" + return label + }() + + lazy var currentTimeLabel: UILabel = { + let label = UILabel() + label.font = .font(ofSize: 10, weight: .regular) + label.textColor = .DFDFDF + label.text = "00:00" + return label + }() + + lazy var epButton: UIButton = { + let button = UIButton(type: .custom, primaryAction: UIAction(handler: { [weak self] _ in + guard let self = self else { return } + self.sr_viewModel?.onEpSelectorView() + })) + button.setImage(UIImage(named: "ep_icon_01"), for: .normal) + return button + }() + + lazy var collectButton: UIButton = { + let button = UIButton(type: .custom, primaryAction: UIAction(handler: { [weak self] _ in + guard let self = self else { return } + guard let shortId = self.shortModel?.short_play_id else { return } + let videoId = (self.model as? SRVideoInfoModel)?.short_play_video_id + let isCollect = !(self.shortModel?.is_collect ?? false) + + Task { + await SRShortApi.requestShortCollect(shortId: shortId, videoId: videoId, isCollect: isCollect) + } + })) + button.setImage(UIImage(named: "collect_icon_01"), for: .normal) + button.setImage(UIImage(named: "collect_icon_01_selected"), for: .selected) + button.setImage(UIImage(named: "collect_icon_01_selected"), for: [.selected, .highlighted]) + return button + }() + + lazy var playerImageView: UIImageView = { + let imageView = UIImageView(image: UIImage(named: "play_icon_02")) + imageView.isHidden = true + return imageView + }() + + deinit { + self.viewModel?.removeObserver(self, forKeyPath: "isPlaying") + NotificationCenter.default.removeObserver(self) + } + + override init(frame: CGRect) { + super.init(frame: frame) + NotificationCenter.default.addObserver(self, selector: #selector(updateShortCollectStateNotification), name: SRShortApi.updateShortCollectStateNotification, object: nil) + + let tap = UITapGestureRecognizer { [weak self] _ in + guard let self = self else { return } + self.viewModel?.userSwitchPlayAndPause() + } + self.addGestureRecognizer(tap) + + sr_setupUI() + } + + @MainActor required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + @objc private func updateShortCollectStateNotification(sender: Notification) { + guard let userInfo = sender.userInfo else { return } + guard let shortId = userInfo["id"] as? String else { return } + guard let state = userInfo["state"] as? Bool else { return } + guard shortId == self.shortModel?.short_play_id else { return } + self.shortModel?.is_collect = state + + collectButton.isSelected = state + } + + private func updateProgress() { + guard durationTime > 0 else { + progressView.progress = 0 + return + } + progressView.progress = currentTime / durationTime + } + + override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) { + if keyPath == "isPlaying" { + updatePlayerViewStatus() + } + } + + + func updatePlayerViewStatus() { + if self.viewModel?.isPlaying == true || !isCurrent { + playerImageView.isHidden = true + } else { + playerImageView.isHidden = false + } + + } + +} + +extension SRShortDetailControlView { + + private func sr_setupUI() { + addSubview(progressBgView) + progressBgView.addSubview(titleLabel) + progressBgView.addSubview(progressView) + progressBgView.addSubview(totalTimeLabel) + progressBgView.addSubview(currentTimeLabel) + addSubview(epButton) + addSubview(collectButton) + addSubview(playerImageView) + + progressBgView.snp.makeConstraints { make in + make.left.equalToSuperview().offset(15) + make.centerX.equalToSuperview() + make.bottom.equalToSuperview().offset(-(UIScreen.safeBottom + 5)) + make.height.equalTo(88) + } + + titleLabel.snp.makeConstraints { make in + make.centerY.equalTo(progressBgView.snp.top).offset(23) + make.left.equalToSuperview().offset(9) + make.right.lessThanOrEqualToSuperview().offset(-9) + } + + progressView.snp.makeConstraints { make in + make.left.equalToSuperview().offset(4) + make.right.equalToSuperview().offset(-6) + make.bottom.equalToSuperview().offset(-30) + } + + totalTimeLabel.snp.makeConstraints { make in + make.right.equalToSuperview().offset(-11) + make.bottom.equalToSuperview().offset(-24) + } + + currentTimeLabel.snp.makeConstraints { make in + make.left.equalToSuperview().offset(9) + make.bottom.equalToSuperview().offset(-24) + } + + epButton.snp.makeConstraints { make in + make.right.equalToSuperview().offset(-15) + make.bottom.equalTo(progressBgView.snp.top).offset(-44) + } + + collectButton.snp.makeConstraints { make in + make.centerX.equalTo(epButton) + make.bottom.equalTo(epButton.snp.top).offset(-25) + } + + playerImageView.snp.makeConstraints { make in + make.center.equalToSuperview() + } + } + +} diff --git a/SynthReel/Class/Player/V/SRShortDetailPlayerCell.swift b/SynthReel/Class/Player/V/SRShortDetailPlayerCell.swift new file mode 100644 index 0000000..60e93f7 --- /dev/null +++ b/SynthReel/Class/Player/V/SRShortDetailPlayerCell.swift @@ -0,0 +1,43 @@ +// +// SRShortDetailPlayerCell.swift +// SynthReel +// +// Created by 湖北秦九 on 2025/11/18. +// Copyright © 2025 SR. All rights reserved. +// + +import UIKit +import JXPlayer + +class SRShortDetailPlayerCell: JXPlayerListCell { + + override var ControlViewClass: JXPlayerListControlView.Type { + return SRShortDetailControlView.self + } + + var sr_controlView: SRShortDetailControlView { + return self.controlView as! SRShortDetailControlView + } + + var sr_viewModel: SRShortPlayerViewModel? { + return self.viewModel as? SRShortPlayerViewModel + } + + override var model: Any? { + didSet { + let model = self.model as? SRVideoInfoModel + self.player.setPlayUrl(url: model?.video_url ?? "") + +// self.lockView.isHidden = !(model?.is_lock ?? true) +// lockView.videoInfo = model + } + } + + var shortModel: SRShortModel? { + didSet { + self.sr_controlView.shortModel = shortModel + self.player.coverImageView?.sr_setImage(shortModel?.image_url) + } + } + +} diff --git a/SynthReel/Class/Player/VC/SRDetailPlayerViewController.swift b/SynthReel/Class/Player/VC/SRDetailPlayerViewController.swift new file mode 100644 index 0000000..73a3a20 --- /dev/null +++ b/SynthReel/Class/Player/VC/SRDetailPlayerViewController.swift @@ -0,0 +1,107 @@ +// +// SRDetailPlayerViewController.swift +// SynthReel +// +// Created by 湖北秦九 on 2025/11/17. +// Copyright © 2025 SR. All rights reserved. +// + +import UIKit +import JXPlayer +import SnapKit + +class SRDetailPlayerViewController: JXPlayerListViewController { + + var shortId: String? { + set { + sr_viewModel.shortId = newValue ?? "0" + } + get { + return sr_viewModel.shortId + } + } + + + override var ViewModelClass: JXPlayerListViewModel.Type { + return SRShortPlayerViewModel.self + } + + var sr_viewModel: SRShortPlayerViewModel { + return self.viewModel as! SRShortPlayerViewModel + } + + lazy var returnButton: UIButton = { + let button = UIButton(type: .custom, primaryAction: UIAction(handler: { [weak self] _ in + guard let self = self else { return } + self.sr_handleNavigationBack() + })) + button.setImage(UIImage(named: "arrow_left_icon_01"), for: .normal) + return button + }() + + deinit { + srPrint(message: "销毁") + } + + override func viewDidLoad() { + super.viewDidLoad() + self.view.backgroundColor = .black + self.register(SRShortDetailPlayerCell.self, forCellWithReuseIdentifier: "SRShortDetailPlayerCell") + self.delegate = self + self.dataSource = self + + sr_setupUI() + + Task { + await self.sr_viewModel.requestShortDetail() + } + } + + override func play() { + let videoInfo = self.viewModel.currentCell?.model as? SRVideoInfoModel + super.play() + + Task { + await SRShortApi.requestCreatePlayHistory(shortId: videoInfo?.short_play_id, videoId: videoInfo?.short_play_video_id) + } + } + +} + +extension SRDetailPlayerViewController { + + private func sr_setupUI() { + view.addSubview(returnButton) + + returnButton.snp.makeConstraints { make in + make.height.equalTo(44) + make.width.equalTo(44) + make.left.equalToSuperview().offset(10) + make.top.equalToSuperview().offset(UIScreen.safeTop) + } + } +} + +//MARK: JXPlayerListViewControllerDelegate JXPlayerListViewControllerDataSource +extension SRDetailPlayerViewController: JXPlayerListViewControllerDelegate, JXPlayerListViewControllerDataSource { + func jx_playerListViewController(_ viewController: JXPlayerListViewController, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { + let cell = self.dequeueReusableCell(withReuseIdentifier: "SRShortDetailPlayerCell", for: indexPath) as! SRShortDetailPlayerCell + cell.model = self.sr_viewModel.dataArr[indexPath.section].episodeList?[indexPath.row] + cell.shortModel = self.sr_viewModel.dataArr[indexPath.section].shortPlayInfo + return cell + } + + func jx_playerListViewController(_ viewController: JXPlayerListViewController, numberOfItemsInSection section: Int) -> Int { + return self.sr_viewModel.dataArr[section].episodeList?.count ?? 0 + } + + func jx_numberOfSections(in viewController: JXPlayerListViewController) -> Int { + return self.sr_viewModel.dataArr.count + } + + func jx_playerListViewController(_ viewController: JXPlayerListViewController, didChangeIndexPathForVisible indexPath: IndexPath) { + if let view = self.sr_viewModel.popView as? SREpSelectorView { + view.selectedIndex = indexPath.row + } + } +} diff --git a/SynthReel/Class/Player/VC/SRRecommendPlayerViewController.swift b/SynthReel/Class/Player/VC/SRRecommendPlayerViewController.swift new file mode 100644 index 0000000..475e8fe --- /dev/null +++ b/SynthReel/Class/Player/VC/SRRecommendPlayerViewController.swift @@ -0,0 +1,61 @@ +// +// SRRecommendPlayerViewController.swift +// SynthReel +// +// Created by 湖北秦九 on 2025/11/20. +// Copyright © 2025 SR. All rights reserved. +// + +import UIKit +import JXPlayer + +class SRRecommendPlayerViewController: JXPlayerListViewController { + + + override var ViewModelClass: JXPlayerListViewModel.Type { + return SRRecommendPlayerViewModel.self + } + + override var contentSize: CGSize { + return .init(width: UIScreen.width, height: UIScreen.height - UIScreen.tabBarHeight) + } + + var sr_viewModel: SRRecommendPlayerViewModel { + return self.viewModel as! SRRecommendPlayerViewModel + } + + override func viewDidLoad() { + super.viewDidLoad() + self.register(SRRecommendPlayerCell.self, forCellWithReuseIdentifier: "SRRecommendPlayerCell") + + self.delegate = self + self.dataSource = self + + Task { + await self.sr_viewModel.requestRecommendList(page: 1) + } + } + + override func viewWillAppear(_ animated: Bool) { + super.viewWillAppear(animated) + self.navigationController?.setNavigationBarHidden(true, animated: true) + } + + +} + +//MARK: JXPlayerListViewControllerDelegate JXPlayerListViewControllerDataSource +extension SRRecommendPlayerViewController: JXPlayerListViewControllerDelegate, JXPlayerListViewControllerDataSource { + func jx_playerListViewController(_ viewController: JXPlayerListViewController, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { + let cell = self.dequeueReusableCell(withReuseIdentifier: "SRRecommendPlayerCell", for: indexPath) as! SRRecommendPlayerCell + cell.model = self.sr_viewModel.dataArr[indexPath.row] + return cell + } + + func jx_playerListViewController(_ viewController: JXPlayerListViewController, numberOfItemsInSection section: Int) -> Int { + return self.sr_viewModel.dataArr.count + } + + + +} diff --git a/SynthReel/Class/Player/VM/SRRecommendPlayerViewModel.swift b/SynthReel/Class/Player/VM/SRRecommendPlayerViewModel.swift new file mode 100644 index 0000000..3a1f449 --- /dev/null +++ b/SynthReel/Class/Player/VM/SRRecommendPlayerViewModel.swift @@ -0,0 +1,54 @@ +// +// SRRecommendPlayerViewModel.swift +// SynthReel +// +// Created by 湖北秦九 on 2025/11/20. +// Copyright © 2025 SR. All rights reserved. +// + +import UIKit +import JXPlayer + +class SRRecommendPlayerViewModel: JXPlayerListViewModel { + + lazy var dataArr: [SRShortModel] = [] + + nonisolated required init() { + super.init() + } + + + private func addDataArr(dataArr: [SRShortModel]) { + guard dataArr.count > 0 else { return } + + var indexPaths: [IndexPath] = [] + var startRow = self.dataArr.count + + dataArr.forEach { _ in + indexPaths.append(IndexPath(row: startRow, section: 0)) + startRow += 1 + } + self.dataArr += dataArr + + CATransaction.setCompletionBlock(nil) + CATransaction.begin() + self.playerListVC?.collectionView.insertItems(at: indexPaths) + CATransaction.commit() + } + + func requestRecommendList(page: Int) async { + guard let dataArr = await SRHomeApi.requestHomeRecommendData(page: page) else { return } + + if page == 1 { + self.playerListVC?.clearData() + self.dataArr = dataArr + self.playerListVC?.reloadData { [weak self] in + + self?.playerListVC?.scrollToItem(indexPath: .init(row: 0, section: 0), animated: false) + } + } else { + self.addDataArr(dataArr: dataArr) + } + + } +} diff --git a/SynthReel/Class/Player/VM/SRShortPlayerViewModel.swift b/SynthReel/Class/Player/VM/SRShortPlayerViewModel.swift new file mode 100644 index 0000000..ff7c3bd --- /dev/null +++ b/SynthReel/Class/Player/VM/SRShortPlayerViewModel.swift @@ -0,0 +1,72 @@ +// +// SRShortPlayerViewModel.swift +// SynthReel +// +// Created by 湖北秦九 on 2025/11/18. +// Copyright © 2025 SR. All rights reserved. +// + +import UIKit +import JXPlayer +import HWPanModal + +class SRShortPlayerViewModel: JXPlayerListViewModel { + + var shortId: String = "0" + + var dataArr: [SRShortDetailModel] = [] + + weak var popView: UIView? + + nonisolated required init() { + super.init() + } + + + func requestShortDetail(indexPath: IndexPath? = nil) async -> Int? { + let (model, code, _) = await SRShortApi.requestShortDetail(shortId) + guard let model = model else { return code } + + self.dataArr.removeAll() + self.dataArr.append(model) + + self.playerListVC?.reloadData { [weak self] in + guard let self = self else { return } + var targetIndexPath = IndexPath(row: 0, section: 0) + + if let indexPath = indexPath, indexPath.row < (model.episodeList?.count ?? 0) { + targetIndexPath = indexPath + } else if let videoInfo = model.video_info { + var row: Int? + model.episodeList?.enumerated().forEach { + if $1.short_play_video_id == videoInfo.short_play_video_id { + row = $0 + } + } + if let row = row { + targetIndexPath = .init(row: row, section: 0) + } + } + + self.playerListVC?.scrollToItem(indexPath: targetIndexPath, animated: false) + } + return code + } +} + + +extension SRShortPlayerViewModel { + + func onEpSelectorView() { + let view = SREpSelectorView() + view.model = self.dataArr[currentIndexPath.section] + view.selectedIndex = self.currentIndexPath.row + view.didSelected = { [weak self] index in + guard let self = self else { return } + self.playerListVC?.scrollToItem(indexPath: IndexPath(row: index, section: currentIndexPath.section), animated: false) + } + view.present(in: nil) + self.popView = view + } + +} diff --git a/SynthReel/Delegate/AppDelegate+Config.swift b/SynthReel/Delegate/AppDelegate+Config.swift new file mode 100644 index 0000000..e85f72c --- /dev/null +++ b/SynthReel/Delegate/AppDelegate+Config.swift @@ -0,0 +1,18 @@ +// +// AppDelegate+Config.swift +// SynthReel +// +// Created by 湖北秦九 on 2025/11/13. +// Copyright © 2025 SR. All rights reserved. +// + +import UIKit + +extension AppDelegate { + + func setConfig() { + SRToast.config() + + } + +} diff --git a/SynthReel/Delegate/AppDelegate.swift b/SynthReel/Delegate/AppDelegate.swift new file mode 100644 index 0000000..17fcdfc --- /dev/null +++ b/SynthReel/Delegate/AppDelegate.swift @@ -0,0 +1,46 @@ +// +// AppDelegate.swift +// SynthReel +// +// Created by 湖北秦九 on 2025/11/12. +// + +import UIKit + +@main +class AppDelegate: UIResponder, UIApplicationDelegate { + + + + func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { + SRTool.appDelegate = self + + SRNetworkReachableManager.manager.startMonitoring() + + self.setConfig() + + + Task { + await SRAccountManager.manager.updateUserInfo() + } + + return true + } + + // MARK: UISceneSession Lifecycle + + func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration { + // Called when a new scene session is being created. + // Use this method to select a configuration to create the new scene with. + return UISceneConfiguration(name: "Default Configuration", sessionRole: connectingSceneSession.role) + } + + func application(_ application: UIApplication, didDiscardSceneSessions sceneSessions: Set) { + // Called when the user discards a scene session. + // If any sessions were discarded while the application was not running, this will be called shortly after application:didFinishLaunchingWithOptions. + // Use this method to release any resources that were specific to the discarded scenes, as they will not return. + } + + +} + diff --git a/SynthReel/Delegate/SceneDelegate.swift b/SynthReel/Delegate/SceneDelegate.swift new file mode 100644 index 0000000..e40e33e --- /dev/null +++ b/SynthReel/Delegate/SceneDelegate.swift @@ -0,0 +1,65 @@ +// +// SceneDelegate.swift +// SynthReel +// +// Created by 湖北秦九 on 2025/11/12. +// + +import UIKit + +class SceneDelegate: UIResponder, UIWindowSceneDelegate { + + var window: UIWindow? + + + func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) { + SRTool.sceneDelegate = self + guard let windowScene = (scene as? UIWindowScene) else { return } + SRTool.windowScene = windowScene + + window = UIWindow(windowScene: windowScene) + + window?.rootViewController = SRTabBarController() + window?.makeKeyAndVisible() + + + + NotificationCenter.default.addObserver(self, selector: #selector(abcd), name: NSNotification.Name(rawValue: "abcd"), object: nil) + } + + @objc private func abcd() { + window?.rootViewController = SRTabBarController() + window?.makeKeyAndVisible() + } + + func sceneDidDisconnect(_ scene: UIScene) { + // Called as the scene is being released by the system. + // This occurs shortly after the scene enters the background, or when its session is discarded. + // Release any resources associated with this scene that can be re-created the next time the scene connects. + // The scene may re-connect later, as its session was not necessarily discarded (see `application:didDiscardSceneSessions` instead). + } + + func sceneDidBecomeActive(_ scene: UIScene) { + // Called when the scene has moved from an inactive state to an active state. + // Use this method to restart any tasks that were paused (or not yet started) when the scene was inactive. + } + + func sceneWillResignActive(_ scene: UIScene) { + // Called when the scene will move from an active state to an inactive state. + // This may occur due to temporary interruptions (ex. an incoming phone call). + } + + func sceneWillEnterForeground(_ scene: UIScene) { + // Called as the scene transitions from the background to the foreground. + // Use this method to undo the changes made on entering the background. + } + + func sceneDidEnterBackground(_ scene: UIScene) { + // Called as the scene transitions from the foreground to the background. + // Use this method to save data, release shared resources, and store enough scene-specific state information + // to restore the scene back to its current state. + } + + +} + diff --git a/SynthReel/Libs/SRAccount/SRAccountManager.swift b/SynthReel/Libs/SRAccount/SRAccountManager.swift new file mode 100644 index 0000000..65cea8d --- /dev/null +++ b/SynthReel/Libs/SRAccount/SRAccountManager.swift @@ -0,0 +1,49 @@ +// +// SRAccountManager.swift +// SynthReel +// +// Created by 湖北秦九 on 2025/11/12. +// Copyright © 2025 SR. All rights reserved. +// + +import UIKit + +class SRAccountManager: NSObject { + + + static let manager = SRAccountManager() + + private(set) var token = UserDefaults.sr_object(forKey: kSRAccountTokenDefaultsKey, as: SRAccountToken.self) + private(set) var userInfo = UserDefaults.sr_object(forKey: kSRUserInfoDefaultsKey, as: SRUserInfo.self) + + + func setAccountToken(_ token: SRAccountToken?) { + self.token = token + UserDefaults.sr_setObject(token, forKey: kSRAccountTokenDefaultsKey) + } + + + ///更新用户信息 + func updateUserInfo() async { +// Task { +// completer?() +// } + if let userInfo = await SRUserApi.requestUserInfo() { + self.userInfo = userInfo + UserDefaults.sr_setObject(userInfo, forKey: kSRUserInfoDefaultsKey) + NotificationCenter.default.post(name: SRAccountManager.userInfoUpdateNotification, object: nil) + } + + + } + +} + + +extension SRAccountManager { + + ///用户信息更新 + @objc static let userInfoUpdateNotification = NSNotification.Name(rawValue: "SRAccountManager.userInfoUpdateNotification") + ///登录状态发生变化 + @objc static let loginStatusChangeNotification = NSNotification.Name(rawValue: "SRAccountManager.loginStatusChangeNotification") +} diff --git a/SynthReel/Libs/SRAccount/SRAccountToken.swift b/SynthReel/Libs/SRAccount/SRAccountToken.swift new file mode 100644 index 0000000..fb2fd0b --- /dev/null +++ b/SynthReel/Libs/SRAccount/SRAccountToken.swift @@ -0,0 +1,42 @@ +// +// SRAccountToken.swift +// SynthReel +// +// Created by 湖北秦九 on 2025/11/12. +// Copyright © 2025 SR. All rights reserved. +// + +import UIKit +import SmartCodable + + +class SRAccountToken: NSObject, SmartCodable, NSSecureCoding { + + required override init() { } + + var auto_login: Int? + var token: String? + var customer_id: String? + + + static var supportsSecureCoding: Bool { + get { + return true + } + } + + func encode(with coder: NSCoder) { + coder.encode(token, forKey: "token") + coder.encode(customer_id, forKey: "customer_id") + coder.encode(auto_login, forKey: "auto_login") + } + + required init?(coder: NSCoder) { + super.init() + + token = coder.decodeObject(of: NSString.self, forKey: "token") as? String + customer_id = coder.decodeObject(of: NSString.self, forKey: "customer_id") as? String + auto_login = coder.decodeObject(of: NSNumber.self, forKey: "auto_login")?.intValue + } + +} diff --git a/SynthReel/Libs/SRAccount/SRUserInfo.swift b/SynthReel/Libs/SRAccount/SRUserInfo.swift new file mode 100644 index 0000000..c14c694 --- /dev/null +++ b/SynthReel/Libs/SRAccount/SRUserInfo.swift @@ -0,0 +1,66 @@ +// +// SRUserInfo.swift +// SynthReel +// +// Created by 湖北秦九 on 2025/11/12. +// Copyright © 2025 SR. All rights reserved. +// + +import UIKit +import SmartCodable + +class SRUserInfo: NSObject, SmartCodable, NSSecureCoding { + + required override init() { } + + var id: String? + var avator: String? + var coin_left_total: Int? + var family_name: String? + var send_coin_left_total: Int? + var vip_end_time: TimeInterval? + var is_vip: Bool? + var customer_id: String? + var is_tourist: Bool? + + func getNickName() -> String { + if let name = family_name, !name.isEmpty { + return name + } else { + return "Visitor" + } + } + + var totalCoins: Int { + return (coin_left_total ?? 0) + (send_coin_left_total ?? 0) + } + + static var supportsSecureCoding: Bool { + return true + } + + func encode(with coder: NSCoder) { + coder.encode(id, forKey: "id") + coder.encode(customer_id, forKey: "customer_id") + coder.encode(is_tourist, forKey: "is_tourist") + coder.encode(avator, forKey: "avator") + coder.encode(family_name, forKey: "family_name") + coder.encode(coin_left_total, forKey: "coin_left_total") + coder.encode(send_coin_left_total, forKey: "send_coin_left_total") + coder.encode(is_vip, forKey: "is_vip") + coder.encode(vip_end_time, forKey: "vip_end_time") + } + + required init?(coder: NSCoder) { + super.init() + id = coder.decodeObject(of: NSString.self, forKey: "id") as? String + customer_id = coder.decodeObject(of: NSString.self, forKey: "customer_id") as? String + is_tourist = coder.decodeObject(of: NSNumber.self, forKey: "is_tourist")?.boolValue + avator = coder.decodeObject(of: NSString.self, forKey: "avator") as? String + family_name = coder.decodeObject(of: NSString.self, forKey: "family_name") as? String + coin_left_total = coder.decodeObject(of: NSNumber.self, forKey: "coin_left_total")?.intValue + send_coin_left_total = coder.decodeObject(of: NSNumber.self, forKey: "send_coin_left_total")?.intValue + is_vip = coder.decodeObject(of: NSNumber.self, forKey: "is_vip")?.boolValue + vip_end_time = coder.decodeObject(of: NSNumber.self, forKey: "vip_end_time")?.doubleValue + } +} diff --git a/SynthReel/Libs/SRDeviceID/SRDeviceId.swift b/SynthReel/Libs/SRDeviceID/SRDeviceId.swift new file mode 100644 index 0000000..76ccd84 --- /dev/null +++ b/SynthReel/Libs/SRDeviceID/SRDeviceId.swift @@ -0,0 +1,27 @@ +// +// SRDeviceId.swift +// SynthReel +// +// Created by 湖北秦九 on 2025/11/12. +// Copyright © 2025 SR. All rights reserved. +// + +import UIKit + +class SRDeviceId { + + static let shared = SRDeviceId() + private let key = "com.synthreel.deviceid" + +// private init() {} + + lazy var id: String = { + if let savedID = SRKeychain.shared.read(key: key) { + return savedID + } else { + let newID = UIDevice.current.identifierForVendor?.uuidString ?? UUID().uuidString + SRKeychain.shared.save(key: key, value: newID) + return newID + } + }() +} diff --git a/SynthReel/Libs/SRDeviceID/SRKeychain.swift b/SynthReel/Libs/SRDeviceID/SRKeychain.swift new file mode 100644 index 0000000..5b95e09 --- /dev/null +++ b/SynthReel/Libs/SRDeviceID/SRKeychain.swift @@ -0,0 +1,59 @@ +// +// SRKeychain.swift +// SynthReel +// +// Created by 湖北秦九 on 2025/11/12. +// Copyright © 2025 SR. All rights reserved. +// + +import UIKit + +class SRKeychain { + static let shared = SRKeychain() + + func save(key: String, value: String) { + if let data = value.data(using: .utf8) { + // 先删除旧的 + let query = [ + kSecClass: kSecClassGenericPassword, + kSecAttrAccount: key + ] as CFDictionary + SecItemDelete(query) + + // 再保存新的 + let attributes = [ + kSecClass: kSecClassGenericPassword, + kSecAttrAccount: key, + kSecValueData: data, + kSecAttrAccessible: kSecAttrAccessibleAfterFirstUnlock + ] as CFDictionary + + SecItemAdd(attributes, nil) + } + } + + func read(key: String) -> String? { + let query = [ + kSecClass: kSecClassGenericPassword, + kSecAttrAccount: key, + kSecReturnData: kCFBooleanTrue!, + kSecMatchLimit: kSecMatchLimitOne + ] as CFDictionary + + var dataTypeRef: AnyObject? + let status = SecItemCopyMatching(query, &dataTypeRef) + + if status == errSecSuccess, let data = dataTypeRef as? Data { + return String(data: data, encoding: .utf8) + } + return nil + } + + func delete(key: String) { + let query = [ + kSecClass: kSecClassGenericPassword, + kSecAttrAccount: key + ] as CFDictionary + SecItemDelete(query) + } +} diff --git a/SynthReel/Libs/SRHud/SRHud.swift b/SynthReel/Libs/SRHud/SRHud.swift new file mode 100644 index 0000000..cd0212c --- /dev/null +++ b/SynthReel/Libs/SRHud/SRHud.swift @@ -0,0 +1,22 @@ +// +// SRHud.swift +// SynthReel +// +// Created by 湖北秦九 on 2025/11/13. +// Copyright © 2025 SR. All rights reserved. +// + +import SVProgressHUD + +struct SRHud { + + static func show(containerView: UIView? = nil, type: SVProgressHUDMaskType = .clear) { + SVProgressHUD.setContainerView(containerView) + SVProgressHUD.setDefaultMaskType(type) + SVProgressHUD.show() + } + + static func dismiss() { + SVProgressHUD.dismiss() + } +} diff --git a/SynthReel/Libs/SRHud/SRToast.swift b/SynthReel/Libs/SRHud/SRToast.swift new file mode 100644 index 0000000..0eaba30 --- /dev/null +++ b/SynthReel/Libs/SRHud/SRToast.swift @@ -0,0 +1,24 @@ +// +// SRToast.swift +// SynthReel +// +// Created by 湖北秦九 on 2025/11/13. +// Copyright © 2025 SR. All rights reserved. +// + + +import Toast + +struct SRToast { + + static func config() { + CSToastManager.setTapToDismissEnabled(false) + CSToastManager.setDefaultDuration(2) + CSToastManager.setDefaultPosition(CSToastPositionCenter) + } + + static func show(text: String?) { + guard let text = text else { return } + SRTool.keyWindow?.makeToast(text) + } +} diff --git a/SynthReel/Libs/Tool/SRTool.swift b/SynthReel/Libs/Tool/SRTool.swift new file mode 100644 index 0000000..fa663ba --- /dev/null +++ b/SynthReel/Libs/Tool/SRTool.swift @@ -0,0 +1,56 @@ +// +// SRTool.swift +// SynthReel +// +// Created by 湖北秦九 on 2025/11/13. +// Copyright © 2025 SR. All rights reserved. +// + +import UIKit + +class SRTool { + + static var appDelegate: AppDelegate? + static var sceneDelegate: SceneDelegate? + + static var windowScene: UIWindowScene? + + + static var keyWindow: UIWindow? { + return windowScene?.keyWindow + } + + static var rootViewController: UIViewController? { + return keyWindow?.rootViewController + } + + ///获得启动图 + static var lanuchViewController: UIViewController? { + let storyboard = UIStoryboard(name: "LaunchScreen", bundle: nil) + let vc = storyboard.instantiateInitialViewController() + return vc + } + + static var topViewController: UIViewController? { + var resultVC: UIViewController? = self.rootViewController + if let rootNav = resultVC as? UINavigationController { + resultVC = rootNav.topViewController + } + + resultVC = self._topViewController(resultVC) + while resultVC?.presentedViewController != nil { + resultVC = self._topViewController(resultVC?.presentedViewController) + } + return resultVC + } + + private static func _topViewController(_ vc: UIViewController?) -> UIViewController? { + if vc is UINavigationController { + return _topViewController((vc as? UINavigationController)?.topViewController) + } else if vc is UITabBarController { + return _topViewController((vc as? UITabBarController)?.selectedViewController) + } else { + return vc + } + } +} diff --git a/SynthReel/Source/Assets.xcassets/AccentColor.colorset/Contents.json b/SynthReel/Source/Assets.xcassets/AccentColor.colorset/Contents.json new file mode 100644 index 0000000..eb87897 --- /dev/null +++ b/SynthReel/Source/Assets.xcassets/AccentColor.colorset/Contents.json @@ -0,0 +1,11 @@ +{ + "colors" : [ + { + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SynthReel/Source/Assets.xcassets/AppIcon.appiconset/Contents.json b/SynthReel/Source/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..2305880 --- /dev/null +++ b/SynthReel/Source/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,35 @@ +{ + "images" : [ + { + "idiom" : "universal", + "platform" : "ios", + "size" : "1024x1024" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "idiom" : "universal", + "platform" : "ios", + "size" : "1024x1024" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "tinted" + } + ], + "idiom" : "universal", + "platform" : "ios", + "size" : "1024x1024" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SynthReel/Source/Assets.xcassets/Color/#010101.colorset/Contents.json b/SynthReel/Source/Assets.xcassets/Color/#010101.colorset/Contents.json new file mode 100644 index 0000000..525bf3d --- /dev/null +++ b/SynthReel/Source/Assets.xcassets/Color/#010101.colorset/Contents.json @@ -0,0 +1,20 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0x01", + "green" : "0x01", + "red" : "0x01" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SynthReel/Source/Assets.xcassets/Color/#051B22.colorset/Contents.json b/SynthReel/Source/Assets.xcassets/Color/#051B22.colorset/Contents.json new file mode 100644 index 0000000..4764841 --- /dev/null +++ b/SynthReel/Source/Assets.xcassets/Color/#051B22.colorset/Contents.json @@ -0,0 +1,20 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0x22", + "green" : "0x1B", + "red" : "0x05" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SynthReel/Source/Assets.xcassets/Color/#1B1B1B.colorset/Contents.json b/SynthReel/Source/Assets.xcassets/Color/#1B1B1B.colorset/Contents.json new file mode 100644 index 0000000..a79bd7e --- /dev/null +++ b/SynthReel/Source/Assets.xcassets/Color/#1B1B1B.colorset/Contents.json @@ -0,0 +1,20 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0x1B", + "green" : "0x1B", + "red" : "0x1B" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SynthReel/Source/Assets.xcassets/Color/#4CFFD4.colorset/Contents.json b/SynthReel/Source/Assets.xcassets/Color/#4CFFD4.colorset/Contents.json new file mode 100644 index 0000000..315f36b --- /dev/null +++ b/SynthReel/Source/Assets.xcassets/Color/#4CFFD4.colorset/Contents.json @@ -0,0 +1,20 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0xD4", + "green" : "0xFF", + "red" : "0x4C" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SynthReel/Source/Assets.xcassets/Color/#51D4FF.colorset/Contents.json b/SynthReel/Source/Assets.xcassets/Color/#51D4FF.colorset/Contents.json new file mode 100644 index 0000000..60347a2 --- /dev/null +++ b/SynthReel/Source/Assets.xcassets/Color/#51D4FF.colorset/Contents.json @@ -0,0 +1,20 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0xFF", + "green" : "0xD4", + "red" : "0x51" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SynthReel/Source/Assets.xcassets/Color/#7AF4E0.colorset/Contents.json b/SynthReel/Source/Assets.xcassets/Color/#7AF4E0.colorset/Contents.json new file mode 100644 index 0000000..cd89fb0 --- /dev/null +++ b/SynthReel/Source/Assets.xcassets/Color/#7AF4E0.colorset/Contents.json @@ -0,0 +1,20 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0xE0", + "green" : "0xF4", + "red" : "0x7A" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SynthReel/Source/Assets.xcassets/Color/#96E5FF.colorset/Contents.json b/SynthReel/Source/Assets.xcassets/Color/#96E5FF.colorset/Contents.json new file mode 100644 index 0000000..49dbcc5 --- /dev/null +++ b/SynthReel/Source/Assets.xcassets/Color/#96E5FF.colorset/Contents.json @@ -0,0 +1,20 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0xFF", + "green" : "0xE5", + "red" : "0x96" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SynthReel/Source/Assets.xcassets/Color/#A6A6A6.colorset/Contents.json b/SynthReel/Source/Assets.xcassets/Color/#A6A6A6.colorset/Contents.json new file mode 100644 index 0000000..fc9f464 --- /dev/null +++ b/SynthReel/Source/Assets.xcassets/Color/#A6A6A6.colorset/Contents.json @@ -0,0 +1,20 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0xA6", + "green" : "0xA6", + "red" : "0xA6" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SynthReel/Source/Assets.xcassets/Color/#CCCCCC.colorset/Contents.json b/SynthReel/Source/Assets.xcassets/Color/#CCCCCC.colorset/Contents.json new file mode 100644 index 0000000..a200dfb --- /dev/null +++ b/SynthReel/Source/Assets.xcassets/Color/#CCCCCC.colorset/Contents.json @@ -0,0 +1,20 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0xCC", + "green" : "0xCC", + "red" : "0xCC" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SynthReel/Source/Assets.xcassets/Color/#DFDFDF.colorset/Contents.json b/SynthReel/Source/Assets.xcassets/Color/#DFDFDF.colorset/Contents.json new file mode 100644 index 0000000..16fcfee --- /dev/null +++ b/SynthReel/Source/Assets.xcassets/Color/#DFDFDF.colorset/Contents.json @@ -0,0 +1,20 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0xDF", + "green" : "0xDF", + "red" : "0xDF" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SynthReel/Source/Assets.xcassets/Color/Contents.json b/SynthReel/Source/Assets.xcassets/Color/Contents.json new file mode 100644 index 0000000..73c0059 --- /dev/null +++ b/SynthReel/Source/Assets.xcassets/Color/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SynthReel/Source/Assets.xcassets/Color/sr_blue.colorset/Contents.json b/SynthReel/Source/Assets.xcassets/Color/sr_blue.colorset/Contents.json new file mode 100644 index 0000000..60347a2 --- /dev/null +++ b/SynthReel/Source/Assets.xcassets/Color/sr_blue.colorset/Contents.json @@ -0,0 +1,20 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0xFF", + "green" : "0xD4", + "red" : "0x51" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SynthReel/Source/Assets.xcassets/Color/sr_green.colorset/Contents.json b/SynthReel/Source/Assets.xcassets/Color/sr_green.colorset/Contents.json new file mode 100644 index 0000000..315f36b --- /dev/null +++ b/SynthReel/Source/Assets.xcassets/Color/sr_green.colorset/Contents.json @@ -0,0 +1,20 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0xD4", + "green" : "0xFF", + "red" : "0x4C" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SynthReel/Source/Assets.xcassets/Contents.json b/SynthReel/Source/Assets.xcassets/Contents.json new file mode 100644 index 0000000..73c0059 --- /dev/null +++ b/SynthReel/Source/Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SynthReel/Source/Assets.xcassets/Image/Contents.json b/SynthReel/Source/Assets.xcassets/Image/Contents.json new file mode 100644 index 0000000..73c0059 --- /dev/null +++ b/SynthReel/Source/Assets.xcassets/Image/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SynthReel/Source/Assets.xcassets/Image/arrow_left_icon_01.imageset/Contents.json b/SynthReel/Source/Assets.xcassets/Image/arrow_left_icon_01.imageset/Contents.json new file mode 100644 index 0000000..50c3586 --- /dev/null +++ b/SynthReel/Source/Assets.xcassets/Image/arrow_left_icon_01.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "返回@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "返回@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SynthReel/Source/Assets.xcassets/Image/arrow_left_icon_01.imageset/返回@2x.png b/SynthReel/Source/Assets.xcassets/Image/arrow_left_icon_01.imageset/返回@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..e1a9ae9132656572603ebe811217f461277c935d GIT binary patch literal 3236 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 literal 0 HcmV?d00001 diff --git a/SynthReel/Source/Assets.xcassets/Image/arrow_right_icon_01.imageset/Contents.json b/SynthReel/Source/Assets.xcassets/Image/arrow_right_icon_01.imageset/Contents.json new file mode 100644 index 0000000..5c4d3b1 --- /dev/null +++ b/SynthReel/Source/Assets.xcassets/Image/arrow_right_icon_01.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Frame@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Frame@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SynthReel/Source/Assets.xcassets/Image/arrow_right_icon_01.imageset/Frame@2x.png b/SynthReel/Source/Assets.xcassets/Image/arrow_right_icon_01.imageset/Frame@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..d714c46f35c500148582edb29bc8e7601f8ae207 GIT binary patch literal 373 zcmV-*0gC>KP)~WoDtHB3vCtdojV#1A9>GFuJwgiYH0une5<#5I1jPBPO%eD=$YdAr zJkR^@0))-dA*Y*rcZ9_@4E8Xp1!066Cjz#R@@YDbVU!q{AxsEa&@x&g#jlu~6Y5Sl zdXkYYi;~dVue%nIvqshia+XLHAZLYC19BEfRUoI0R0ndJNE0CUifp6XUx$8yFB1>y z&vnj(J69L+hKp#Bn*itOM4)R<%Lj literal 0 HcmV?d00001 diff --git a/SynthReel/Source/Assets.xcassets/Image/arrow_right_icon_01.imageset/Frame@3x.png b/SynthReel/Source/Assets.xcassets/Image/arrow_right_icon_01.imageset/Frame@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..0ccf3b2273f64eed6b53c6d18beb4a16fd231cc6 GIT binary patch literal 454 zcmeAS@N?(olHy`uVBq!ia0vp^HXzKw1|+Ti+$;i8oCO|{#S9FJ79h;%I?XTvD9BhG z3v>3C4^ zh4K_>2K5IVGo+U;P-8H)tIoQBK#Kfa z%N-i}=0~?V+s1ysHeY|&b@b^&#h??E1Be>#ttgpD<}gM(>|K=Rdpm#zrO!D}PM9 zeY(m*>i+9BHc`nU!tbj&6}agvVM#yg zR8f$o)54a1+$qAqS*L|%^O2@%gJ7K%TuI=$O41*M8}?@21~| mOGlR(7#=o?I5+*l4xz&{uj$B7n+|jh1B0ilpUXO@geCw%@Iamb literal 0 HcmV?d00001 diff --git a/SynthReel/Source/Assets.xcassets/Image/arrow_right_icon_02.imageset/Frame@3x.png b/SynthReel/Source/Assets.xcassets/Image/arrow_right_icon_02.imageset/Frame@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..9c97adc5b68ad3b40bb4b08c8a08d4245b6b0458 GIT binary patch literal 223 zcmeAS@N?(olHy`uVBq!ia0vp^av;pX1|+Qw)-3{3oCO|{#S9FJ79h;%I?XTvD9BhG zZL8#isfp6>`ONPun0P+sW8{v4 zhi4z2zCM>P_0;;}{#!R+t9@TD)-{XM_3WYxGp@Ebo{rmfVD7xvYqhR&zIyXSO2O|y QKhS;#Pgg&ebxsLQ0JzIhDF6Tf literal 0 HcmV?d00001 diff --git a/SynthReel/Source/Assets.xcassets/Image/background_image_01.imageset/Contents.json b/SynthReel/Source/Assets.xcassets/Image/background_image_01.imageset/Contents.json new file mode 100644 index 0000000..36577cc --- /dev/null +++ b/SynthReel/Source/Assets.xcassets/Image/background_image_01.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "bg@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "bg@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SynthReel/Source/Assets.xcassets/Image/background_image_01.imageset/bg@2x.png b/SynthReel/Source/Assets.xcassets/Image/background_image_01.imageset/bg@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..c577f57d4c84f68389bade299f965140262e07fe GIT binary patch literal 342529 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
Miauj1gW~>S1fm_Xsg;= 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

WXgMN_)UNMJb;>zC##Ut#BHL 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%0DFg!5AcAIzop;&$oMX zn~SCyb|YBd`2CXg8?#V<`0q`GVvETdx5#LzQ{){`=*yowzYo1o9yO+iof!Jn2`$eh zlA?L@6w?=hMY1!n3mMt&Q#7smp!+_6>0d_NO}}y$>FV{D32ekWn7%6d!*%~%0Dk`X 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

Ky62QKwcXp9 z^_X$!J>AqprPKRqN}*?cWc{k=V!cvj;<{%LY@hPu7c{;(dT!hR{3jOn^!Bma6glo~ z{+F-ZrrX_hB*vdA9{i-ltyRQk@YO!ODtbSG6MbG79x|{h%v()tRG)!aY2#0TStJ7I zp$8TuNdzf9?6a*Dz*c=>+O6IP`Z5OJ80|~s(z9^>r{um zmddjnO0wjPXBu2TA1@zM0whVb*wIqYD^y$_wE69i@c$o@-;)E3*-+mPypRdT2SED* z6WW%ec>BD4A7+w^uHq9si7?RM+m=fIMjtuH>~BeLDI=DinB~m;tH?z@forlSnl(#I zb2<)G>QilM^w1V-4ECS;$g;j>SMN8U8g&(1old_H0oy^Ze!xGK;h7L%xkpAw$tbpHGkp! z?~Vz~Z2W#`<8)UdK`fP(-KK1y7tNFBqn$d~E`&wo+d#U?2HT`mzajvV81$}k>R^u4 zPn%oV<4%uW@@7sjcNK zd=Pc|tmhOLGv2*_Z3hxgqwjXJ&DOhK^eOurGK%hL4}%eGx1WuA>c9W{@XEA(Br z^A+eFazoU$Hy}%;N4e_5+(za=F5AnTWym)B0BZsOe<}YD@_ag9WnzB(o7+I;r}JFp zW1a79u}!7U*v`71g=BvRs!ucEU1y)@{ONJ(tJSDXYHb8$Q)5i3lr+-L*>`*~1}izb z*{J@@zx`+98RA0V6Z63|XxoV^kx5zFlCbT!`)#7jWx4GV+-3iLXfsGi3rhzbaL|ic zDH#mG>mME16HE`Je16wiqsbYjh?tH`@huz>Nu;>+F=ptl-$}P3@B8?4bYOjQENWxP zzIfjTf$~O%fyV-xr}Ky3r*n{Hv!_80duN}g-%el1u9QKZo)XCOZ-5tr9gz{7W>gn> zErEPtKRhg1jVJ0zowul!Eqpw}7I%Eq57ahe4N@Z)j?y zs*_|7MTh;aIC=f!>y559DZyzi$;lTtiP26n+zvpf_uRAY{lYUtOwHpcWP}~*8h{1x zEpNJA4~A`eQjMi!%yYya$^+st8Nl6IzKXtbJ(o!lvPmJo7TP9Kc<>N*g6|dsxA19t zP*_|i!5{PF?f30E`;mU3Ej*p#{9++#~3B4u9?t_fv zbJaWhf2WD^C!O_}UZ}Pl+GEA3-OqaXth>JpwErmod%10U*Du>xL?nC{zen&bvSU5M zX-QmyPQi4zW(PioG8`T$wLHfavmOzzsTMQBwWutTj!XcgwQB9N)alpI%oI2z+gC56 zI^0&Ac#`aRA*063Qmx;sBVlAY-u|qVp^Oea^$zAvUo+*Y-;?p8+&kxJxi=g%dC%FQ zwLFO)YE>5Bc7j`5HvS&(r{YdM6-P z09!xTb>4lA`Ubqr!5S`^NjI*$J>b7y57K0EO4~GAfLwNhw@zqp;!-};H}QE-oDutY()Le#(rf9Lvt|VNp~)1spju?w^1sv>bi`&ZKj!}u!{>u}s(qRK;dgGAsYg0w`ESb9-(Tl{I^LDn zDgXO--sS3>;{>$F-`46GKiDrZ_^ti~Qd-*U2zAf@R5xOkxbG(ISGAw(U;gFar5)cY z;JU8kH4c{LoXh~`Bdy_>jQ3BC*a{E5w{1Y2s zp0<8`qsy}lpGWNsPE*F(7ShgSZ(HAdXzN{YV0z_ha^8vG1B`p;O09pL}M*(x1bjo(zx%bp5}~r z+57&gJ83BCjQczOs4s*85Z!4BfX(!z+D9mvbwu=I0OIE--wjYtTSH1yLk#GsF78~o z_65tiK=ae_Ps{)EUH(6v`*iL9&;RpvJ~%#1^`88H&3BT&IX>q9Kct7U|BU?4^iFlN z5Et0n`k4Rav(5Zz|3^F-u*%w1Mrtr94C!akU~lU8onAzm0F*GlX|K~c-6rY$OvVtr zPlm!tWZ>;x+kbLQdOMXtl8{52oIm&aZ(6ZI2gFza5j{KjbpG2UaVqx}jn+@6x+hyK zpj$uRru+5?_0g!hg5aIM*_OVskm`efg@4Bw!ZQwaNf_`^-o9oax%|N-F_;N}^QuR8 zeV}iFWESm-)S0u;i>;YQ%(NCT>NB-LwfKlZDUvfE<)4KU@vvT>C5hc_00Qk<->$wU zIjFR^zLHjp?<&0|d0YS8Z5iOuLE~%h^=ECf_W{QR=;J1E&Wbc%{y^M?j_H9&2DTb> ztmqa48oAI9xcjxV7{oDfpni+~S*XEhlXVYZs?CpFMqlO<@v!Mk2&ic3%UlAp-f*hU zUk*@wEX`e-@oIp=5mp# z%LBM?!gL@cGkiEYx7C@M>G~FITN{*m|ES)_qa^n8@s94Fc5b1?iHl@GvixIu!?_hS zb6G^{(wb#dLJZb|uIBAF{Q!_p;2!6`Nd{jXr#@`wH$4q{Rt6%C<~x4h27?YlRzur4 zigm~1Y_2ZdyQK90viC2FuH&fIFbb}{|MS}4i+4B`OTb_VIhm_2y{lVP&6UKK5Fn6- zuxyJg3*%3H5SQFR$eP{Awv(6t_OhuN0{8KWQ;|q!=2K>IkUN1|5Nrns4mSWZ7Ztd! z1D^%&9GhyHTmoE*8E~AHq=41z2DCP`XflBP^s!;Ss|Z%W++4hLzTp#1_^{<3X=R{Z z_C+%fu=}e{$Fa>xsxMm;Tj_f+gT_AVX}hs93O=vjKQHf`DM#o!P_E$0#HuxCe_6Ee zpdL!3j1Y3Mc$ofELH-N6F1OT}|K@QH`^+C}D()Bm8gImn8<-`|-L}@!8RNX>LL~YT z#wBdO^sC$Hm0Os!8&OQ;3G|hs?fl;ZyZ!t>^__jyo#!rFz_v8?zo_?-z8Q4oneWf% z|MjXi>+%GiziFS_&8$6IKG?zaUA^_?dQtY?R`sXCqOnL(Q+G+x12jN#N z0Mc$_D7*mViqx!_U-mc1de?R}Gn-N;e|7u3Ww_u8AwC38TZSLLF!L#Cn<=YLQ=&C1 zily9^{uCWta5&I%b_2l41m=Fzbw8?J9e)S)ZZ&~{A9wVcO>PI*Ebl&-hJ(t{p>d{C}I4aey3&_F8tce5wD48daC0C!1 z!d0H~tON43JWzp#c>9Rkbaw6l!B=b>@%X~G ztHv1d79wsSy%Ak~QVYo8^0}IxK`(uy8N=R6eKV!Zmq{h~6}*C>(<@a1goMl*Q9HKo z%x96K-P}g18oGziLHwIYfcO$)4)jzcjT$|dPpom9T6UxZd_U&TtDlWYaR>{R5rg+V z2=TO^0nEqtlgw=2%Yyrc*~#x+$KM_bl7^rAc;+V&z=yp>{N_{e-YFxDHSQ3Gqln~{ zgUbPrENxxal3inAQ2V&j~ToSD+G2Tt3K;_=U>zxdrq_qq#j}X~$??GS6K*&;%2T%Fa2h$g0ip(nmO$!la_iGf_#{56ip= zFfNnRgN&u$CfcYOw;TW?NL>J32a&Gb1$;MyBU1hK02W>lkkU)LJG~VA2z5p9?6qxWBDhd7D$_24oWB&cC$5?HnT)WXw|(UP%6=p+ zmlgFZuud6jIrqQJ=+-yv4G`+Kn-&z`q7Yzm0N z4=zAt0;d{tGTU=Lc1KIuD)c`3GH5I9Hgp18t7`{W8G`pH6VIsk`Y@?`BW`Y8fT#Cw z`l{hxdyIdB?IcpCvm6q05oJ&|h6?WwOMefYCZm|dooB>l&KbT4x}O>(AkSMTmu~{= zaAwt>?EJ;~$&Ab z@3C&)h}%jbHVkwzc#Nl}aJXg57Y{=OvcCfq$s1G|h`hhYer?p*Iy+3ign6WlQKbtk z#~oYeot*#E*B8(W{ZZ$CXvZ?Palwpx&Tm0ZMOYS^OCNN%}>!Ir+vp`d#OLKQ5sM3SAdW z9tN6q;GC+&c%?A^7a275bWpzak$KL6b@=8SbBb(2ew`;~Y-hPL0~;CuDj7PH#r5g} zCWHWv59mIqJ_1Tzw@o;0GqBkM$;YU(5C8+P>Q>au12fSJFv=OM=w>i6dYKm@Ca{HK zd5}5mC13-QIR5^-cp)Q1J~>dIlm(Dt;0ws@ax^PQ8gL8fG+P4=^m?MlMG@BLJ{JNW z=!rDP*e))b(8n7&anXbA=3phoAH2@fLghZ5g=;-3Q^qPRD^jqE(qy25YFSih zC)gNNL0>Nulb{MZNxFRn>OLsCB!2!iZ_TI-X^$x1IpL@%!LrdzgYO*>)slXgYVtczg~inVZ`MX{L6$8U~YgU&d@m! ze&29v#it=Dq1hixCKbk6AA`J3IgaC+LU#MM>#%6t$Y_}`*6<V2Z{+dytvzatOKM3+ygWkNR*8Z*bo%kP7L z<7jJ^8G&<}p@Qi0-U7ksuX=D6x-5X)HvW6|1In>1L`oC&>Pu@=Y8Mo$I^!5GkXtIBA_w_2%+KSikEc@R%4LxNO}Kx0f*}%1VoPkSi`twg(DuO_;y6{%I1Vj^ zf8?Wb{olC0JI3+f{(t}9PpwrZz)O=Eujrps(bD z*0Bj4|Ut>1HinTM*zz8r0V8vmB_&$68hfoun#uv0$|4j116fD0oDsOgQt_D z@kuU+;Ke~sv75qT3wbv3*TD!beWD!F3 z?dQkMyS~k|i_vJO?3qUz8QnUDrF8KG8NYeay@hv68!x< z`lnXWr)~z5JL%11|E`TW*<7Gw((inI0XKCp^7VUK^4M_x@8A9;76D&*f6o2%V*!-q zWZFhI3--6c?{vxuSH&p6k!1m)Z*Tb>_BB{*+c(JZ*E>+}>iSV+<-@Y+zRX>{j6K;7`WlY!p_@GzE(5+9 zm-C0aw>14JIQK!}2VaIdf^F!Lb;74f^W*L-Zz8=al z->yGe@X*+?INJmLsy&|gDNO2p|II;Jdi{`WcZ|z-eyZz0f#CE>ca+;`;Ls0sM5F)> z!8Rq|vbfZzPaHHetF~`*<%H$%7g{hU?S3HLx4G+Q2j(5mj2D%7gk!Or#x|RA8F#qM zIF_<&d_w=VOm%LJn1gz8LyRq&Fz%NVF_@d>RQ-yFMw{brUR?-abj1st z*uv#mc00~u8i7*{>Q7eJvKjNeD{K`n zU3%B|4EZe0VBMha%ypUP#ceqk4<&XLk|Q|&!9vUT%`5Qtg&>c;;pee9fcUp+o6uZS z9;JsR+~k1Wf&Fbax9xm;F2s_&)?oC@@%o#;R4M<(Qi~pr5X8qJS$S(_M)^38JAeNC zFJA%7j=#rwcmAgc;MeDWK^*z9{C@tIAJaPjZ_fSV{J+d^9|e-F9#4z8)h5X;6Dh+|1P5A#Eun+x-Zv!>g+NJhOBWtw#5<<3f7 z=Df`U<98e|9>^7c0<60LLK(UYLdg_yyPG!ga(w6@`*ur5J;=Xn=To^S>&3*}W$vUI zFlg{y0!232@r{i3M;93dv^YOrXV>;{Q1xToC)V+Hx4!s6k7~o_DiYbG3@kvq{@S(` z6-6?`Hp^{B#tr#H z;W>LPlZ4j|Tls$T`S#6RKubPSQ|ES{*x#+OaIl$CPQWR#HRZnF$DiOLKCUKc@{HI0 z9o~E!$6Ob)+$Q6TgZIm(aN>Ob%@;L=o#wn{E)$GluJ>L0cMyNUc%2I*$$oI1JR|5$gVT(+klR7M_sI>IZ2HK!KjJkP4B=xF)VZzvx$vT?KQtKq z?tX=_i1Ew|xNcbKfc|crimwzuT^axV39$ar`Tr-2ly3fi(w)bIt^GFbd@A<@0QU3$ z+P5eh&+mzI`uV@uSyr1bWJQ=(=1!M|AG;&QwwHy^i2tk}W05cVm35f^`Yh0C#Ph$Q zZVSemV-bwUG1jSMvIUOgSQz6i$)ZX#FvxLd+b_ z{tgI+t?Iud=#SPc9a5eXO{gE80%0!g-pM#3mosGc~AoUqkY_Od@{v1T+Z?a z?JC51vAdVUb|>#k>bR`-D!wV8Z@i2pM9^F?ipI^?8Qu1E%fOfQ8lfGJieSJ+SnQ_S5{2^}B>g^ixx(^xt%y zfBXEeAIhrKIfeW$rYcVuz(Aj4X00CM;(f#cfQVxY7~yfsDa{-GRvMqUJ^%Bus>OA) zei@(WyI)Bx{8%1{jr;s>|KI*<$~3wh5^AFFEyNJ6LdeF;V-qgW-n}DZw1T1n8|ZXiHiWfdE=_!6$P^b&J|?A8)LmqoNrW8 z4{Wn63g$%1SDzx*cP~ zR}6mF0iZl%zP-V&2ru#k0P^jzo%U;a2cBN1lNrn76~9H#rmc@MJe9|I6K(mGn|~Gi zM2h^|D+(Xvdz}Aw{qQ9{we87?;x{_30)0LI@A`3Dew{8vc#gFASKxdB`skz&@sI8C z_b5K&KgK$tsjZ2<$1z=KoTKr`x7zVocrlPDlZ;pPbIx$guIur_2qse>OdE8Bmzr%J z$3fJOmw5+d<<1S>Fo_pK?toLnzoVj$Y;@5I+Ot^JQTRh1F?l?+uf+3-c9-nBbNa=C zp_6CFuLJr}v6hX0zaLbgBDEy}WJp?B!^p}S%tgav?q?ZT&}RNXaT+ zL98X%wRgTzBdBm7k(R-=gzOyHksThdj3EAHj+t7{dtGnFE$GFr3-!s^!ryCOBWU-b z>NP{wA}(zf@$t+UJh~1tv(=%)6?`LtE%^+&f19A?l>l33A8Jk@IKUZB1h9y6nVgAV zy;HP(fc6*or{!epJl!sqHkO&Kz5l(gVmthF(C%aNoA3Rc{dYETzA!5ngSkk;1!+9} zMjjW~FBqlq2|*c`omKP3*O^uKZ8PRCZJIo7f_6pVGk=FY{c)lSG2(4`o!QoX zoS!gr^Lxe1mcplOPWT=r9Du4YQJV+;cpA?&^)(u|r)hIL)4cgnrTE5Z&MKh9F{6pw z;x|I$iB^7iyo?o+^M8Q$GR|3%5kc|Lp~i=706+(T3$V5->kiCAfk#4pye#YDvBu+K z*vZ=gn=#<;8-Ez%-A>JT&g8Q5xf~<1y;5hLI_tub=O*+KvBmdxWwCi22hhco&MV9# zH@B%vda?%$$|S(bb+xf#%sxtp^Wp`t8^NPzz1f%Ha2|nM0>!*Q_i_=FrlDbOsFG$ zG82gj4JT`Ns`oK|?45MBwKdDweR7av=JAObbTeV5(>Ai;RU4m}1twCNAR`=8aS&Ml zLY~kCyCL7mm_W|J9zyzsCh=Q$4m1S_AJDWx>(>ZY=okwTcEPeZ7*D!lGS!Bi@t8D@ z%})t%smxZQ2pbqj7&;aclcbz|{MYXYWJ(d29s1g{G_Gxveld~Q7YYp2xU zYvQ19oE|YaC*ya;*PQ5QyBc6?0AmMH!^0Ak&sic~`h$IXOY+JEk#BVvd$GZ$9v{B7 z!~YVQ?o0?EywlD1Pz&~g6;vrqrKKQE7A5%;yR)5dKqD^Q<)QZmN)8Twfd zvP1y(L5d<4&~U+a2fNt}v%)tr@ENIM$sLk^;xIRBHA+9kcjac_S&d-{4o4LkI(3 zr2%UItyj>R74h{>Zm_Rp-&@FD z1|S?@!3GF!vu%q>JS_#p6$`j%U+=q+6QI5ftm1-q(vv60Ph=U zulnddf3eg1sW)gW9!Cv)am3n{@pRQBi~MW8P)NCx$lh5g>}U8AngHsPkHO8blh^&E z6?{3Bmv;SN@_Xz0^56LQNhlkc_nG;Mtud|vjK_*k!h!k2%lSML*?N~5#@?_m+`Q~| zx)+yk9v2Q`5(CFArfQ5E3h{sY-uo#rCOIdefpSnBJn+U;_W@0PWu3VJR8pM9cTyX*yVq9aVVu-s{=szEm%{ucv8;&1>D1c)zc+!hM981|e+AzqDGWABSf=~wIyXBJn!ybg|!skor3evZ^n3?r;vs~ZFJ>YgwfT(vcLoNGMu=giEOh2_*gD@G!v7NJiETc^PkG$ z@hG8eyU+F2SzA6F5i_Cg9()T2JZ z$(q4O0oU=eCXN1b%UawIKrt4RmO?*Kd&_=u&;sL#0BDJWVVS7w3~u0lXRoI&CUGNb zWcq_;zQ8E1N!(AZ$;-lbMr%HOC&0Uazxo!EISJ{sGtM7xdbw@Qs=mN0{Dp&YPR8X8 ztMJ>8-H-Nsw>8_n&-&vtaZK?xUiAq*Ugny*$b2rmVVh`wgXnTQM26g8l7>Dm_206B z9p2pw?&NlHK8i;3PIvyJun5GsD2=yJHf;gpr_?dmc_5N1bB(}On5K-lGS`ew>f z<3E%HSxQEC7DqrUC8mK-qeB<}Q74+`vBip?2=L)H1niF^GA}TY^J06+{zO9H$}X|Y z|D{0fy=r^O-xPm&OjcQ_f3!O2(jJbXReP}X;(tcNJjN`t8RblUNgz@t_9}Q8i%8OO zp7xnbk+{ZkogbjgX3VQIbuSNF^4;DQCwwxn3=#}>W`cqX47O!e!xOg7m9`QWYzxo1 zJkFyreyImC2o6;9_mZ{7fgSW%GRCMo{9fF^AUi(!J0Hc4r8@qnR42|idbhTfYL{+R z-GWESz{4^Oz`Mo3(w7_Foeb_LInMQcYj7^@IO~S_Qg%02WoMu#+V3SzPZk++8;<2C z=wJFxAV_V$fPn^5KkgqNs2rHh@95@E*&qHrWwlN}9()b{l>3P$%fiN{IW+i`i5zvG zvaO)Ige2&Mc5{BO<@lgWs_9<9&!$eV^piQcu>ZcZ>i1sZu*bW+%D5dUL9>R8K7v?j zTSYSdY(4?#?i^Io!iNX1tByr7{pbQ)&HehGnZt=G%xY7AxJN*Jvi#R8W64H^+sFNe zt6QK~$l!72VAAFzI31uz27HcF3O8=WqYeFe?Pkju>LMeLQN)%YzR$o*r{WW12e#UT z)u7*Ow&hteoglwVw(tIOKY8mrAM>ctUfx)&V}XEu6mMenMTM3z?{a;iz4)AVMsgEe z0*i2rml%8Spph>XD@x6V`Y4fcQ5{o+0f2kG#+U?rXL%nRGgj;T53_=YsMO)ba`Z9= z)~VZ2SqaFRP?Tk#;8->lap^l8VPLwtK&U!Izkt4OXUsNZz0}aA918l55(0W>yDs!P zE-TopE+|N!I6mh^_XNZqMIK%39W8YImxCmZju30vrXY_fYT@r`(zHtUGvF3;OPOFo z196f8AHQE^5jjM#e5w@I3vsk04ocE)maj3;gp<`+#d4*r$LpKtJLA611~#Oc9l0E@ zNTLYRWp7b20mV!9wrQ(vvjMkFh0kSvg>cd#9T~J{mB!{;Gt4-VA^(_Q1UmJLKJ3bT z+xKf`dacL$mii>Cm&fzLqq$4H1X39Ut?klpd9*<36FZsx>#~TOD z>bNprpoG49^YfcIB_|-GNei>^F%eJjh8ggP={HXR|M4QHITt8qzu+ZQF;93~QaWjT zx-3}E{o|F7>BMn3^n0KGpZ^JPP>60roOC;P~Nf zTfHg~a|-DeJgE&4sdKXASc|qTWnpfTC_ic&%TZ)dYRvNd&C}zQ<&mO4x9@UU`P7i8 zO{jOL^jfwx04Yae#gY z@)-T*_{6@sk6oQiQ-0k4Km7y8-ZE~P?d2z3KN0|V9vhIJ=6}X+?7tlUI5Bct<8hEh zz7;V15fIc(zAb?Nf(P>1)!UuJK;jAYQ{6v{%7WyFAPs4mjOE!bKk2_8Ei}HMPxXG8 zuk-*C=_hvmyr^l0LX{pY{jfisc7y#>*-yvr6ZX7N(2yFCXO2$=ocl%wDdkZBIo;_hOlzuYfnETk?GMj!(u z03Zb0d4ty2$>)c%a1~iWv{1i6Uu;1p_lI;qGTTDFD0BEL$SWN<+{8aepb(E1B)vc9 zRheZ3V0nnBYg&N2uq6H^P9@{p<*|nEu8m#%qr6^@`%k)gi+HwuA*=p)OoV1hT^A@Q z7q(*!&+YF`KeI2RU1e8}_~9{*lX`l!$$gxBmZ^)CA_MnpBlCpY_YbVT(lKuX!_df4i zb^PYpm&~2pQn%;$_ba!_ke-m-r z9dAN)vzA9DP7v!-bM`1?Q;jVk(ZdrY#hX#5Tz*bnu4V!kA2(rq^FMQ)ar~bA{U+D< zci-cFi|Mk@GQnrIXUOlGH=P1FES~$SPYn|HOJ5%1{NkV+{nC7EOuF%HO@E@%EBjTX zj+yBC24$Se+=j=g9)b=8lEz~ffs?S6p9UEhkOlLW(NA#-=W_;UVbwvEC_kt zqT>c&&f~=W&APhao7fMiYd6Z?W!#^|q;vYd@;b8>Y>3io> z-TZHz{xE*BO$^$OHe3fBzqpQok4R&W$(QTl*yX;gLa`h3V{NOoiP2Rz9NSP7$^P~> zkhe*%mr|MVf9TgD8kD`dLC`3mloUcGaq`3SJgCGQ32|_4$Tr7HCc*Zre~~`G7h@OT z*M;7o*9?YFfSBdQ?*Uw>?pl909QdGv_0a*e@bxM?;I@E1c__Oh8cgGnTtqlfLDTI3 z-AVuxhs)`nsK_+tD}|~Y`clBE6dCF#oQcnIZZx)J0p$l*4t{8A7H4EGanc<;O)5x! z!IN2X-|F}q7|$oxIq1Y3wGK5}j6Ky*S>iuRnH5`RTRfz>LDZG#)%JQ*&**RYF8;Ut zL>ACq7jNT@nBzVNh&aW}`xsIk;5#qBf5Plv^Ev3R`+rI@S2aYd;?d7nM?0ykKb>1oQ`1t@{U~8^@Dt90$- zv|ARNz}n|Mc<%dH5cpGugeG{MHnFsqW(g||N+BIyQx2C*9|9)tC-1Y@tM(D_oC84U z9rq*nIgzzZA_S)0Ooj`tyWgx|3`KdVV1|L3qU>H~+Jegp*Jqv-|FXjjrN1h#4p?c| z2I-A*Mw|>m3c!q!(kfPfVcZqSV@6k(P+lUOcM*6OnLxLtKIkAc|68Mn3gQ!p=@{ET zUv(&b0eVLnY)^Hq@A7^L080JFXHd_IQ}VO4zaf1%ZnDPWg`Fz^Qm>rF%cnMtStl?% zy46di(Wz)i9E5nFA>q-fyLOa=4JQyKuz?_yJ8CCADwLe~nLy?6(PJ*56$pK|4sGnz1?c&0$4TbDi1q z*;gZ8Ul}*PmwN(Q*JV7k~DO_F!tt?W(4L*gPWSm7;C=WCClTJVZu{w_M2AlAyR>W zz`5>t=m3g&>3%%5(Pt3%KRM43NALwI!GJ4l+DG#`>1b|;l7tf-?XhEfJ&*$*yAeRSF_ws|C&!h3ef4p z(F_I$k2gs4s|1?*dOQBYsyQZ>IMKY4YBWCL8&Cat?V+z~xtUa9EcS8U_nhNckIzVV zaAm)P?Pa`20Q3GipY~#NI}VQdKEC_b8JB+rpmQwt#gXfK-B0Z=ZQndY$JuvrgRTKk zm;%6jS^(VJ7X`*evwVr5p^Q4$NN^>>dC}PGI^!n-ljVMd4sd90=Wt&!;4@T$xqO!8 zu^PX-?c9C}e=d)KeOP{#3UX3p?nMc^g#2iq*;m{TVzhM@baq|{^h0m*MPd0+HUzQl zd?W>w8rh)Wta&rG%7(Ci0KcG}N?ngdjK^T55vO4Xlo!6Ey_kx&S0)ESPh4=jui$tv z%P$i!j!`6+fqv}Etc$=o#CD4=x?Wi-<2d&#;~HqoIvzrCGx@TAzK>l3onvOzVTFXm zPY6bC7$+aB;|AL)AVQNTbxIc`IIys+Mr{nt#Wu5Ek#qCi ze_a8Xq@D*M^Eb{#yLJQx7Bs*Rojs}^)9uJf)Hx^fbeRDFB8YWBIxeY?SDP<=3!h_a z1hlU?2v4LOg|lmXLP6i$j{r0Lp&mMzMH#kjE*NGxax#qnvN)0I+hsAj>kAqH!q>I; z3+{9Drwg`d__Le##CKn^oW=tfrp9KR$ z?`N{#&t;#FpyY|zU>`STYX!hoECz3&3vVucf4(#0eiIYniwTZW?h(pN9nALTX^1pVkmnB~Pmwi1s8+!ymWgA;TTlj)6aCC(bKgL{ z>c~=$Af3Kj@nR_FI<$Nd@3OEdqM=llC{A4gDSsN=sCKCbI8@_F2&8E|$!E%_a**+`dYS?mdt7Z(0V(&_?8r&XZ z(Dq=Aj~)TTy^ko|c0_Oq4(>Hypg{hl7(dMY=k;Uuh*zbi=t^O>-=A2DT_AR zmiIc`&)$}-cE<6v^Vg2IbbTeVj+@vn$@WPHvo+D$`Tn-A9_sAQiR^7$%E&|fLtm9Q zr&{Bv+=zW~PN|Vke0RK;x-fXO<)tw?)#*C;qmvMy(iSWxmJEZJ4`)oEqFHRUMfmV{ zwqv0`)x+}$lw3xXp#VJ>*ng_L6o^j4PzJPQE! zF9(3?)737m7GS5kn6}ONDO-uZ94{0>argzOi+w2`WN&8}ZK&Ad>a%t6Yh5Bt?vGNm)X)}R3$j2KZV{f|4BvSXl zzUeLJ+!EvU7|3D$WqiPKo9kih&1bCp*mlctK0g_JQO~U^Q7$fHS_;t+r%sQ^EgjnZ6`|+h2;|2 zf~O~$)YiqqU^!(p0^Vrz29!Rv6+8%B`ti<&rQe$QvDBe?H+^-D6?>3HK&Dm>`JT8h ziypMdkfx39cz0ezR?t4j!{xT6o4TJC&>8<$lOs4_>;%~bT^BGqd127D z1QX%Aj^F+7^)cX!;ZPQyKu8v!02n~CMEE=Q8d4dBw`T=Fx4fis%Z73&TuzP-v(lzf zLzr?90cU=+9%j<(Sioz0*v5X_=M)x z39&w0vdt7Sw`7E5@jLZ5`t9R{HnueRY7r&b&zWsp%Pb($;Jap-3K)By#iL`4OJ1pq z`-wA1d)dae_4{`tfVqD>#D9iO>gDlZLZB)JR4vWz;vWY9&!}g+&wZE+y4C*0j)lhW z>(T~myz)`B6#qFPx<1Y>$H6R}mrh5V!rMr7?0CGly#zp0Xw$DCVB-_;i+Qk(z2@)J zpldu{4P(-Kv@AWbC16?F**2-_IS%6_76+x&({H(CEmCfa#%=XCAWfDn0FiaJNn#PNjBZQN6EiMOib zH}n&m?)j%84hDwo-}hA~#~<;VpYVCky4GI)Wq*Xe$1N^x(O>Atojjj;_1jiH@&C)? z-=OZa)&G_F$8*SQZO_{Rg+>85p|L0d;mRblP6D&-`=D=hd5;c?6X%o5y-TK|~S)Cwt%egZ;nu-#U%R z#)d+?wlvFhZJ`XDEkpob>R8Q0Kb8HaO|RQch%|+^w!ywh5i3uWiveI+EI45FIA|6( zrM>+GzJhR<58nh#)jGRGIkWcp@2#)M+BaSK(qCrllVZ3G>AvgVCpnCHZRB~fPmvMh zUp9R__4_DS;}4JhB&|TRIqPlxi}By2SS1?jzOQm=`~4@xlcIKxzL9N54!WQ8z${t^ zg1pT9Qh!sqMJ8R#EHcWRGzI-*wc*gC9=k4=rhJ6|?7lDG>A&+G{Jij)b`SKo z#6Q_(WL9Jgntw`vM*QAF^POC`q%>=k|gZ8P!%{4N% zCKI5;Gt3qD>>KDZpHJ`L(;&JVFs$>&I%S(0Y^j-GBHHugQ*Q;kU^d_IZI+Y$1?}KM zL7=T=0(;lFt_1DxI(Sp-d@4sw%;F$c??-CBkKCa8ZI>4g9MfMU+jdb07tO4=MEKwT zyZ|_w0BCnz;8O*F3;<$-^6W!?9-m>I?OS{fLtY^BI=6ONDmD`Z) z2XDu9Eb#}n!S=Ojqc&{C=Q{9=i^jqSWWhExC&a?jp#JjtdM&a?9j%Kf{N2eNJo!mO zBK67(@nt|Oqzl_qAdV3O6`O-^Ax{OlSQoFicna_^&_}WFk*C$&81dc59FP@lE-)qv z*`R=V0O|&OI}eZX4%LBrM)8mF_p9+=GVV{{q$rQabzI84$lLWhP{`v%SiQeKPvJkMwvlu}7YE zG_Rc8kLUD$$pIiHea!(teBv%XH)ZQydH+PKKjrbLubT|3HW|-`f2l{ogS_yDWd=Q+ zEQ=iAnBh9epKZzZqxjc`58A!cYv~v8@owQ#sIg5~&PtVfWpI(5+85yY=p$y!{S1#b zarv=6%Lu%R9cJH`Z9&@Oz@2~Mo0B_P1?r&<*tdn{;=!2lRVN?fm|eSG&iUh;pZ}`( zZ;X+^-SYAy)6RghDchC-L$dS8rhLfbMt1}GAiAl~&b3VFPc!VU4F1OUEeCwdS$}pO z2y`D`Vx0Rr3yQ*dla1?Fy;~mp@}G&@{d35HZU+Q&!Q>gcF=5-M_Pfz?wh{ZB!d=m@G2Z6Oc#*4P>*FVyyA0o~q7aT+gRzLN_H;aP2Ni!EXooG9t z{^|T@u>XzyY8eFW>-XBuF8uSCWeYT5dq3yI{su(((lM5+n(fWYHm@nEn&9B%B6NqUYif{U1Yka*qYa}o2-{%hW33KMZVn9FuJdIVHa#&Y2l;}7ud zc;LC+Y|({T@l68UQFjOIq#*_+MDFtpz(pGGZg_R)7yER;iDW1u6YuV`S5+5(`qT%q zk(KK&=b2A0(85b(^+DMj-<1>D`&?I+%Xj^HpX>VGYUcJmoL2y6&UP6 z7LkWQz)s{kaCdLFVy?{R<@zZUh#%)X>xdQc5}boL)xDVOaqgK<MTFO-9F<#6n{-1D&v;s<^HW z6E9prAc*JXaXP8|@iW^}!L2`<g$b|#H)@?8R zJ+F3vFtU#yA$@T1a)FQ5_}9vN6cPuQ7W^QCY~YtDl=HIzz;6KGjC<=v=Xn)Ft{4*y zHk9N}skx!%@*C}>ZhLrVoh8Rj-@hJxF#SG#W3u(FD3*_K^f$knKn7cK^5j|W{_srr z`~R1P$Ce0q%L6Z@x!)?QSxSGq<|1JzJ#MP?Ek&;(k-@-xAAY4xbwb(;^_C19ltrZvr#O%OtKiWa;8@N}o#Toh%uka#-x{?a zGQ=2LD!%en$c(`YqYH%X@rZ#egeBhT@w!>?ls59o{ zyrAB#n;#SC+fKJX8vjD^|8|G%&8Z-y2N8pNC4v2X2_}(cAkn5hEZ>1;d0Je+z_Zj7 z7)+WV<$A$SjCU>+!Bc>Tj;m7K4XIsy&w1NoPjemuwh-dh!Ov#UBt!+Ln zz&K+qQq+~mtP34O0H|xdXdlWJ@YvMb^4*nTnTw242VWZI+3u?y*z=?aoOZ2zD?hHs z?XKSa-d3UEpV9}TH2q?-fcug$mpqSGOG-JY$Mj8R{gbbKqMC{Kb~iDp&}X|QXHXYc z>%(7YWGTnq|Gr`5wTuVjQ|DLcMKSX4fmbur%pfQITR{1I>no4lV}j7Z$1JyjkTy3j z1gyV*^_w-v_88wvqq9BafCis_gW!@ZAqN)X~ze^y^xG}evyF} z1^OKS%ZR5nv))CKNHhOCJ0N2C78|CLGkL-9?s7 zIcaRv+Ci#KTOY-`BE3&)vmNJ4yDsfRpGwzW?-im&)>lP z2{dn8Nz1ty^CfAl?K-HlcMP0m@<axi&MaP)0UhZW*WF*L`G{czg}yh|<&&gsI5LP6EChWIhj-yEREDXG7~7OD?V&yhj{Ub);NOA4 zR(9QNn`!3ZPQOleZfi^W4CaJ*cDnCIpb~e`9@+_YKs(9xr?>JPhb&C0?+%6gt2@PcP(gqq#;d0q-GKczGf_8C|cqDL6 z*B!WscVPmo``47;=68W}JWN zF?F$WBdQXx8fe(xoI2H*bHV`quW`fb9DnbuJA!t_1+T#ZBqWIQ@l=VM)hqOJfA=}V zFuv}3qs{mEm!@7}>Nmgn{nr1tvCv4FZ2Gh0eCO6v2ShoxM<{4bOufmUD5H2BLAGkC zTOt_14Rp{tlzE>(eGE?=5l~(QP+6j&n{yv1+5uaItOSDie8@s}MxI7;7duTqEBY}O zA)X@A@?;9Tm@T~6W?bLp%7hTq0edR*2Ys;rI@vnlT>9MY?eRJ56xji*Ec`_l-;J06 ztW)aX`xsCT>3#5)oiH6P$e+f4h4!&M=hO9TiLY7T$R}$f+WHM*yY4)<_oMiq<5Sq& ziee+&nUM>HPO$)22uN#=xxz)z4Ji!zOOOLE9#~x21?)F%aozhvD2O(7v5xHILtW;% zrwky28I&}|(W%lp>@xUvfS2H}4pRsKoiCru?w$5|Fvnj0HPCea=VkprjGp0dKH%2+ zQC?(?e0fidul&u?TO3}>Xp1s+BQS!>p%?L%+Bc(kGsu*_$|(oy4qMmE`v9_qkyId` z?bSy-CjWKOOP^AzfXHbR10aLtEr6RX$D)nurY(*57qK72Ow^O-fqhqZ)brzIs)GWv zu7IxyFT`;I$Vv{ZdGd?aXlyN})oD}J#qZy`j-0g7Q@mbaYAqAqEr-7l$j27{KF=xG zNnxT29bl4)fgu*WW8b*9ZF)t9`@SJ`2os<_-X1#b<#8}{zN#Ni^sIslKFxir@87T3 zNiQ+7Uuow{^Z3mVxAolOzjA(im$f+tO@H*QGYH__PVrlE&gAinho2l~OR$T8?H$bU zbF>jWm5~6S=z=_z$I_Kds(*$q(53FF512xQ(ed`mHwYVTOIt19h`z zJC#WCgn7tcSY^E60Qr}N0Lj1j{v1zs^FSAWCUt!5%A)Q*1}@{c>Jkt7Mf+1=C`9qE zGDmr>!C;9O^!nfbu}74)A->GTRD>h}m-@QDtnsBVALZvPF}7VC1J1<&4efM;$kNWJ zT#hfi{sdaL*kF4D&@Gp9L}Zse@A=!(4)a+qc|Q3DJH}7k4o1qgZ@%QW8R3!F%P-lN z^UL@rj{9&jH=aOeqq(Lt@-dO0y2WbWRjIAN?Pimoh5r}v-(;zwof?Baf&97gQJU5| zKe#_HdO*R*SmjCY>^M^T+GhQ+qNy}_AsE>S_dfSB%GROqlb?F#TWC`9_TJg#`M6R8 zM+^S%?^ixOg~vslyrWIfK>)zUSTK7&$9c~LTk0Y?QRTTDQ_^kOG4tBooz;LLlX7F|oY>`obtkqnzbdAUwtcK(q_;g}ulxL>?x4(!qaoy#S8T z-yN@x&_C^|E)9sS{}Bj#sxKg~H0|Q2NI!)og*g|pNh5`wZuRgKO+5diGHy%AOEaN*!-q~;tI#rGg{`u5AK!xD`3Z3* z^4s$D#`a%CZhL`?Hl&SWL!1Lg&rX4rh$;Ksty|-M%G`!QmH06xBzXG&Zpw1fA!i|w z=#ut?52SD>_TZXx!@Epe(e%&v1nDz>p!(cCK4FOFdo!%!cHpXcr!R!u`K^{?bSe&3 zcvJ#L7QENoOKl7v+IM|xdKp{V%3RA|q8G)6S3flutK<0hA7f5eFOQmnVD-me(8)kv9#0!fvWwf$FJ8 zTytc(1UD@V?=3Uc<~n#pq?uy3M*ZWegKP_;#{AKz<9UqECSPo{_ek=LE` zhTNN#hlH_8%}uFQhNauq)jT>btK>s6+NDFwP2v`{JFU>Jl={??(`spF2RJM!#cl`Q zyU}#$CVdpNLyRqNW4&*E7ZGw!=z@4mC9XespDDd882x$t*p}WNz}gDH8dkFX)pqcD zIp$Yt(7$)Cy?@L4lnUT&&Te5h_Zdnpzc6q|YXPULP~m(KQROc|tL=)KC?fJSs3A8J z^Xt1Vm3Q=Wsiqca0&AZgFL1@rDy@PGQ^r-LH9BdfH^|ZO?ucm6ES`1#3^KZjaIV$9 z;DhRAh8U}<9r(AbB1_({16;U6!my>;^M`d8ZxLo0cV8^ zQ-t5>fzL_ZW8MiITrl1oG-YZy$$kCm>ZcXCo5%C>-xdjHmUD~ULHk~J%S#NeH0>ZP z55arcgxFQ6Uw!umlKG8F zaY03|&{do~z1bM4Z%*RY|^jn%+ z_sQu#MaPgyCqQUB`*QUE)f-nFOogW*hoye;ji+0tuBYVK`OGAhCkW;UW zn&S+S?UP%O=bcp%=MCpDG%fc&cG-N1abW2E-{7dOQw#_&JFR8 zl2?Bh*i8~{2yGfHClwAK;ybEzwme>;yRKs7W!7SWffvaK+h~}Hr4u;182Im zb_{LFczJkzf-*z2zfp7Ge)$*s(t|wn%*anG$e%{3mw+M7X5(~}yH7QDTy0L}E;-9w zqqVM2B_jHpW==B6v&o67&EYJjct?$1rbw3F+pqUdX`OCu6cvo>Dz?FR|Ku+MMg<>; zdYa_;7G7Z3RR5M@snsv{>W*?*oxpYPijrrbdB0Sg5yKzC@pB;#REXkxuq2D6q~O`1 z>a{<|1-~*nHasqB>)9$psWQ5apx?>#%?ZlQX_B6Tl9;V8WLfgBdQq=grpWyhIcdPu zFw)1y;eQ~dJKB+~We4GnS>wr`q!HFwKL$N;b@;o%maCFw7LT+v!*i-iLK)RZ$86(v z`d=t8LCqkjCYD*Bt@dmMDz_UOJXm0Ay+#d(?x%M?PSFIJ7ZVd`V|N*MUVCLMYmL6B ze65ltv`SzSsvs9m_V}}k{OfhsP>9jF%1H69x-?1p3!Xblskh9`3A&v4q5b3kGIT9Z zbez>(WK1i*jwe?8fPn2T7)pX$atE>YAL z&a?l1y)zzzX6%WGD%H|J*vSbD6mX<}mWpnP+MTt|ae-r+myI+DIiBU_Xhts^Vb)$<9yyQ6CzJ0q+VcpBqE37^ zzJk`9PzE=1_hlV<)7ql$o)N^HwRd$%8coVy1mWr*6Zh7^@gbVe#=Pv3jO4+3$VIZjs%c>$ia%S;rq8&xiYg zZ|phyps(rr8sFFRp3+vS|MH5DJCxwI&1rqt^zmQ`?S5LH%}Xj=W~3=MbW%W&$}9#U zLbuj`UgDiYHu!N*_pVe@F`a{=vZ!_)1C<( z^5D8@cH@X>a5&S-+9r>PL|SGWes~w(+ZqykC=2u zZg(7yTsG0eB~!Pgdxk>~4r$s_{kM)EPjax$NpTda7KMsEfm>CS&xQe67>DtTKYxAs zr4=^NChDR#pE*($id}-4_+xdDjWxDxW#!LQl}4TKW7eSMG8%t)%+-$5X=mr24FXeb z!$PU#Rql_^b_uFTkXfx*+|#f@!mQ!_vrT&J+V&4q)H_xRVz&PPa2sh-_!y$$c^uU3 zD+o7u*ds4!c&BS`J+`n@ZN>fLXVHq2I+gfR{ohgG)!>b^B3u0W_=hviG5()`BqY%X z)1Wj&MI4%Vt$mm~jLnH#+6_oDj1sKma`O4t%lBaVBwuYS41G9g&Rjit$^U}Z{wO2C z@Y0_+GD=y+x|nIs)R{qb`u-Cgw#~|9Z1AcnrqDXxqvf5GEbi!z)>TCI!dF!{N;>WW z=4M21Fd$3X56MN@8;rJ@Yx+ItrfWK}Z53e$KT7Ymr0bih z>01xaAxE64-x9AW-NQo1Ad+~ofxG4^;;jWDuCkzoKR=TFj&tajr0(%k1Z{HME;L90lR1mgTQ=ixo(WeDMxiUWqnWI=pfNX?k1o0y zA#1w|0Gw9n_RdSLm$?EwV{>g;ZYy4ar%*O)Si^#7+mCZ7zDBLpm3)zRiKvEiF1ekv z$NPP}HN~?>>Qiw{Gaxr&xGG1@Ow59W3aSO>^UdxM)C|*d_`B4lJ1As}m1n_5scOUk3H&&okDi^M#FgUr*5B}VwN$ABYe99 z+xexz-psI3;O7gqLd0r&Ehc8p4bt_%=w{wIxDtC1w1dPX@$V$)YbQ$JunA)F*zA>l zkg=8FeZ^$}j}{Of)~Bnp1Pu-t;wIFPYCMt8saDji|c#?aZNOCs!AH;{%>xTiUZOl;wuT=kdx(tqza;kYQwcW%(9;XY~L zHh02`wj88h?^|XMpUAbbsutnGx5^WEj)-7I#&I#k^7P4li(FKz%M{u?a6!T$U3Eb^ zmFDdoulK2)(vfrr(>!CSx|34Fh->F_aMbToj_ID-k3w#dVulW^F8yaM@)j!$2BXu; z%aV;(53O&{-`jiV*(r|+*L^qW`CuE-2;5Q>G__03#V^RMX8PAd8NxOlepy2JEg40? zP=1)<`BC9E=27H9#yyk9C%b2At{B>!dr^0m+Y}WLb;67%z^CVa;$houU=itsRhTMM zp9tDzLW<3X8y{Du+&;fGii9E0Cm(z<$!MP zd4dOaoNmA0`OmcfQ_-gr&$nLX1w4MudRjrc;`4x4;8Xt^|Dwx2iN4xl0lsKYKo{bq zT_@d4B`i4R_JEmBot3D+A#j#_Li4dYEsl^eQrQe^R@Aob7YbJR1wQQ`7Prs=nUXlH zb6PJ)sWAm8$EU;Fyaj2W0m`d@cjZdOnCN3HjaLTa&D+tGO-Zp>Sw|h*@{zLvhM5lY zM2X;TF|+aW-YQfG~uXSH`vY!8#>&Z1`Z^C7EBlu%~!9_0w=de;~6#>vGxJGb>0PEsc$}rCxzoJt*hwq1S?NX*ocG5Z(?DyZ1l+82*sPJ)I-v8& z-&Y!S2cW*x8qNrz)|2YJcDM)U-*VYgJ@Vp@r3-u&aJC8WcC**5A+PQ)88Mn&4@BGH zS4zVTI(=do{$bB{0d=My>298KOQcf8D3?Kr8h9iYd#( zxA@3MSRaj+z&*YpeHjbd+r>jxC%d6PJbek?-Kiozlg5jU-!c)ff|cb%*MjH5mfx*^ z;$obp+n=iI9x76fP?Wnir$wK0cJN@(Gre15Z-sJvrMfa*9O{j9TgFPwyHXYJrj_^1~$ zv17Putru-ws-S0YA~4-(7)khWu@S274(Sc_;!(Fml+7ZR&>x}7O7obYaPxbuO8jE* z^$ofAiMcZ=+v|+Q`gE_0!dk`VKuvkk%iT5d-z?;488vaDkH23=Q<{BZNQs%XP{42f z?ajwM*M#l0UM4JfAU{3Nj4_(JK8_`C-$#-W4<~#{-=WsvqTUtdi_I;=k+n*%I?QMK zJc(!M#bPw(23Xl!OG5UKoz92c87{_?Ms_QiC@*d7Qyof&3T%P%fXd<0Sg-=!Dzsn% z<-!1e$$6UR7TsrSY=-k8SV|FKa%|3<=y|XNPruf>gL!qT-5I-1{!vlI8caNaOTbhz zSsq3gLpUB_q~Aa;8@+L7vsd>h9sI3oz40*56|tNQ>ifYziFL)ZAF&XR^Qq1ttX0T~ zr|km8y29@rjj}+##96poz;7=by+~Bug~#It|Fy-zlvTWwp-&IWUv+GkOA2p>c zWVp5#(d5u4ytCdc@0W?2_%$@Kp(+C3R@I9C{hRMX+ zp&J9d-i-XwT+U!^#U9HF>p(MC-VDa>M(Ven;`l=Jvu{Kq&7-V;df|6g^}G(+x%kTx z44JV~eu3iA*K-wx>OWpZj}$5XrGYCPl}}nx%nD^mbSLb?LRCKXnSU1KxKx z*Lypt;ICDO?HopfI$-h3cHOTQGXi(p7ku6#M3C zzORAqe&z(TG0r*^qwlP%zM79hw4NPz{W>^9nQgs>G+_yQ1k(GNDiJGC0qsqW*MEL; zsmj3#f*X!W?^PFvX!se~9a0%8E9J<1(7kz0<0N-^iU$+cg zwQv|^AH8yJ1uCjvn#l6VOMVQCOAlM5J4UhMl^WUt^8T0i}cYdF;d2N{cF)Pa`2jl;r|)<&h-PHZ+C4-obAx?4vO zz+ZunU-~53RI+3-Gx0vI-=l~j1J4-ioZ=q7O$L|pK6pCUoH2|ficU+Go&|}9)SYRb z{@Zz;Y4zDWp<1c1#gVQy+LQU}A94lDxY*JoH;XLcn?3LG2^O0bc<&u=>vslj+^-K6H z{dihtUQnwN816yB

kcXfNbY}pvotsr^I{6L9;8S+(vr}0@kC$@bo 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