├── .gitattributes ├── .github ├── ISSUE_TEMPLATE │ ├── bug_report.md │ └── feature_request .md ├── release.yml └── workflows │ └── main.yml ├── .gitignore ├── DataAccess ├── Context.cs ├── Dao │ ├── DaoImpl.cs │ ├── IDao.cs │ ├── Impl │ │ ├── ActorInfoDao.cs │ │ ├── ActorNameDao.cs │ │ ├── ActorVideoDao.cs │ │ ├── BwhDao.cs │ │ ├── DownHistoryDao.cs │ │ ├── FailListIsLikeLookLaterDao.cs │ │ ├── FileToInfoDao.cs │ │ ├── FilesInfoDao.cs │ │ ├── IsWmDao.cs │ │ ├── ProducerInfoDao.cs │ │ ├── SearchHistoryDao.cs │ │ ├── SpiderLogDao.cs │ │ ├── SpiderTaskDao.cs │ │ └── VideoInfoDao.cs │ └── Interface │ │ ├── IActorInfoDao.cs │ │ ├── IActorNameDao.cs │ │ ├── IActorVideoDao.cs │ │ ├── IBwhDao.cs │ │ ├── IDownHistoryDao.cs │ │ ├── IFailListIsLikeLookLaterDao.cs │ │ ├── IFileToInfoDao.cs │ │ ├── IFilesInfoDao.cs │ │ ├── IIsWmDao.cs │ │ ├── IProducerInfoDao.cs │ │ ├── ISearchHistoryDao.cs │ │ ├── ISpiderLogDao.cs │ │ ├── ISpiderTaskDao.cs │ │ └── IVideoInfoDao.cs ├── DataAccess.csproj ├── Migrations │ ├── 20240226014212_InitialCreate.Designer.cs │ ├── 20240226014212_InitialCreate.cs │ └── ContextModelSnapshot.cs └── Models │ ├── Dto │ ├── FileSpiderInfoDto.cs │ └── VideoInfoInFailStatusQueryDto.cs │ ├── Entity │ ├── ActorInfo.cs │ ├── ActorName.cs │ ├── ActorVideo.cs │ ├── Bwh.cs │ ├── DownHistory.cs │ ├── FailListIsLikeLookLater.cs │ ├── FileToInfo.cs │ ├── FilesInfo.cs │ ├── IsWm.cs │ ├── ProducerInfo.cs │ ├── SearchHistory.cs │ ├── SpiderLog.cs │ ├── SpiderTask.cs │ └── VideoInfo.cs │ └── Enum │ ├── FailInfoShowType.cs │ ├── FailType.cs │ └── Status.cs ├── Display.sln ├── Display ├── App.res ├── App.xaml ├── App.xaml.cs ├── Assets │ ├── 115 │ │ ├── 115favicon.ico │ │ ├── QRCode.png │ │ ├── file_type │ │ │ ├── application │ │ │ │ ├── apk.svg │ │ │ │ ├── bat.svg │ │ │ │ ├── exe.svg │ │ │ │ ├── ipa.svg │ │ │ │ └── msi.svg │ │ │ ├── archive │ │ │ │ └── archive.svg │ │ │ ├── audio │ │ │ │ ├── ape.svg │ │ │ │ ├── audio.svg │ │ │ │ ├── mp3.svg │ │ │ │ └── wma.svg │ │ │ ├── code │ │ │ │ ├── code.svg │ │ │ │ ├── css.svg │ │ │ │ └── html.svg │ │ │ ├── document │ │ │ │ ├── ass.svg │ │ │ │ ├── cad.svg │ │ │ │ ├── cdr.svg │ │ │ │ ├── chm.svg │ │ │ │ ├── doc.svg │ │ │ │ ├── dps.svg │ │ │ │ ├── dwg.svg │ │ │ │ ├── et.svg │ │ │ │ ├── key.svg │ │ │ │ ├── log.svg │ │ │ │ ├── mdf.svg │ │ │ │ ├── mpp.svg │ │ │ │ ├── numbers.svg │ │ │ │ ├── pages.svg │ │ │ │ ├── pdf.svg │ │ │ │ ├── ppt.svg │ │ │ │ ├── rp.svg │ │ │ │ ├── rtf.svg │ │ │ │ ├── sketch.svg │ │ │ │ ├── srt.svg │ │ │ │ ├── ssa.svg │ │ │ │ ├── torrent.svg │ │ │ │ ├── txt.svg │ │ │ │ ├── wps.svg │ │ │ │ ├── xls.svg │ │ │ │ └── xmind.svg │ │ │ ├── folder │ │ │ │ ├── folder.png │ │ │ │ ├── folder.svg │ │ │ │ ├── folder_backup.svg │ │ │ │ ├── folder_collect.svg │ │ │ │ ├── folder_favorite.svg │ │ │ │ ├── folder_group.svg │ │ │ │ ├── folder_invisible.svg │ │ │ │ ├── folder_lock.svg │ │ │ │ ├── folder_offline.svg │ │ │ │ ├── folder_person.svg │ │ │ │ ├── folder_photo.svg │ │ │ │ ├── folder_receive.svg │ │ │ │ ├── folder_share.svg │ │ │ │ ├── folder_share_group.svg │ │ │ │ ├── folder_share_person.svg │ │ │ │ └── folder_shared.svg │ │ │ ├── image │ │ │ │ ├── gif.svg │ │ │ │ ├── img.svg │ │ │ │ ├── jpeg.svg │ │ │ │ ├── jpg.svg │ │ │ │ ├── pic.svg │ │ │ │ ├── png.svg │ │ │ │ ├── raw.svg │ │ │ │ ├── svg.svg │ │ │ │ └── tif.svg │ │ │ ├── other │ │ │ │ ├── error.svg │ │ │ │ ├── multi_files.svg │ │ │ │ ├── unknown.png │ │ │ │ └── unknown.svg │ │ │ ├── source │ │ │ │ ├── ai.svg │ │ │ │ ├── fla.svg │ │ │ │ └── psd.svg │ │ │ ├── video │ │ │ │ ├── 3gp.svg │ │ │ │ ├── avi.svg │ │ │ │ ├── dat.svg │ │ │ │ ├── f4v.svg │ │ │ │ ├── flv.svg │ │ │ │ ├── m2ts.svg │ │ │ │ ├── mkv.svg │ │ │ │ ├── mov.svg │ │ │ │ ├── mp4.svg │ │ │ │ ├── mpg.svg │ │ │ │ ├── mts.svg │ │ │ │ ├── rm.svg │ │ │ │ ├── rmvb.svg │ │ │ │ ├── swf.svg │ │ │ │ ├── video.svg │ │ │ │ └── wmv.svg │ │ │ └── video_quality │ │ │ │ ├── 1080p.svg │ │ │ │ ├── 4k.svg │ │ │ │ ├── fhd.svg │ │ │ │ ├── hd.svg │ │ │ │ ├── origin.svg │ │ │ │ └── sd.svg │ │ ├── mountain.svg │ │ └── pic_left_det.svg │ ├── BadgeLogo.scale-100.png │ ├── BadgeLogo.scale-125.png │ ├── BadgeLogo.scale-150.png │ ├── BadgeLogo.scale-200.png │ ├── BadgeLogo.scale-400.png │ ├── Fail.jpg │ ├── FileType │ │ ├── file.png │ │ └── folder.png │ ├── JavBusLogo.png │ ├── LargeTile.scale-100.png │ ├── LargeTile.scale-125.png │ ├── LargeTile.scale-150.png │ ├── LargeTile.scale-200.png │ ├── LargeTile.scale-400.png │ ├── LockScreenLogo.scale-200.png │ ├── Logo │ │ ├── mpv-logo.png │ │ ├── potplayer-logo.png │ │ └── vlc-logo.png │ ├── NoPicture.jpg │ ├── SmallTile.scale-100.png │ ├── SmallTile.scale-125.png │ ├── SmallTile.scale-150.png │ ├── SmallTile.scale-200.png │ ├── SmallTile.scale-400.png │ ├── SplashScreen.png │ ├── SplashScreen.scale-100.png │ ├── SplashScreen.scale-125.png │ ├── SplashScreen.scale-150.png │ ├── SplashScreen.scale-200.png │ ├── SplashScreen.scale-400.png │ ├── Square150x150Logo.scale-100.png │ ├── Square150x150Logo.scale-125.png │ ├── Square150x150Logo.scale-150.png │ ├── Square150x150Logo.scale-200.png │ ├── Square150x150Logo.scale-400.png │ ├── Square44x44Logo.altform-lightunplated_targetsize-16.png │ ├── Square44x44Logo.altform-lightunplated_targetsize-24.png │ ├── Square44x44Logo.altform-lightunplated_targetsize-256.png │ ├── Square44x44Logo.altform-lightunplated_targetsize-32.png │ ├── Square44x44Logo.altform-lightunplated_targetsize-48.png │ ├── Square44x44Logo.altform-unplated_targetsize-16.png │ ├── Square44x44Logo.altform-unplated_targetsize-256.png │ ├── Square44x44Logo.altform-unplated_targetsize-32.png │ ├── Square44x44Logo.altform-unplated_targetsize-48.png │ ├── Square44x44Logo.scale-100.png │ ├── Square44x44Logo.scale-125.png │ ├── Square44x44Logo.scale-150.png │ ├── Square44x44Logo.scale-200.png │ ├── Square44x44Logo.scale-400.png │ ├── Square44x44Logo.targetsize-16.png │ ├── Square44x44Logo.targetsize-24.png │ ├── Square44x44Logo.targetsize-24_altform-unplated.png │ ├── Square44x44Logo.targetsize-256.png │ ├── Square44x44Logo.targetsize-32.png │ ├── Square44x44Logo.targetsize-48.png │ ├── StoreLogo.png │ ├── StoreLogo.scale-100.png │ ├── StoreLogo.scale-125.png │ ├── StoreLogo.scale-150.png │ ├── StoreLogo.scale-200.png │ ├── StoreLogo.scale-400.png │ ├── Svg │ │ ├── accounting_banking_business_calculate_calculator_icon.svg │ │ ├── explorer_internet_logo_logos_icon.svg │ │ ├── face_male_man_portrait_icon.svg │ │ ├── file_alt_icon.svg │ │ ├── find_internet_magnifier_search_security_icon.svg │ │ ├── image_icon.svg │ │ ├── import_icon.svg │ │ └── picture-o.svg │ ├── Tip │ │ └── FindFolderCid.png │ ├── Wide310x150Logo.scale-100.png │ ├── Wide310x150Logo.scale-125.png │ ├── Wide310x150Logo.scale-150.png │ ├── Wide310x150Logo.scale-200.png │ ├── Wide310x150Logo.scale-400.png │ ├── pokeball.ico │ └── pokeball.png ├── Constants │ ├── Account.cs │ ├── DefaultSettings.cs │ ├── FileType.cs │ ├── HttpHeaders.cs │ └── MenuItems.cs ├── Controls │ ├── CustomController │ │ ├── CursorGrid.cs │ │ └── CustomMediaTransportControls.cs │ └── UserController │ │ ├── ActorImage.xaml │ │ ├── ActorImage.xaml.cs │ │ ├── Browser.xaml │ │ ├── Browser.xaml.cs │ │ ├── CustomAutoSuggestBox.xaml │ │ ├── CustomAutoSuggestBox.xaml.cs │ │ ├── CustomContentDialog.xaml │ │ ├── CustomContentDialog.xaml.cs │ │ ├── CustomMediaPlayerElement.xaml │ │ ├── CustomMediaPlayerElement.xaml.cs │ │ ├── Explorer.xaml │ │ ├── Explorer.xaml.cs │ │ ├── FileAutoSuggestBox.xaml │ │ ├── FileAutoSuggestBox.xaml.cs │ │ ├── FileControl.xaml │ │ ├── FileControl.xaml.cs │ │ ├── ImageViewer.xaml │ │ ├── ImageViewer.xaml.cs │ │ ├── InfoListFilter.xaml │ │ ├── InfoListFilter.xaml.cs │ │ ├── MultipleCoverShow.xaml │ │ ├── MultipleCoverShow.xaml.cs │ │ ├── RangeSlider.xaml │ │ ├── RangeSlider.xaml.cs │ │ ├── ShowCountControl.xaml │ │ ├── ShowCountControl.xaml.cs │ │ ├── StatusShow.xaml │ │ ├── StatusShow.xaml.cs │ │ ├── TextBlockWithLongText.xaml │ │ ├── TextBlockWithLongText.xaml.cs │ │ ├── TextBlockWithStressText.xaml │ │ ├── TextBlockWithStressText.xaml.cs │ │ ├── UserInfoControl.xaml │ │ ├── UserInfoControl.xaml.cs │ │ ├── VideoCoverDisplay.xaml │ │ ├── VideoCoverDisplay.xaml.cs │ │ ├── VideoDetails.xaml │ │ └── VideoDetails.xaml.cs ├── Converter │ ├── AppUpdateContentConvert.cs │ ├── BytesToSizeStrConverter.cs │ ├── DoubleToInt32Converter.cs │ ├── FloatToPercentageConverter.cs │ ├── NotExistsImageBitmapConverter.cs │ ├── NotExistsImageUriConverter.cs │ ├── NullToCollapsedConverter.cs │ ├── NumberToDateTimeStrConverter.cs │ ├── NumberToLengthStrConverter.cs │ ├── ObjectToColorConverter.cs │ ├── OneToTrueConverter.cs │ ├── TimeStampToStringConverter.cs │ ├── TrueToVisibleConverter.cs │ └── ZeroToVisibleConverter.cs ├── Display.csproj ├── Extensions │ ├── ByteSizeExtension.cs │ ├── EnumExtension.cs │ ├── HashAlgorithmExtension.cs │ ├── HttpClientExtension.cs │ ├── MenuItemHelper.cs │ ├── SqliteDataExtension.cs │ └── String.Extension.cs ├── FFmpeg │ └── bin │ │ ├── x64 │ │ ├── avcodec-60.dll │ │ ├── avfilter-9.dll │ │ ├── avformat-60.dll │ │ ├── avutil-58.dll │ │ ├── swresample-4.dll │ │ └── swscale-7.dll │ │ └── x86 │ │ ├── avcodec-60.dll │ │ ├── avfilter-9.dll │ │ ├── avformat-60.dll │ │ ├── avutil-58.dll │ │ ├── swresample-4.dll │ │ └── swscale-7.dll ├── Helper │ ├── Crypto │ │ ├── Crc32Helper.cs │ │ ├── HashHelper.cs │ │ ├── M115Helper.cs │ │ ├── RSAPcks12Helper.cs │ │ └── UploadEncryptHelper.cs │ ├── Data │ │ ├── ClassHelper.cs │ │ ├── CookieHelper.cs │ │ ├── LocalCacheHelper.cs │ │ ├── OssSignHelper.cs │ │ └── Settings.cs │ ├── Date │ │ └── DateHelper.cs │ ├── Encode │ │ ├── FileEncodingHelper.cs │ │ └── XamlHelper.cs │ ├── FileProperties │ │ └── Name │ │ │ ├── FileMatch.cs │ │ │ └── MatchHelper.cs │ ├── Media │ │ ├── FFmpegHelper.cs │ │ ├── VideoFrameConverter.cs │ │ └── VideoStreamDecoder.cs │ ├── Network │ │ ├── AppUpdateHelper.cs │ │ ├── DBNetworkHelper.cs │ │ ├── NetworkHelper.cs │ │ ├── PlayVideoHelper.cs │ │ ├── RequestHelper.cs │ │ └── UploadHelper.cs │ ├── Notifications │ │ ├── NotificationManager.cs │ │ ├── NotifyConstant.cs │ │ ├── Toast.cs │ │ └── ToastGetActorInfoWithProgressBar.cs │ └── UI │ │ ├── CursorHelper.cs │ │ ├── ResourceHelper.cs │ │ └── WindowHelper.cs ├── Interfaces │ └── IThumbnailGeneratorService.cs ├── MainWindow.xaml ├── MainWindow.xaml.cs ├── Managers │ ├── DownloadManager.cs │ └── SpiderManager.cs ├── Models │ ├── Api │ │ ├── Aria2 │ │ │ ├── Aria2GlobalOptionRequest.cs │ │ │ ├── Aria2GlobalOptionRequestResult.cs │ │ │ └── Aria2Request.cs │ │ ├── EditorCookie │ │ │ └── CookieFormat.cs │ │ ├── Fc2Club │ │ │ ├── Aggregaterating.cs │ │ │ └── FcJson.cs │ │ ├── Github │ │ │ └── GitHubInfo.cs │ │ └── OneOneFive │ │ │ ├── Browser │ │ │ ├── Browser115Request.cs │ │ │ ├── SelectedItemInBrowser.cs │ │ │ └── VerifyAccountResult.cs │ │ │ ├── Down │ │ │ ├── DownInfo.cs │ │ │ ├── DownRequest.cs │ │ │ ├── DownUrlBase64EncryptInfo.cs │ │ │ └── ParamRequest.cs │ │ │ ├── File │ │ │ ├── Datum.cs │ │ │ ├── DeleteFilesResult.cs │ │ │ ├── Flag.cs │ │ │ ├── FolderInfo.cs │ │ │ ├── ImageInfo.cs │ │ │ ├── ParentPath.cs │ │ │ ├── RenameRequest.cs │ │ │ ├── WebFileInfo.cs │ │ │ └── WebPath.cs │ │ │ ├── MakeDirRequest.cs │ │ │ ├── OfflineDown │ │ │ ├── AddTaskBtResult.cs │ │ │ ├── AddTaskUrlInfo.cs │ │ │ ├── OfflineDownPathData.cs │ │ │ ├── OfflineDownPathRequest.cs │ │ │ ├── OfflineSpaceInfo.cs │ │ │ ├── TorrentCidResult.cs │ │ │ ├── TorrentInfoResult.cs │ │ │ └── Torrent_Filelist_Web.cs │ │ │ ├── QRCodeInfoResult.cs │ │ │ ├── QRCodeStatusResult.cs │ │ │ ├── Result.cs │ │ │ ├── Search │ │ │ ├── CurrUser.cs │ │ │ ├── SearchDatum.cs │ │ │ ├── SearchInfo.cs │ │ │ ├── ShaSearchResult.cs │ │ │ └── ShaSearchResultData.cs │ │ │ ├── Setting │ │ │ └── _115Setting.cs │ │ │ ├── Upload │ │ │ ├── FastUploadResult.cs │ │ │ ├── OssCallback.cs │ │ │ ├── OssToken.cs │ │ │ ├── OssUpload.cs │ │ │ ├── OssUploadResult.cs │ │ │ └── UploadInfoResult.cs │ │ │ ├── User │ │ │ ├── Cookie.cs │ │ │ ├── Face.cs │ │ │ ├── InfoData.cs │ │ │ ├── Privilege.cs │ │ │ ├── SettingInfo.cs │ │ │ ├── StatusInfo.cs │ │ │ ├── UserData.cs │ │ │ └── UserInfo.cs │ │ │ └── UserInfoResult.cs │ ├── Dto │ │ ├── HistorySearchItem.cs │ │ ├── Media │ │ │ ├── BaseImage.cs │ │ │ ├── LocalThumbnail.cs │ │ │ ├── MediaPlayItem.cs │ │ │ ├── SubImageModel.cs │ │ │ ├── ThumbnailGenerateOptions.cs │ │ │ └── UrlOptions.cs │ │ └── Settings │ │ │ ├── BaseMenuItem.cs │ │ │ ├── MenuItem.cs │ │ │ ├── MoreMenuItem.cs │ │ │ ├── Options │ │ │ ├── DownApiSettings.cs │ │ │ ├── Downloader.cs │ │ │ ├── Player.cs │ │ │ ├── SavePath.cs │ │ │ └── Spider.cs │ │ │ └── PageEnumAndName.cs │ ├── Entities │ │ ├── Details │ │ │ ├── CommonEditOption.cs │ │ │ └── TokenizingEditOption.cs │ │ └── OneOneFive │ │ │ ├── ActorInfo.cs │ │ │ ├── FailInfo.cs │ │ │ └── VideoInfo.cs │ ├── Enums │ │ ├── AttmnTypeEnum.cs │ │ ├── FileFormatEnum.cs │ │ ├── FileType.cs │ │ ├── NavigationViewItemEnum.cs │ │ ├── OneOneFive │ │ │ ├── FailInfoShowType.cs │ │ │ ├── FailType.cs │ │ │ └── ProgressStatus.cs │ │ ├── PartNum.cs │ │ ├── PlayQuality.cs │ │ ├── PlayerType.cs │ │ ├── SavePathEnum.cs │ │ ├── SpiderSourceName.cs │ │ ├── Status.cs │ │ ├── ThumbnailOriginType.cs │ │ ├── UploadState.cs │ │ └── UserInfo.LoginStatus.cs │ ├── Records │ │ ├── CookieKeyValue.cs │ │ ├── PageEnumAndIsVisible.cs │ │ ├── PartNumCombo.cs │ │ ├── StoreDatum.cs │ │ └── TokenData.cs │ ├── StaticData.cs │ └── Vo │ │ ├── Down │ │ └── BaseDownloader.cs │ │ ├── ExplorerItem.cs │ │ ├── FailDatum.cs │ │ ├── FailVideoInfo.cs │ │ ├── FileCategory.cs │ │ ├── FileStatistics.cs │ │ ├── Forum │ │ ├── BaiduShareInfo.cs │ │ ├── Forum1080AttachmentInfo.cs │ │ ├── Forum1080AttmnFileInfo.cs │ │ └── Forum1080SearchResult.cs │ │ ├── GetFilesProgressInfo.cs │ │ ├── Github │ │ └── LatestReleaseCheck.cs │ │ ├── IncrementalCollection │ │ ├── IncrementalLoadActorInfoCollection.cs │ │ ├── IncrementalLoadDatumCollection.cs │ │ ├── IncrementalLoadFailDatumInfoCollection.cs │ │ ├── IncrementalLoadFailInfoCollection.cs │ │ ├── IncrementalLoadFailSpiderInfoCollection.cs │ │ └── IncrementalLoadSuccessInfoCollection.cs │ │ ├── M3U8Info.cs │ │ ├── MatchVideoResult.cs │ │ ├── OneOneFive │ │ ├── DetailFileInfo.cs │ │ ├── FileUploadResult.cs │ │ ├── Sort115HomeModel.cs │ │ └── Sort115Settings.cs │ │ ├── Progress │ │ └── GetFileProgressIProgress.cs │ │ ├── Spider │ │ └── SpiderItem.cs │ │ ├── SubInfo.cs │ │ ├── ThumbnailInfo.cs │ │ ├── VideoInfoVo.cs │ │ ├── VideoToThumbnail.cs │ │ └── tsInfo.cs ├── Package.appxmanifest ├── Properties │ └── launchSettings.json ├── Providers │ ├── AppSettings.cs │ ├── DataAccessLocal.cs │ ├── Downloader │ │ ├── Aria2.cs │ │ └── Bitcomet.cs │ ├── GetActorInfoFromNetwork.cs │ ├── Searcher │ │ └── X1080X.cs │ ├── Spider │ │ ├── AvMoo.cs │ │ ├── AvSox.cs │ │ ├── BaseSpider.cs │ │ ├── Common.cs │ │ ├── Fc2hub.cs │ │ ├── JavBus.cs │ │ ├── JavDB.cs │ │ └── LibreDmm.cs │ └── WebApi.cs ├── Services │ ├── GetImageByOpenCV.cs │ ├── MediaPlayerWithStreamSource.cs │ ├── ThumbnailGeneratorService.cs │ └── Upload │ │ ├── AliyunOssUpload │ │ ├── AliyunOssService.cs │ │ ├── BaseOssUpload.cs │ │ ├── MultipartUpload.cs │ │ └── SimpleUpload.cs │ │ ├── FileUploadService.cs │ │ ├── IUpload.cs │ │ ├── UploadBase.cs │ │ ├── UploadKey.cs │ │ └── UploadSubItemService.cs ├── Streams │ ├── HttpRandomAccessStream.cs │ └── UploadSubStream.cs ├── Strings │ └── zh-cn │ │ └── Resources.resw ├── Themes │ ├── Converter.xaml │ └── Generic.xaml ├── ViewModels │ ├── ImageViewModel.cs │ ├── MainWindowViewModel.cs │ ├── MorePageViewModel.cs │ ├── SettingViewModel.cs │ ├── Sort115HomeViewModel.cs │ ├── SortSettingsViewModel.cs │ ├── SpiderTaskViewModel.cs │ ├── Sub │ │ ├── MoreNavigationItemViewModel.cs │ │ └── NavigationItemViewModel.cs │ ├── TaskViewModel.cs │ ├── ThumbnailViewModel.cs │ ├── UIShowSettingViewModel.cs │ └── UploadViewModel.cs ├── Views │ ├── Pages │ │ ├── ActorsPage.xaml │ │ ├── ActorsPage.xaml.cs │ │ ├── BasePage.cs │ │ ├── DetailInfo │ │ │ ├── DownDialogContent.xaml │ │ │ ├── DownDialogContent.xaml.cs │ │ │ ├── EditInfo.xaml │ │ │ ├── EditInfo.xaml.cs │ │ │ ├── FileInfoInCidSmoke.xaml │ │ │ ├── FileInfoInCidSmoke.xaml.cs │ │ │ ├── FindInfoAgainSmoke.xaml │ │ │ ├── FindInfoAgainSmoke.xaml.cs │ │ │ ├── SelectSingleSubFileToSelected.xaml │ │ │ ├── SelectSingleSubFileToSelected.xaml.cs │ │ │ ├── SelectVideoToPlay.xaml │ │ │ └── SelectVideoToPlay.xaml.cs │ │ ├── DetailInfoPage.xaml │ │ ├── DetailInfoPage.xaml.cs │ │ ├── HomePage.xaml │ │ ├── HomePage.xaml.cs │ │ ├── InfoPage.xaml │ │ ├── InfoPage.xaml.cs │ │ ├── More │ │ │ ├── BrowserPage.xaml │ │ │ ├── BrowserPage.xaml.cs │ │ │ ├── CalculateLocalFileSha1.xaml │ │ │ ├── CalculateLocalFileSha1.xaml.cs │ │ │ ├── DatumList │ │ │ │ ├── FileListPage.xaml │ │ │ │ ├── FileListPage.xaml.cs │ │ │ │ ├── ImagePage.xaml │ │ │ │ ├── ImagePage.xaml.cs │ │ │ │ ├── MainPage.xaml │ │ │ │ ├── MainPage.xaml.cs │ │ │ │ ├── ThumbnailPage.xaml │ │ │ │ ├── ThumbnailPage.xaml.cs │ │ │ │ ├── TransferStationFiles.cs │ │ │ │ └── VideoDisplay │ │ │ │ │ ├── MainPage.xaml │ │ │ │ │ └── MainPage.xaml.cs │ │ │ ├── Import115DataToLocalDataAccess │ │ │ │ ├── Progress.xaml │ │ │ │ └── Progress.xaml.cs │ │ │ ├── VideoPlay.xaml │ │ │ └── VideoPlay.xaml.cs │ │ ├── MorePage.xaml │ │ ├── MorePage.xaml.cs │ │ ├── OfflineDown │ │ │ ├── FailListPage.xaml │ │ │ ├── FailListPage.xaml.cs │ │ │ ├── OfflineDownPage.xaml │ │ │ └── OfflineDownPage.xaml.cs │ │ ├── SearchLink │ │ │ ├── SearchLinkPage.xaml │ │ │ └── SearchLinkPage.xaml.cs │ │ ├── SettingPage.xaml │ │ ├── SettingPage.xaml.cs │ │ ├── Settings │ │ │ ├── Account │ │ │ │ ├── CheckCookie.xaml │ │ │ │ ├── CheckCookie.xaml.cs │ │ │ │ ├── LoginPage.xaml │ │ │ │ ├── LoginPage.xaml.cs │ │ │ │ ├── VerifyAccountPage.xaml │ │ │ │ └── VerifyAccountPage.xaml.cs │ │ │ ├── AccountPage.xaml │ │ │ ├── AccountPage.xaml.cs │ │ │ ├── CommonPage.xaml │ │ │ ├── CommonPage.xaml.cs │ │ │ ├── DownPage.xaml │ │ │ ├── DownPage.xaml.cs │ │ │ ├── PlayPage.xaml │ │ │ ├── PlayPage.xaml.cs │ │ │ ├── RootPage.cs │ │ │ ├── SearchPage.xaml │ │ │ ├── SearchPage.xaml.cs │ │ │ ├── SelectedFolderPage.xaml │ │ │ ├── SelectedFolderPage.xaml.cs │ │ │ ├── SpiderPage.xaml │ │ │ ├── SpiderPage.xaml.cs │ │ │ ├── StoragePage.xaml │ │ │ ├── StoragePage.xaml.cs │ │ │ ├── UIShowPage.xaml │ │ │ ├── UIShowPage.xaml.cs │ │ │ ├── UpdateAppPage.xaml │ │ │ ├── UpdateAppPage.xaml.cs │ │ │ ├── UpdateImagePath.xaml │ │ │ └── UpdateImagePath.xaml.cs │ │ ├── Sort115 │ │ │ ├── MainPage.xaml │ │ │ ├── MainPage.xaml.cs │ │ │ ├── Settings18Page.xaml │ │ │ ├── Settings18Page.xaml.Settings.cs │ │ │ └── Settings18Page.xaml.cs │ │ ├── SpiderVideoInfo │ │ │ ├── ConditionalCheckPage.xaml │ │ │ ├── ConditionalCheckPage.xaml.cs │ │ │ ├── MainPage.xaml │ │ │ ├── MainPage.xaml.cs │ │ │ ├── Progress.xaml │ │ │ └── Progress.xaml.cs │ │ ├── TaskPage.xaml │ │ ├── TaskPage.xaml.cs │ │ ├── Tasks │ │ │ ├── SpiderTaskPage.xaml │ │ │ ├── SpiderTaskPage.xaml.cs │ │ │ ├── UploadTaskPage.xaml │ │ │ └── UploadTaskPage.xaml.cs │ │ ├── VideoCoverPage.xaml │ │ ├── VideoCoverPage.xaml.cs │ │ ├── VideoViewPage.xaml │ │ └── VideoViewPage.xaml.cs │ └── Windows │ │ ├── CommonWindow.xaml │ │ ├── CommonWindow.xaml.cs │ │ ├── LoginWindow.xaml │ │ ├── LoginWindow.xaml.cs │ │ ├── MediaPlayWindow.xaml │ │ ├── MediaPlayWindow.xaml.cs │ │ ├── SingleFrameWindow.xaml │ │ ├── SingleFrameWindow.xaml.cs │ │ ├── VideoPlayWindow.xaml │ │ └── VideoPlayWindow.xaml.cs └── app.manifest ├── LICENSE ├── README.md ├── Tests ├── DataAccess │ ├── DatabaseTest.cs │ ├── EntityTest │ │ ├── ActorInfoTest.cs │ │ ├── DownHistoryTest.cs │ │ ├── FailListIsLikeLookLaterTest.cs │ │ ├── VideoInfoDaoTest.cs │ │ └── VideoInfoTest.cs │ ├── MoreTest │ │ ├── ActorInfoTest.cs │ │ └── SubFileTest.cs │ ├── StateTest.cs │ ├── TestSettingProvider.cs │ └── UpdateDatabaseTest.cs ├── GetFilesTest.cs ├── Helper │ └── RequestHelper.cs ├── JsonTest.cs ├── LocalSettingTest.cs ├── Models │ ├── FileInfo.cs │ └── Parent.cs ├── RenameTest.cs ├── SortTest.cs ├── Tests.csproj ├── Usings.cs └── appsettings.json └── qodana.yaml /.github/ISSUE_TEMPLATE/bug_report.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: 反馈BUG 3 | about: 创建报告帮助我们改进 4 | title: '' 5 | labels: bug 6 | assignees: SingleVrUser 7 | 8 | --- 9 | 10 | **描述问题** 11 | 对出现的问题进行清晰且简洁的描述。 12 | 13 | **复现步骤** 14 | 复现问题的步骤: 15 | 1. 前往…… 16 | 2. 点击…… 17 | 3. 滚动到…… 18 | 4. 看到错误 19 | 20 | **期望行为** 21 | 简单地描述你期望发生什么。 22 | 23 | **系统信息:** 24 | - 操作系统: [如,win10, win11] 25 | 26 | **额外信息** 27 | 在这里添加关于问题的其他信息. 28 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/feature_request .md: -------------------------------------------------------------------------------- 1 | --- 2 | name: 功能需求 3 | about: 给项目提供建议 4 | title: '' 5 | labels: enhancement 6 | assignees: SingleVrUser 7 | 8 | --- 9 | 10 | **功能请求是否与某个问题有关?请描述。** 11 | 请简单地描述问题是什么。 12 | 13 | **描述希望发生的解决方案** 14 | 请简单地描述希望发生的事情。 15 | 16 | **描述您考虑过的其他替代方案** 17 | 请简单地描述您考虑过的任何其他替代解决方案或功能。 18 | 19 | **附加信息** 20 | 在这里添加有关功能请求的任何其他信息或截图。 21 | -------------------------------------------------------------------------------- /.github/release.yml: -------------------------------------------------------------------------------- 1 | # .github/release.yml 2 | 3 | changelog: 4 | exclude: 5 | labels: 6 | - ignore-for-release 7 | authors: 8 | - robot 9 | categories: 10 | - title: BUG修复 🐛 11 | labels: 12 | - bug 13 | - title: 重大变化 🛠 14 | labels: 15 | - Semver-Major 16 | - breaking-change 17 | - title: 优化 🎉 18 | labels: 19 | - Semver-Minor 20 | - enhancement 21 | - title: 其他变化 22 | labels: 23 | - "*" 24 | -------------------------------------------------------------------------------- /DataAccess/Dao/IDao.cs: -------------------------------------------------------------------------------- 1 | using System.Linq.Expressions; 2 | using DataAccess.Models.Entity; 3 | using Microsoft.EntityFrameworkCore; 4 | 5 | namespace DataAccess.Dao; 6 | 7 | public interface IDao 8 | { 9 | void ExecuteAdd(T entity); 10 | 11 | void ExecuteUpdate(Expression> predicate, Action updateAction); 12 | 13 | List List(); 14 | 15 | void SaveChanges(); 16 | 17 | void Delete(); 18 | 19 | void Attach(T entity); 20 | 21 | EntityState GetEntityState(T entity); 22 | } -------------------------------------------------------------------------------- /DataAccess/Dao/Impl/ActorNameDao.cs: -------------------------------------------------------------------------------- 1 | using System.Net.Mime; 2 | using DataAccess.Dao.Interface; 3 | using DataAccess.Models.Entity; 4 | using Microsoft.EntityFrameworkCore; 5 | 6 | namespace DataAccess.Dao.Impl; 7 | 8 | public class ActorNameDao : DaoImpl, IActorNameDao 9 | { 10 | public void ExecuteRemoveByName(string name) 11 | { 12 | // var actorNameList = (from c in DbSet where c.Name == name select c).ToList(); 13 | // actorNameList.ForEach(item => DbSet.Remove(item)); 14 | 15 | DbSet.Where(i => i.Name == name).ExecuteDelete(); 16 | } 17 | } -------------------------------------------------------------------------------- /DataAccess/Dao/Impl/ActorVideoDao.cs: -------------------------------------------------------------------------------- 1 | using DataAccess.Dao.Interface; 2 | using DataAccess.Models.Entity; 3 | 4 | namespace DataAccess.Dao.Impl; 5 | 6 | public class ActorVideoDao : DaoImpl, IActorVideoDao 7 | { 8 | 9 | } -------------------------------------------------------------------------------- /DataAccess/Dao/Impl/BwhDao.cs: -------------------------------------------------------------------------------- 1 | using DataAccess.Dao.Interface; 2 | using DataAccess.Models.Entity; 3 | 4 | namespace DataAccess.Dao.Impl; 5 | 6 | public class BwhDao : DaoImpl, IBwhDao 7 | { 8 | public Bwh? GetOne(string content) 9 | { 10 | return DbSet.FirstOrDefault(i => i.BwhContent == content); 11 | } 12 | } -------------------------------------------------------------------------------- /DataAccess/Dao/Impl/DownHistoryDao.cs: -------------------------------------------------------------------------------- 1 | using DataAccess.Dao.Interface; 2 | using DataAccess.Models.Entity; 3 | 4 | namespace DataAccess.Dao.Impl; 5 | 6 | public class DownHistoryDao : DaoImpl, IDownHistoryDao 7 | { 8 | public DownHistory? FindByPickCodeAndUa(string pickCode, string ua) 9 | { 10 | return DbSet.Find(pickCode, ua); 11 | } 12 | } -------------------------------------------------------------------------------- /DataAccess/Dao/Impl/FailListIsLikeLookLaterDao.cs: -------------------------------------------------------------------------------- 1 | using DataAccess.Dao.Interface; 2 | using DataAccess.Models.Entity; 3 | using DataAccess.Models.Enum; 4 | using Microsoft.EntityFrameworkCore; 5 | 6 | namespace DataAccess.Dao.Impl; 7 | 8 | public class FailListIsLikeLookLaterDao : DaoImpl, IFailListIsLikeLookLaterDao 9 | { 10 | public List GetInfoList(int position = 0, int take = 100, FailInfoShowType showType = FailInfoShowType.Like) 11 | { 12 | return DbSet 13 | .Skip(position) 14 | .Where(i => showType == FailInfoShowType.Like ? i.IsLike == 1 : i.LookLater != 0) 15 | .Take(take) 16 | .ToList(); 17 | } 18 | 19 | public FailListIsLikeLookLater? GetByPickCode(string pickCode) 20 | { 21 | return DbSet.Find(pickCode); 22 | } 23 | } -------------------------------------------------------------------------------- /DataAccess/Dao/Impl/FileToInfoDao.cs: -------------------------------------------------------------------------------- 1 | using DataAccess.Dao.Interface; 2 | using DataAccess.Models.Entity; 3 | using Microsoft.EntityFrameworkCore; 4 | 5 | namespace DataAccess.Dao.Impl; 6 | 7 | public class FileToInfoDao : DaoImpl, IFileToInfoDao 8 | { 9 | public void UpdateIsSuccessByTrueName(string trueName, int isSuccess) 10 | { 11 | var fileToInfos = DbSet.Where(i => i.TrueName == trueName).ToList(); 12 | foreach (var fileToInfo in fileToInfos) 13 | { 14 | fileToInfo.IsSuccess = isSuccess; 15 | } 16 | SaveChanges(); 17 | } 18 | 19 | public void ExecuteInitIfNoExists(FileToInfo info) 20 | { 21 | var fileToInfo = DbSet.AsNoTracking().FirstOrDefault(i => i.FilePickCode == info.FilePickCode); 22 | if (fileToInfo != null) return; 23 | 24 | DbSet.Add(info); 25 | SaveChanges(); 26 | } 27 | 28 | } -------------------------------------------------------------------------------- /DataAccess/Dao/Impl/IsWmDao.cs: -------------------------------------------------------------------------------- 1 | using DataAccess.Dao.Interface; 2 | using DataAccess.Models.Entity; 3 | 4 | namespace DataAccess.Dao.Impl; 5 | 6 | public class IsWmDao : DaoImpl, IIsWmDao 7 | { 8 | 9 | } -------------------------------------------------------------------------------- /DataAccess/Dao/Impl/ProducerInfoDao.cs: -------------------------------------------------------------------------------- 1 | using DataAccess.Dao.Interface; 2 | using DataAccess.Models.Entity; 3 | 4 | namespace DataAccess.Dao.Impl; 5 | 6 | public class ProducerInfoDao : DaoImpl, IProducerInfoDao 7 | { 8 | 9 | } -------------------------------------------------------------------------------- /DataAccess/Dao/Impl/SearchHistoryDao.cs: -------------------------------------------------------------------------------- 1 | using DataAccess.Dao.Interface; 2 | using DataAccess.Models.Entity; 3 | using Microsoft.EntityFrameworkCore; 4 | 5 | namespace DataAccess.Dao.Impl; 6 | 7 | public class SearchHistoryDao : DaoImpl, ISearchHistoryDao 8 | { 9 | public void ExecuteRemoveById(long id) 10 | { 11 | DbSet.Where(i => i.Id == id).ExecuteDelete(); 12 | } 13 | 14 | } -------------------------------------------------------------------------------- /DataAccess/Dao/Impl/SpiderLogDao.cs: -------------------------------------------------------------------------------- 1 | using DataAccess.Dao.Interface; 2 | using DataAccess.Models.Entity; 3 | 4 | namespace DataAccess.Dao.Impl; 5 | 6 | public class SpiderLogDao : DaoImpl, ISpiderLogDao 7 | { 8 | 9 | } -------------------------------------------------------------------------------- /DataAccess/Dao/Impl/SpiderTaskDao.cs: -------------------------------------------------------------------------------- 1 | using DataAccess.Dao.Interface; 2 | using DataAccess.Models.Entity; 3 | 4 | namespace DataAccess.Dao.Impl; 5 | 6 | public class SpiderTaskDao : DaoImpl, ISpiderTaskDao 7 | { 8 | } -------------------------------------------------------------------------------- /DataAccess/Dao/Interface/IActorInfoDao.cs: -------------------------------------------------------------------------------- 1 | using DataAccess.Models.Entity; 2 | 3 | namespace DataAccess.Dao.Interface; 4 | 5 | public interface IActorInfoDao : IDao 6 | { 7 | /// 8 | /// 通过视频的Name获取出演者的部分信息列表(不包括出演视频数) 9 | /// 10 | /// 11 | /// 12 | List GetPartListByVideoName(string videoName); 13 | 14 | /// 15 | /// 通过演员的名称(演员可能有多个名称)获取该演员的部分信息(不包含出演视频数) 16 | /// 17 | /// 18 | /// 19 | ActorInfo? GetPartInfoByActorName(string showName); 20 | 21 | List GetList(int index, int limit); 22 | 23 | List GetPageList(int index, int limit, Dictionary? orderByList = null, List? filterList = null); 24 | 25 | void UpdateAllProfilePathList(string srcPath, string dstPath); 26 | 27 | ActorInfo? GetOne(); 28 | void ExecuteUpdateById(long id, Action updateAction); 29 | } -------------------------------------------------------------------------------- /DataAccess/Dao/Interface/IActorNameDao.cs: -------------------------------------------------------------------------------- 1 | using DataAccess.Models.Entity; 2 | 3 | namespace DataAccess.Dao.Interface; 4 | 5 | public interface IActorNameDao : IDao 6 | { 7 | void ExecuteRemoveByName(string name); 8 | } -------------------------------------------------------------------------------- /DataAccess/Dao/Interface/IActorVideoDao.cs: -------------------------------------------------------------------------------- 1 | using DataAccess.Models.Entity; 2 | 3 | namespace DataAccess.Dao.Interface; 4 | 5 | public interface IActorVideoDao : IDao 6 | { 7 | } -------------------------------------------------------------------------------- /DataAccess/Dao/Interface/IBwhDao.cs: -------------------------------------------------------------------------------- 1 | using DataAccess.Models.Entity; 2 | 3 | namespace DataAccess.Dao.Interface; 4 | 5 | public interface IBwhDao : IDao 6 | { 7 | Bwh? GetOne(string content); 8 | } -------------------------------------------------------------------------------- /DataAccess/Dao/Interface/IDownHistoryDao.cs: -------------------------------------------------------------------------------- 1 | using DataAccess.Models.Entity; 2 | 3 | namespace DataAccess.Dao.Interface; 4 | 5 | public interface IDownHistoryDao : IDao 6 | { 7 | DownHistory? FindByPickCodeAndUa(string pickCode, string ua); 8 | } -------------------------------------------------------------------------------- /DataAccess/Dao/Interface/IFailListIsLikeLookLaterDao.cs: -------------------------------------------------------------------------------- 1 | using DataAccess.Models.Entity; 2 | 3 | namespace DataAccess.Dao.Interface; 4 | 5 | public interface IFailListIsLikeLookLaterDao : IDao 6 | { 7 | FailListIsLikeLookLater? GetByPickCode(string pickCode); 8 | } -------------------------------------------------------------------------------- /DataAccess/Dao/Interface/IFileToInfoDao.cs: -------------------------------------------------------------------------------- 1 | using DataAccess.Models.Entity; 2 | 3 | namespace DataAccess.Dao.Interface; 4 | 5 | public interface IFileToInfoDao : IDao 6 | { 7 | void UpdateIsSuccessByTrueName(string trueName, int isSuccess); 8 | void ExecuteInitIfNoExists(FileToInfo info); 9 | } -------------------------------------------------------------------------------- /DataAccess/Dao/Interface/IIsWmDao.cs: -------------------------------------------------------------------------------- 1 | using DataAccess.Models.Entity; 2 | 3 | namespace DataAccess.Dao.Interface; 4 | 5 | public interface IIsWmDao : IDao 6 | { 7 | } -------------------------------------------------------------------------------- /DataAccess/Dao/Interface/IProducerInfoDao.cs: -------------------------------------------------------------------------------- 1 | using DataAccess.Models.Entity; 2 | 3 | namespace DataAccess.Dao.Interface; 4 | 5 | public interface IProducerInfoDao : IDao 6 | { 7 | } -------------------------------------------------------------------------------- /DataAccess/Dao/Interface/ISearchHistoryDao.cs: -------------------------------------------------------------------------------- 1 | using DataAccess.Models.Entity; 2 | 3 | namespace DataAccess.Dao.Interface; 4 | 5 | public interface ISearchHistoryDao : IDao 6 | { 7 | /// 8 | /// 通过id删除 9 | /// 10 | /// 11 | void ExecuteRemoveById(long id); 12 | 13 | } -------------------------------------------------------------------------------- /DataAccess/Dao/Interface/ISpiderLogDao.cs: -------------------------------------------------------------------------------- 1 | using DataAccess.Models.Entity; 2 | 3 | namespace DataAccess.Dao.Interface; 4 | 5 | public interface ISpiderLogDao : IDao 6 | { 7 | } -------------------------------------------------------------------------------- /DataAccess/Dao/Interface/ISpiderTaskDao.cs: -------------------------------------------------------------------------------- 1 | using DataAccess.Models.Entity; 2 | 3 | namespace DataAccess.Dao.Interface; 4 | 5 | public interface ISpiderTaskDao : IDao 6 | { 7 | } -------------------------------------------------------------------------------- /DataAccess/Dao/Interface/IVideoInfoDao.cs: -------------------------------------------------------------------------------- 1 | using DataAccess.Models.Entity; 2 | using Microsoft.EntityFrameworkCore; 3 | 4 | namespace DataAccess.Dao.Interface; 5 | 6 | public interface IVideoInfoDao : IDao 7 | { 8 | VideoInfo? GetOneByTrueName(string name); 9 | 10 | List? GetInfoListByTrueName(string name); 11 | 12 | string? GetTrueNameByLikeName(string name); 13 | 14 | /// 15 | /// 通过name删除 16 | /// 17 | /// 18 | void ExecuteRemoveByName(string name); 19 | 20 | void UpdateAllImagePathList(string srcPath, string dstPath); 21 | Task GetLookLaterListAsync(int limit); 22 | 23 | Task GetLikeListAsync(int limit); 24 | Task GetRecentListAsync(int limit); 25 | 26 | void ExecuteUpdateByTrueName(string trueName, Action updateAction); 27 | } -------------------------------------------------------------------------------- /DataAccess/DataAccess.csproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | net8.0 5 | enable 6 | enable 7 | 8 | 9 | 10 | 11 | 12 | runtime; build; native; contentfiles; analyzers; buildtransitive 13 | all 14 | 15 | 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /DataAccess/Models/Dto/FileSpiderInfoDto.cs: -------------------------------------------------------------------------------- 1 | namespace DataAccess.Models.Dto; 2 | 3 | public class FileSpiderInfoDto 4 | { 5 | 6 | } -------------------------------------------------------------------------------- /DataAccess/Models/Dto/VideoInfoInFailStatusQueryDto.cs: -------------------------------------------------------------------------------- 1 | using DataAccess.Models.Enum; 2 | 3 | namespace DataAccess.Models.Dto; 4 | 5 | public class VideoInfoInFailStatusQueryDto 6 | { 7 | //int offset = 0, 8 | //int limit = -1, 9 | //string n = null, 10 | //string orderBy = null, 11 | //bool isDesc = false, 12 | 13 | public int Position { get; set; } 14 | 15 | public int Take { get; set; } 16 | 17 | public string? Name { get; set; } 18 | 19 | public bool IsRandom { get; set; } 20 | 21 | public SpiderFailType ShowType { get; set; } 22 | 23 | 24 | } -------------------------------------------------------------------------------- /DataAccess/Models/Entity/ActorName.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.EntityFrameworkCore; 2 | using System.ComponentModel.DataAnnotations; 3 | using System.ComponentModel.DataAnnotations.Schema; 4 | 5 | namespace DataAccess.Models.Entity; 6 | 7 | [PrimaryKey(nameof(Id), nameof(Name))] 8 | [Table("Actor_Names")] 9 | public class ActorName 10 | { 11 | [Key] 12 | [Column("id")] 13 | public long Id { get; init; } 14 | 15 | [Key] 16 | [StringLength(20)] 17 | [Column("Name")] 18 | public string Name { get; init; } = null!; 19 | } 20 | -------------------------------------------------------------------------------- /DataAccess/Models/Entity/ActorVideo.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.EntityFrameworkCore; 2 | using System.ComponentModel.DataAnnotations; 3 | using System.ComponentModel.DataAnnotations.Schema; 4 | 5 | namespace DataAccess.Models.Entity; 6 | 7 | [PrimaryKey(nameof(ActorId), nameof(VideoName))] 8 | [Table("Actor_Video")] 9 | public class ActorVideo 10 | { 11 | [Key] 12 | [Column("actor_id")] 13 | public long ActorId { get; init; } 14 | 15 | [Key] 16 | [Column("video_name")] 17 | [StringLength(20)] 18 | public string VideoName { get; init; } = null!; 19 | } 20 | -------------------------------------------------------------------------------- /DataAccess/Models/Entity/Bwh.cs: -------------------------------------------------------------------------------- 1 | using System.ComponentModel.DataAnnotations; 2 | using System.ComponentModel.DataAnnotations.Schema; 3 | 4 | namespace DataAccess.Models.Entity; 5 | 6 | [Table("bwh")] 7 | public class Bwh 8 | { 9 | [Key] 10 | [Column("bwh")] 11 | [StringLength(100)] 12 | public string BwhContent { get; init; } = null!; 13 | 14 | [Column("bust")] 15 | public int Bust { get; init; } 16 | 17 | [Column("waist")] 18 | public int Waist { get; init; } 19 | 20 | [Column("hips")] 21 | public int Hips { get; init; } 22 | 23 | public Bwh(){} 24 | 25 | public Bwh(string bwhContent) 26 | { 27 | BwhContent = bwhContent; 28 | 29 | var splitArray = bwhContent.Split('_'); 30 | 31 | if (splitArray.Length != 3) return; 32 | if(int.TryParse(splitArray[0], out var bust)) Bust = bust ; 33 | if(int.TryParse(splitArray[1], out var waist)) Waist = waist; 34 | if(int.TryParse(splitArray[2], out var hips)) Hips = hips; 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /DataAccess/Models/Entity/DownHistory.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.EntityFrameworkCore; 2 | using System.ComponentModel.DataAnnotations; 3 | using System.ComponentModel.DataAnnotations.Schema; 4 | 5 | namespace DataAccess.Models.Entity; 6 | 7 | [PrimaryKey(nameof(FilePickCode), nameof(Ua))] 8 | [Table("DownHistory")] 9 | public class DownHistory 10 | { 11 | [Key] 12 | [Column("file_pickcode")] 13 | [StringLength(18)] 14 | public string FilePickCode { get; set; } = null!; 15 | 16 | [Column("file_name")] 17 | [StringLength(500)] 18 | public required string FileName { get; init; } 19 | 20 | [Column("true_url")] 21 | [StringLength(500)] 22 | public string? TrueUrl { get; set; } 23 | 24 | [Key] 25 | [Column("ua")] 26 | [StringLength(200)] 27 | public string Ua { get; set; } = null!; 28 | 29 | [Column("add_time")] 30 | public int? AddTime { get; set; } 31 | } 32 | -------------------------------------------------------------------------------- /DataAccess/Models/Entity/FailListIsLikeLookLater.cs: -------------------------------------------------------------------------------- 1 | using System.ComponentModel.DataAnnotations; 2 | using System.ComponentModel.DataAnnotations.Schema; 3 | 4 | namespace DataAccess.Models.Entity; 5 | 6 | [Table("FailList_islike_looklater")] 7 | public class FailListIsLikeLookLater 8 | { 9 | [Key] 10 | [Column("pc")] 11 | [StringLength(20)] 12 | public string PickCode { get; set; } = null!; 13 | 14 | [Column("is_like")] 15 | public int? IsLike { get; set; } 16 | 17 | [Column("score")] 18 | public int? Score { get; set; } 19 | 20 | [Column("look_later")] 21 | public long LookLater { get; set; } 22 | 23 | [Column("image_path")] 24 | [StringLength(500)] 25 | public string? ImagePath { get; set; } 26 | } 27 | -------------------------------------------------------------------------------- /DataAccess/Models/Entity/FileToInfo.cs: -------------------------------------------------------------------------------- 1 | using System.ComponentModel.DataAnnotations; 2 | using System.ComponentModel.DataAnnotations.Schema; 3 | 4 | namespace DataAccess.Models.Entity; 5 | 6 | [Table("FileToInfo")] 7 | public class FileToInfo 8 | { 9 | [Key] 10 | [Column("file_pickcode")] 11 | [MinLength(5)] 12 | [MaxLength(20)] 13 | public string FilePickCode { get; set; } = null!; 14 | 15 | [Column("truename")] 16 | public string? TrueName { get; set; } 17 | 18 | [Column("issuccess")] 19 | public int IsSuccess { get; set; } = 0; 20 | } 21 | -------------------------------------------------------------------------------- /DataAccess/Models/Entity/IsWm.cs: -------------------------------------------------------------------------------- 1 | using System.ComponentModel.DataAnnotations; 2 | using System.ComponentModel.DataAnnotations.Schema; 3 | 4 | namespace DataAccess.Models.Entity; 5 | 6 | [Table("Is_Wm")] 7 | public class IsWm 8 | { 9 | [Key] 10 | [Column("truename")] 11 | public string Truename { get; set; } = null!; 12 | 13 | [Column("is_wm")] 14 | public int? IsWm1 { get; set; } 15 | } 16 | -------------------------------------------------------------------------------- /DataAccess/Models/Entity/ProducerInfo.cs: -------------------------------------------------------------------------------- 1 | using System.ComponentModel.DataAnnotations; 2 | using System.ComponentModel.DataAnnotations.Schema; 3 | 4 | namespace DataAccess.Models.Entity; 5 | 6 | [Table("ProducerInfo")] 7 | public class ProducerInfo 8 | { 9 | [Key] 10 | public string Name { get; set; } = null!; 11 | 12 | [Column("is_wm", TypeName = "is_wm")] 13 | public int? IsWm { get; set; } 14 | } 15 | -------------------------------------------------------------------------------- /DataAccess/Models/Entity/SearchHistory.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.EntityFrameworkCore; 2 | using System.ComponentModel.DataAnnotations; 3 | using System.ComponentModel.DataAnnotations.Schema; 4 | 5 | namespace DataAccess.Models.Entity; 6 | 7 | [Table("SearchHistory")] 8 | [Index(nameof(Keyword), IsUnique = true)] 9 | public class SearchHistory 10 | { 11 | [Key] 12 | [Column("id")] 13 | [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 14 | public int Id { get; init; } 15 | 16 | [Column("keyword", TypeName = "TEXT NO")] 17 | public string? Keyword { get; init; } 18 | } 19 | -------------------------------------------------------------------------------- /DataAccess/Models/Entity/SpiderLog.cs: -------------------------------------------------------------------------------- 1 | using System.ComponentModel.DataAnnotations; 2 | using System.ComponentModel.DataAnnotations.Schema; 3 | 4 | namespace DataAccess.Models.Entity; 5 | 6 | [Table("SpiderLog")] 7 | public class SpiderLog 8 | { 9 | [Key] 10 | [Column("task_id")] 11 | [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 12 | public int TaskId { get; set; } 13 | 14 | [Column("time")] 15 | public string? Time { get; set; } 16 | 17 | [Column("done")] 18 | public string? Done { get; set; } 19 | } 20 | -------------------------------------------------------------------------------- /DataAccess/Models/Entity/SpiderTask.cs: -------------------------------------------------------------------------------- 1 | using System.ComponentModel.DataAnnotations; 2 | using System.ComponentModel.DataAnnotations.Schema; 3 | 4 | namespace DataAccess.Models.Entity; 5 | 6 | [Table("SpiderTask")] 7 | public class SpiderTask 8 | { 9 | [Key] 10 | public string Name { get; set; } = null!; 11 | 12 | [Column("bus")] 13 | public string? Bus { get; set; } 14 | 15 | public string? Jav321 { get; set; } 16 | 17 | public string? Avmoo { get; set; } 18 | 19 | public string? Avsox { get; set; } 20 | 21 | [Column("libre")] 22 | public string? Libre { get; set; } 23 | 24 | [Column("fc")] 25 | public string? Fc { get; set; } 26 | 27 | [Column("db")] 28 | public string? Db { get; set; } 29 | 30 | [Column("done")] 31 | public int? Done { get; set; } 32 | 33 | [Column("tadk_id")] 34 | public int? TadkId { get; set; } 35 | } 36 | -------------------------------------------------------------------------------- /DataAccess/Models/Enum/FailInfoShowType.cs: -------------------------------------------------------------------------------- 1 | namespace DataAccess.Models.Enum; 2 | 3 | public enum FailInfoShowType { Like, LookLater } 4 | 5 | -------------------------------------------------------------------------------- /DataAccess/Models/Enum/FailType.cs: -------------------------------------------------------------------------------- 1 | namespace DataAccess.Models.Enum; 2 | 3 | public enum SpiderFailType { All, MatchFail, SpiderFail } -------------------------------------------------------------------------------- /DataAccess/Models/Enum/Status.cs: -------------------------------------------------------------------------------- 1 | namespace DataAccess.Models.Enum; 2 | 3 | 4 | /// 5 | /// 状态 6 | /// 7 | public enum Status { Doing, Success, Error, Pause, BeforeStart }; -------------------------------------------------------------------------------- /Display/App.res: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SingleVrUser/Display/7b8bf3298bef06f1d9c86dc49c97acf547187555/Display/App.res -------------------------------------------------------------------------------- /Display/Assets/115/115favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SingleVrUser/Display/7b8bf3298bef06f1d9c86dc49c97acf547187555/Display/Assets/115/115favicon.ico -------------------------------------------------------------------------------- /Display/Assets/115/QRCode.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SingleVrUser/Display/7b8bf3298bef06f1d9c86dc49c97acf547187555/Display/Assets/115/QRCode.png -------------------------------------------------------------------------------- /Display/Assets/115/file_type/folder/folder.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SingleVrUser/Display/7b8bf3298bef06f1d9c86dc49c97acf547187555/Display/Assets/115/file_type/folder/folder.png -------------------------------------------------------------------------------- /Display/Assets/115/file_type/folder/folder.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /Display/Assets/115/file_type/folder/folder_backup.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /Display/Assets/115/file_type/folder/folder_collect.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /Display/Assets/115/file_type/folder/folder_favorite.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /Display/Assets/115/file_type/folder/folder_group.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /Display/Assets/115/file_type/folder/folder_invisible.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /Display/Assets/115/file_type/folder/folder_lock.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /Display/Assets/115/file_type/folder/folder_offline.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /Display/Assets/115/file_type/folder/folder_person.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /Display/Assets/115/file_type/folder/folder_photo.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /Display/Assets/115/file_type/folder/folder_receive.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /Display/Assets/115/file_type/folder/folder_share.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /Display/Assets/115/file_type/folder/folder_share_person.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /Display/Assets/115/file_type/other/multi_files.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /Display/Assets/115/file_type/other/unknown.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SingleVrUser/Display/7b8bf3298bef06f1d9c86dc49c97acf547187555/Display/Assets/115/file_type/other/unknown.png -------------------------------------------------------------------------------- /Display/Assets/115/file_type/other/unknown.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /Display/Assets/115/file_type/video/avi.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /Display/Assets/115/file_type/video/mkv.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /Display/Assets/115/file_type/video/mov.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /Display/Assets/115/file_type/video/mp4.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /Display/Assets/115/file_type/video/rm.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /Display/Assets/115/file_type/video/wmv.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /Display/Assets/115/file_type/video_quality/4k.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /Display/Assets/BadgeLogo.scale-100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SingleVrUser/Display/7b8bf3298bef06f1d9c86dc49c97acf547187555/Display/Assets/BadgeLogo.scale-100.png -------------------------------------------------------------------------------- /Display/Assets/BadgeLogo.scale-125.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SingleVrUser/Display/7b8bf3298bef06f1d9c86dc49c97acf547187555/Display/Assets/BadgeLogo.scale-125.png -------------------------------------------------------------------------------- /Display/Assets/BadgeLogo.scale-150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SingleVrUser/Display/7b8bf3298bef06f1d9c86dc49c97acf547187555/Display/Assets/BadgeLogo.scale-150.png -------------------------------------------------------------------------------- /Display/Assets/BadgeLogo.scale-200.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SingleVrUser/Display/7b8bf3298bef06f1d9c86dc49c97acf547187555/Display/Assets/BadgeLogo.scale-200.png -------------------------------------------------------------------------------- /Display/Assets/BadgeLogo.scale-400.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SingleVrUser/Display/7b8bf3298bef06f1d9c86dc49c97acf547187555/Display/Assets/BadgeLogo.scale-400.png -------------------------------------------------------------------------------- /Display/Assets/Fail.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SingleVrUser/Display/7b8bf3298bef06f1d9c86dc49c97acf547187555/Display/Assets/Fail.jpg -------------------------------------------------------------------------------- /Display/Assets/FileType/file.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SingleVrUser/Display/7b8bf3298bef06f1d9c86dc49c97acf547187555/Display/Assets/FileType/file.png -------------------------------------------------------------------------------- /Display/Assets/FileType/folder.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SingleVrUser/Display/7b8bf3298bef06f1d9c86dc49c97acf547187555/Display/Assets/FileType/folder.png -------------------------------------------------------------------------------- /Display/Assets/JavBusLogo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SingleVrUser/Display/7b8bf3298bef06f1d9c86dc49c97acf547187555/Display/Assets/JavBusLogo.png -------------------------------------------------------------------------------- /Display/Assets/LargeTile.scale-100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SingleVrUser/Display/7b8bf3298bef06f1d9c86dc49c97acf547187555/Display/Assets/LargeTile.scale-100.png -------------------------------------------------------------------------------- /Display/Assets/LargeTile.scale-125.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SingleVrUser/Display/7b8bf3298bef06f1d9c86dc49c97acf547187555/Display/Assets/LargeTile.scale-125.png -------------------------------------------------------------------------------- /Display/Assets/LargeTile.scale-150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SingleVrUser/Display/7b8bf3298bef06f1d9c86dc49c97acf547187555/Display/Assets/LargeTile.scale-150.png -------------------------------------------------------------------------------- /Display/Assets/LargeTile.scale-200.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SingleVrUser/Display/7b8bf3298bef06f1d9c86dc49c97acf547187555/Display/Assets/LargeTile.scale-200.png -------------------------------------------------------------------------------- /Display/Assets/LargeTile.scale-400.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SingleVrUser/Display/7b8bf3298bef06f1d9c86dc49c97acf547187555/Display/Assets/LargeTile.scale-400.png -------------------------------------------------------------------------------- /Display/Assets/LockScreenLogo.scale-200.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SingleVrUser/Display/7b8bf3298bef06f1d9c86dc49c97acf547187555/Display/Assets/LockScreenLogo.scale-200.png -------------------------------------------------------------------------------- /Display/Assets/Logo/mpv-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SingleVrUser/Display/7b8bf3298bef06f1d9c86dc49c97acf547187555/Display/Assets/Logo/mpv-logo.png -------------------------------------------------------------------------------- /Display/Assets/Logo/potplayer-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SingleVrUser/Display/7b8bf3298bef06f1d9c86dc49c97acf547187555/Display/Assets/Logo/potplayer-logo.png -------------------------------------------------------------------------------- /Display/Assets/Logo/vlc-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SingleVrUser/Display/7b8bf3298bef06f1d9c86dc49c97acf547187555/Display/Assets/Logo/vlc-logo.png -------------------------------------------------------------------------------- /Display/Assets/NoPicture.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SingleVrUser/Display/7b8bf3298bef06f1d9c86dc49c97acf547187555/Display/Assets/NoPicture.jpg -------------------------------------------------------------------------------- /Display/Assets/SmallTile.scale-100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SingleVrUser/Display/7b8bf3298bef06f1d9c86dc49c97acf547187555/Display/Assets/SmallTile.scale-100.png -------------------------------------------------------------------------------- /Display/Assets/SmallTile.scale-125.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SingleVrUser/Display/7b8bf3298bef06f1d9c86dc49c97acf547187555/Display/Assets/SmallTile.scale-125.png -------------------------------------------------------------------------------- /Display/Assets/SmallTile.scale-150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SingleVrUser/Display/7b8bf3298bef06f1d9c86dc49c97acf547187555/Display/Assets/SmallTile.scale-150.png -------------------------------------------------------------------------------- /Display/Assets/SmallTile.scale-200.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SingleVrUser/Display/7b8bf3298bef06f1d9c86dc49c97acf547187555/Display/Assets/SmallTile.scale-200.png -------------------------------------------------------------------------------- /Display/Assets/SmallTile.scale-400.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SingleVrUser/Display/7b8bf3298bef06f1d9c86dc49c97acf547187555/Display/Assets/SmallTile.scale-400.png -------------------------------------------------------------------------------- /Display/Assets/SplashScreen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SingleVrUser/Display/7b8bf3298bef06f1d9c86dc49c97acf547187555/Display/Assets/SplashScreen.png -------------------------------------------------------------------------------- /Display/Assets/SplashScreen.scale-100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SingleVrUser/Display/7b8bf3298bef06f1d9c86dc49c97acf547187555/Display/Assets/SplashScreen.scale-100.png -------------------------------------------------------------------------------- /Display/Assets/SplashScreen.scale-125.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SingleVrUser/Display/7b8bf3298bef06f1d9c86dc49c97acf547187555/Display/Assets/SplashScreen.scale-125.png -------------------------------------------------------------------------------- /Display/Assets/SplashScreen.scale-150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SingleVrUser/Display/7b8bf3298bef06f1d9c86dc49c97acf547187555/Display/Assets/SplashScreen.scale-150.png -------------------------------------------------------------------------------- /Display/Assets/SplashScreen.scale-200.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SingleVrUser/Display/7b8bf3298bef06f1d9c86dc49c97acf547187555/Display/Assets/SplashScreen.scale-200.png -------------------------------------------------------------------------------- /Display/Assets/SplashScreen.scale-400.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SingleVrUser/Display/7b8bf3298bef06f1d9c86dc49c97acf547187555/Display/Assets/SplashScreen.scale-400.png -------------------------------------------------------------------------------- /Display/Assets/Square150x150Logo.scale-100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SingleVrUser/Display/7b8bf3298bef06f1d9c86dc49c97acf547187555/Display/Assets/Square150x150Logo.scale-100.png -------------------------------------------------------------------------------- /Display/Assets/Square150x150Logo.scale-125.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SingleVrUser/Display/7b8bf3298bef06f1d9c86dc49c97acf547187555/Display/Assets/Square150x150Logo.scale-125.png -------------------------------------------------------------------------------- /Display/Assets/Square150x150Logo.scale-150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SingleVrUser/Display/7b8bf3298bef06f1d9c86dc49c97acf547187555/Display/Assets/Square150x150Logo.scale-150.png -------------------------------------------------------------------------------- /Display/Assets/Square150x150Logo.scale-200.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SingleVrUser/Display/7b8bf3298bef06f1d9c86dc49c97acf547187555/Display/Assets/Square150x150Logo.scale-200.png -------------------------------------------------------------------------------- /Display/Assets/Square150x150Logo.scale-400.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SingleVrUser/Display/7b8bf3298bef06f1d9c86dc49c97acf547187555/Display/Assets/Square150x150Logo.scale-400.png -------------------------------------------------------------------------------- /Display/Assets/Square44x44Logo.altform-lightunplated_targetsize-16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SingleVrUser/Display/7b8bf3298bef06f1d9c86dc49c97acf547187555/Display/Assets/Square44x44Logo.altform-lightunplated_targetsize-16.png -------------------------------------------------------------------------------- /Display/Assets/Square44x44Logo.altform-lightunplated_targetsize-24.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SingleVrUser/Display/7b8bf3298bef06f1d9c86dc49c97acf547187555/Display/Assets/Square44x44Logo.altform-lightunplated_targetsize-24.png -------------------------------------------------------------------------------- /Display/Assets/Square44x44Logo.altform-lightunplated_targetsize-256.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SingleVrUser/Display/7b8bf3298bef06f1d9c86dc49c97acf547187555/Display/Assets/Square44x44Logo.altform-lightunplated_targetsize-256.png -------------------------------------------------------------------------------- /Display/Assets/Square44x44Logo.altform-lightunplated_targetsize-32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SingleVrUser/Display/7b8bf3298bef06f1d9c86dc49c97acf547187555/Display/Assets/Square44x44Logo.altform-lightunplated_targetsize-32.png -------------------------------------------------------------------------------- /Display/Assets/Square44x44Logo.altform-lightunplated_targetsize-48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SingleVrUser/Display/7b8bf3298bef06f1d9c86dc49c97acf547187555/Display/Assets/Square44x44Logo.altform-lightunplated_targetsize-48.png -------------------------------------------------------------------------------- /Display/Assets/Square44x44Logo.altform-unplated_targetsize-16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SingleVrUser/Display/7b8bf3298bef06f1d9c86dc49c97acf547187555/Display/Assets/Square44x44Logo.altform-unplated_targetsize-16.png -------------------------------------------------------------------------------- /Display/Assets/Square44x44Logo.altform-unplated_targetsize-256.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SingleVrUser/Display/7b8bf3298bef06f1d9c86dc49c97acf547187555/Display/Assets/Square44x44Logo.altform-unplated_targetsize-256.png -------------------------------------------------------------------------------- /Display/Assets/Square44x44Logo.altform-unplated_targetsize-32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SingleVrUser/Display/7b8bf3298bef06f1d9c86dc49c97acf547187555/Display/Assets/Square44x44Logo.altform-unplated_targetsize-32.png -------------------------------------------------------------------------------- /Display/Assets/Square44x44Logo.altform-unplated_targetsize-48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SingleVrUser/Display/7b8bf3298bef06f1d9c86dc49c97acf547187555/Display/Assets/Square44x44Logo.altform-unplated_targetsize-48.png -------------------------------------------------------------------------------- /Display/Assets/Square44x44Logo.scale-100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SingleVrUser/Display/7b8bf3298bef06f1d9c86dc49c97acf547187555/Display/Assets/Square44x44Logo.scale-100.png -------------------------------------------------------------------------------- /Display/Assets/Square44x44Logo.scale-125.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SingleVrUser/Display/7b8bf3298bef06f1d9c86dc49c97acf547187555/Display/Assets/Square44x44Logo.scale-125.png -------------------------------------------------------------------------------- /Display/Assets/Square44x44Logo.scale-150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SingleVrUser/Display/7b8bf3298bef06f1d9c86dc49c97acf547187555/Display/Assets/Square44x44Logo.scale-150.png -------------------------------------------------------------------------------- /Display/Assets/Square44x44Logo.scale-200.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SingleVrUser/Display/7b8bf3298bef06f1d9c86dc49c97acf547187555/Display/Assets/Square44x44Logo.scale-200.png -------------------------------------------------------------------------------- /Display/Assets/Square44x44Logo.scale-400.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SingleVrUser/Display/7b8bf3298bef06f1d9c86dc49c97acf547187555/Display/Assets/Square44x44Logo.scale-400.png -------------------------------------------------------------------------------- /Display/Assets/Square44x44Logo.targetsize-16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SingleVrUser/Display/7b8bf3298bef06f1d9c86dc49c97acf547187555/Display/Assets/Square44x44Logo.targetsize-16.png -------------------------------------------------------------------------------- /Display/Assets/Square44x44Logo.targetsize-24.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SingleVrUser/Display/7b8bf3298bef06f1d9c86dc49c97acf547187555/Display/Assets/Square44x44Logo.targetsize-24.png -------------------------------------------------------------------------------- /Display/Assets/Square44x44Logo.targetsize-24_altform-unplated.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SingleVrUser/Display/7b8bf3298bef06f1d9c86dc49c97acf547187555/Display/Assets/Square44x44Logo.targetsize-24_altform-unplated.png -------------------------------------------------------------------------------- /Display/Assets/Square44x44Logo.targetsize-256.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SingleVrUser/Display/7b8bf3298bef06f1d9c86dc49c97acf547187555/Display/Assets/Square44x44Logo.targetsize-256.png -------------------------------------------------------------------------------- /Display/Assets/Square44x44Logo.targetsize-32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SingleVrUser/Display/7b8bf3298bef06f1d9c86dc49c97acf547187555/Display/Assets/Square44x44Logo.targetsize-32.png -------------------------------------------------------------------------------- /Display/Assets/Square44x44Logo.targetsize-48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SingleVrUser/Display/7b8bf3298bef06f1d9c86dc49c97acf547187555/Display/Assets/Square44x44Logo.targetsize-48.png -------------------------------------------------------------------------------- /Display/Assets/StoreLogo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SingleVrUser/Display/7b8bf3298bef06f1d9c86dc49c97acf547187555/Display/Assets/StoreLogo.png -------------------------------------------------------------------------------- /Display/Assets/StoreLogo.scale-100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SingleVrUser/Display/7b8bf3298bef06f1d9c86dc49c97acf547187555/Display/Assets/StoreLogo.scale-100.png -------------------------------------------------------------------------------- /Display/Assets/StoreLogo.scale-125.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SingleVrUser/Display/7b8bf3298bef06f1d9c86dc49c97acf547187555/Display/Assets/StoreLogo.scale-125.png -------------------------------------------------------------------------------- /Display/Assets/StoreLogo.scale-150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SingleVrUser/Display/7b8bf3298bef06f1d9c86dc49c97acf547187555/Display/Assets/StoreLogo.scale-150.png -------------------------------------------------------------------------------- /Display/Assets/StoreLogo.scale-200.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SingleVrUser/Display/7b8bf3298bef06f1d9c86dc49c97acf547187555/Display/Assets/StoreLogo.scale-200.png -------------------------------------------------------------------------------- /Display/Assets/StoreLogo.scale-400.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SingleVrUser/Display/7b8bf3298bef06f1d9c86dc49c97acf547187555/Display/Assets/StoreLogo.scale-400.png -------------------------------------------------------------------------------- /Display/Assets/Svg/explorer_internet_logo_logos_icon.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /Display/Assets/Svg/face_male_man_portrait_icon.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /Display/Assets/Svg/file_alt_icon.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /Display/Assets/Svg/find_internet_magnifier_search_security_icon.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /Display/Assets/Svg/image_icon.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /Display/Assets/Svg/import_icon.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /Display/Assets/Svg/picture-o.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /Display/Assets/Tip/FindFolderCid.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SingleVrUser/Display/7b8bf3298bef06f1d9c86dc49c97acf547187555/Display/Assets/Tip/FindFolderCid.png -------------------------------------------------------------------------------- /Display/Assets/Wide310x150Logo.scale-100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SingleVrUser/Display/7b8bf3298bef06f1d9c86dc49c97acf547187555/Display/Assets/Wide310x150Logo.scale-100.png -------------------------------------------------------------------------------- /Display/Assets/Wide310x150Logo.scale-125.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SingleVrUser/Display/7b8bf3298bef06f1d9c86dc49c97acf547187555/Display/Assets/Wide310x150Logo.scale-125.png -------------------------------------------------------------------------------- /Display/Assets/Wide310x150Logo.scale-150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SingleVrUser/Display/7b8bf3298bef06f1d9c86dc49c97acf547187555/Display/Assets/Wide310x150Logo.scale-150.png -------------------------------------------------------------------------------- /Display/Assets/Wide310x150Logo.scale-200.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SingleVrUser/Display/7b8bf3298bef06f1d9c86dc49c97acf547187555/Display/Assets/Wide310x150Logo.scale-200.png -------------------------------------------------------------------------------- /Display/Assets/Wide310x150Logo.scale-400.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SingleVrUser/Display/7b8bf3298bef06f1d9c86dc49c97acf547187555/Display/Assets/Wide310x150Logo.scale-400.png -------------------------------------------------------------------------------- /Display/Assets/pokeball.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SingleVrUser/Display/7b8bf3298bef06f1d9c86dc49c97acf547187555/Display/Assets/pokeball.ico -------------------------------------------------------------------------------- /Display/Assets/pokeball.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SingleVrUser/Display/7b8bf3298bef06f1d9c86dc49c97acf547187555/Display/Assets/pokeball.png -------------------------------------------------------------------------------- /Display/Constants/Account.cs: -------------------------------------------------------------------------------- 1 | namespace Display.Constants; 2 | 3 | public static class Account 4 | { 5 | // “请验证账号” 6 | public const int AccountAnomalyCode = 911; 7 | public const string AccountAnomalyTip = @"\u8bf7\u9a8c\u8bc1\u8d26\u53f7"; 8 | } -------------------------------------------------------------------------------- /Display/Controls/CustomController/CursorGrid.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.UI.Input; 2 | using Microsoft.UI.Xaml.Controls; 3 | 4 | namespace Display.Controls.CustomController; 5 | 6 | internal class CursorGrid : Grid 7 | { 8 | /// 9 | /// 暴露 InputCursor 10 | /// 11 | public InputCursor Cursor 12 | { 13 | get => ProtectedCursor; 14 | set => ProtectedCursor = value; 15 | } 16 | } -------------------------------------------------------------------------------- /Display/Controls/UserController/Browser.xaml: -------------------------------------------------------------------------------- 1 |  8 | 9 | 10 | 14 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /Display/Controls/UserController/ShowCountControl.xaml.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.UI.Xaml; 2 | using Microsoft.UI.Xaml.Controls; 3 | 4 | namespace Display.Controls.UserController; 5 | 6 | public sealed partial class ShowCountControl : UserControl 7 | { 8 | public static readonly DependencyProperty CurrentCountProperty = 9 | DependencyProperty.Register(nameof(CurrentCount), typeof(int), typeof(ShowCountControl), null); 10 | public static readonly DependencyProperty AllCountProperty = 11 | DependencyProperty.Register(nameof(AllCount), typeof(int), typeof(ShowCountControl), null); 12 | 13 | 14 | public int CurrentCount 15 | { 16 | get => (int)GetValue(CurrentCountProperty); 17 | set => SetValue(CurrentCountProperty, value); 18 | } 19 | public int AllCount 20 | { 21 | get => (int)GetValue(AllCountProperty); 22 | set => SetValue(AllCountProperty, value); 23 | } 24 | 25 | public ShowCountControl() 26 | { 27 | this.InitializeComponent(); 28 | } 29 | 30 | public event RoutedEventHandler Clicked; 31 | private void ToTopButton_Click(object sender, RoutedEventArgs e) 32 | { 33 | Clicked?.Invoke(sender, e); 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /Display/Controls/UserController/StatusShow.xaml: -------------------------------------------------------------------------------- 1 |  9 | 10 | 11 | 12 | 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /Display/Controls/UserController/TextBlockWithLongText.xaml: -------------------------------------------------------------------------------- 1 |  9 | 10 | 14 | 15 | 16 | 17 | 20 | 21 | 22 | 24 | 25 | 26 | 27 | 28 | 29 | -------------------------------------------------------------------------------- /Display/Controls/UserController/TextBlockWithLongText.xaml.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.UI.Xaml; 2 | using Microsoft.UI.Xaml.Controls; 3 | 4 | // To learn more about WinUI, the WinUI project structure, 5 | // and more about our project templates, see: http://aka.ms/winui-project-info. 6 | 7 | namespace Display.Controls.UserController 8 | { 9 | public sealed partial class TextBlockWithLongText : UserControl 10 | { 11 | //显示的文本,使用 {x:bind } 赋值时一开始会为 null 12 | public string StringValue 13 | { 14 | get => (string)GetValue(StringValueProperty); 15 | set => SetValue(StringValueProperty, value); 16 | } 17 | public static readonly DependencyProperty StringValueProperty = 18 | DependencyProperty.Register(nameof(StringValue), typeof(string), typeof(TextBlockWithLongText), null); 19 | 20 | //文本是否可选中 21 | public bool IsFirstTextSelectionEnabled { get; set; } = true; 22 | public bool IsSecondTextSelectionEnabled { get; set; } = true; 23 | 24 | public TextBlockWithLongText() 25 | { 26 | this.InitializeComponent(); 27 | } 28 | 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /Display/Controls/UserController/TextBlockWithStressText.xaml: -------------------------------------------------------------------------------- 1 |  9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /Display/Converter/AppUpdateContentConvert.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.UI.Xaml.Data; 2 | using System; 3 | using System.Text.RegularExpressions; 4 | 5 | namespace Display.Converter; 6 | 7 | /// 8 | /// github的release内容格式转换 9 | /// 10 | internal class AppUpdateContentConverter : IValueConverter 11 | { 12 | public object Convert(object value, Type targetType, object parameter, string language) 13 | { 14 | if (value is not string content) return null; 15 | 16 | if (string.IsNullOrEmpty(content)) return null; 17 | 18 | //删除 by @xxx 19 | var rgx = new Regex("by @.*? ", RegexOptions.IgnoreCase); 20 | var finallyContent = rgx.Replace(content, ""); 21 | 22 | //http://……/pull/xx 替换为 #xx Markdown格式 23 | rgx = new Regex(@"https://.*?/pull/(\d+)", RegexOptions.IgnoreCase); 24 | finallyContent = rgx.Replace(finallyContent, "[#$1]($0)"); 25 | 26 | 27 | //http://……/compare/xx 替换为 xx Markdown格式 28 | rgx = new Regex(@"https://.*?/compare/([v.0-9]+)", RegexOptions.IgnoreCase); 29 | finallyContent = rgx.Replace(finallyContent, "[$1]($0)"); 30 | 31 | return finallyContent; 32 | } 33 | 34 | public object ConvertBack(object value, Type targetType, object parameter, string language) 35 | { 36 | throw new NotImplementedException(); 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /Display/Converter/BytesToSizeStrConverter.cs: -------------------------------------------------------------------------------- 1 | using ByteSizeLib; 2 | using Microsoft.UI.Xaml.Data; 3 | using System; 4 | 5 | namespace Display.Converter; 6 | 7 | /// 8 | /// bytes => xx.x MB/KB 9 | /// 10 | internal class BytesToSizeStrConverter : IValueConverter 11 | { 12 | public object Convert(object value, Type targetType, object parameter, string language) 13 | { 14 | if (value == null || !targetType.IsAssignableFrom(typeof(string))) 15 | { 16 | return string.Empty; 17 | } 18 | 19 | if (value.ToString() == "0") 20 | { 21 | return string.Empty; 22 | } 23 | 24 | var size = value switch 25 | { 26 | double doubleValue => ByteSize.FromBytes(doubleValue), 27 | long longValue => ByteSize.FromBytes(longValue), 28 | _ => new ByteSize(0) 29 | }; 30 | 31 | return size.ToString("#.#"); 32 | } 33 | 34 | public object ConvertBack(object value, Type targetType, object parameter, string language) 35 | { 36 | throw new NotImplementedException(); 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /Display/Converter/DoubleToInt32Converter.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.UI.Xaml.Data; 2 | using System; 3 | 4 | namespace Display.Converter; 5 | 6 | /// 7 | /// Double => Int 8 | /// 9 | internal class DoubleToInt32Converter : IValueConverter 10 | { 11 | public object Convert(object value, Type targetType, object parameter, string language) 12 | { 13 | return value switch 14 | { 15 | double doubleValue => (int)doubleValue, 16 | int intValue => intValue, 17 | _ => 0 18 | }; 19 | } 20 | 21 | public object ConvertBack(object value, Type targetType, object parameter, string language) 22 | { 23 | throw new NotImplementedException(); 24 | } 25 | } -------------------------------------------------------------------------------- /Display/Converter/FloatToPercentageConverter.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.UI.Xaml.Data; 2 | using System; 3 | 4 | namespace Display.Converter; 5 | 6 | /// 7 | /// 0.7 => 70% 8 | /// 9 | internal class FloatToPercentageConverter : IValueConverter 10 | { 11 | public object Convert(object value, Type targetType, object parameter, string language) 12 | { 13 | return $"{(float)value * 100:F0}%"; 14 | } 15 | 16 | public object ConvertBack(object value, Type targetType, object parameter, string language) 17 | { 18 | throw new NotImplementedException(); 19 | } 20 | } -------------------------------------------------------------------------------- /Display/Converter/NotExistsImageBitmapConverter.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.UI.Xaml.Data; 2 | using Microsoft.UI.Xaml.Media.Imaging; 3 | using Microsoft.UI.Xaml.Media; 4 | using System; 5 | using System.IO; 6 | 7 | namespace Display.Converter; 8 | 9 | /// 10 | /// imagePath is empty or not exists => new Bitmap(new Uri($"{NoPicturePath}")) 11 | /// 12 | internal class NotExistsImageBitmapConverter : IValueConverter 13 | { 14 | public object Convert(object value, Type targetType, object parameter, string language) 15 | { 16 | ImageSource imageSource; 17 | if (value is string imagePath && File.Exists(imagePath)) 18 | { 19 | imageSource = new BitmapImage(new Uri(imagePath)); 20 | 21 | return imageSource; 22 | } 23 | 24 | imageSource = new BitmapImage(new Uri(Constants.FileType.NoPicturePath)); 25 | 26 | return imageSource; 27 | } 28 | 29 | public object ConvertBack(object value, Type targetType, object parameter, string language) 30 | { 31 | throw new NotImplementedException(); 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /Display/Converter/NotExistsImageUriConverter.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.UI.Xaml.Data; 2 | using Microsoft.UI.Xaml.Media; 3 | using Microsoft.UI.Xaml.Media.Imaging; 4 | using System; 5 | using System.IO; 6 | 7 | namespace Display.Converter; 8 | 9 | /// 10 | /// imagePath is empty or not exists => $"{NoPicturePath}" 11 | /// 12 | internal class NotExistsImageUriConverter : IValueConverter 13 | { 14 | public object Convert(object value, Type targetType, object parameter, string language) 15 | { 16 | if (value is string imagePath && File.Exists(imagePath)) 17 | { 18 | return new Uri(imagePath); 19 | } 20 | 21 | return new Uri(Constants.FileType.NoPicturePath); 22 | } 23 | 24 | public object ConvertBack(object value, Type targetType, object parameter, string language) 25 | { 26 | throw new NotImplementedException(); 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /Display/Converter/NullToCollapsedConverter.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.UI.Xaml; 2 | using Microsoft.UI.Xaml.Data; 3 | using System; 4 | 5 | namespace Display.Converter; 6 | 7 | /// 8 | /// null / "" / 0 => Collapsed 9 | /// 10 | internal class NullToCollapsedConverter : IValueConverter 11 | { 12 | public object Convert(object value, Type targetType, object parameter, string language) 13 | { 14 | switch (value) 15 | { 16 | case null: 17 | case string contentStr when string.IsNullOrEmpty(contentStr): 18 | case 0: 19 | return Visibility.Collapsed; 20 | default: 21 | return Visibility.Visible; 22 | } 23 | } 24 | 25 | public object ConvertBack(object value, Type targetType, object parameter, string language) 26 | { 27 | throw new NotImplementedException(); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /Display/Converter/NumberToDateTimeStrConverter.cs: -------------------------------------------------------------------------------- 1 |  2 | using Display.Extensions; 3 | using Display.Helper.Date; 4 | using Microsoft.UI.Xaml.Data; 5 | using System; 6 | 7 | namespace Display.Converter; 8 | 9 | /// 10 | /// number(string or number format) => "yyyy/MM/dd HH:mm" 11 | /// 12 | internal class NumberToDateTimeStrConverter : IValueConverter 13 | { 14 | public object Convert(object value, Type targetType, object parameter, string language) 15 | { 16 | //2022-09-18 17:24 或者 1663493094 17 | return value switch 18 | { 19 | null => string.Empty, 20 | int intValue => DateHelper.ConvertInt32ToDateTime(intValue), 21 | string stringValue when !stringValue.IsNumber() => stringValue, 22 | string numValue => DateHelper.ConvertInt32ToDateTime(int.Parse(numValue)), 23 | _ => throw new NotImplementedException() 24 | }; 25 | } 26 | 27 | public object ConvertBack(object value, Type targetType, object parameter, string language) 28 | { 29 | throw new NotImplementedException(); 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /Display/Converter/NumberToLengthStrConverter.cs: -------------------------------------------------------------------------------- 1 |  2 | using Display.Extensions; 3 | using Display.Helper.Date; 4 | using Microsoft.UI.Xaml.Data; 5 | using System; 6 | 7 | namespace Display.Converter; 8 | 9 | /// 10 | /// 59 => 59秒 11 | /// 12 | internal class NumberToLengthStrConverter : IValueConverter 13 | { 14 | public object Convert(object value, Type targetType, object parameter, string language) 15 | { 16 | return value switch 17 | { 18 | null => string.Empty, 19 | int intValue => DateHelper.ConvertDoubleToLengthStr(intValue), 20 | double doubleValue => DateHelper.ConvertDoubleToLengthStr(doubleValue), 21 | string stringValue when !stringValue.IsNumber() => stringValue, 22 | string numValue => DateHelper.ConvertDoubleToLengthStr(int.Parse(numValue)), 23 | _ => throw new NotImplementedException() 24 | }; 25 | } 26 | 27 | public object ConvertBack(object value, Type targetType, object parameter, string language) 28 | { 29 | throw new NotImplementedException(); 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /Display/Converter/ObjectToColorConverter.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.UI; 2 | using Microsoft.UI.Xaml.Data; 3 | using Microsoft.UI.Xaml.Media; 4 | using System; 5 | using Windows.UI; 6 | 7 | namespace Display.Converter; 8 | 9 | /// 10 | /// object => SolidColorBrush 11 | /// 12 | internal class ObjectToColorConverter : IValueConverter 13 | { 14 | public object Convert(object value, Type targetType, object parameter, string language) 15 | { 16 | var color = Colors.Black; 17 | 18 | if (value == null) return new SolidColorBrush(color); 19 | 20 | var hash = value.GetHashCode(); 21 | var rnd = new Random(hash); 22 | color = Color.FromArgb(255, (byte)rnd.Next(64, 192), (byte)rnd.Next(64, 192), (byte)rnd.Next(64, 192)); 23 | return new SolidColorBrush(color); 24 | } 25 | 26 | public object ConvertBack(object value, Type targetType, object parameter, string language) 27 | { 28 | throw new NotImplementedException(); 29 | } 30 | } -------------------------------------------------------------------------------- /Display/Converter/OneToTrueConverter.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.UI.Xaml.Data; 2 | using System; 3 | 4 | namespace Display.Converter; 5 | 6 | /// 7 | /// 1 => true 8 | /// other => false 9 | /// 10 | internal class OneToTrueConverter : IValueConverter 11 | { 12 | public object Convert(object value, Type targetType, object parameter, string language) 13 | { 14 | return value is 1; 15 | } 16 | 17 | public object ConvertBack(object value, Type targetType, object parameter, string language) 18 | { 19 | throw new NotImplementedException(); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /Display/Converter/TimeStampToStringConverter.cs: -------------------------------------------------------------------------------- 1 | using Display.Helper.Date; 2 | using Microsoft.UI.Xaml.Data; 3 | using System; 4 | 5 | namespace Display.Converter; 6 | 7 | /// 8 | /// 70 => 00:01:10 9 | /// 10 | internal class TimeStampToStringConverter : IValueConverter 11 | { 12 | public object Convert(object value, Type targetType, object parameter, string language) 13 | { 14 | if (value is not long timeStamp) return "00"; 15 | 16 | DateHelper.GetTimeFromTimeStamp(timeStamp, out var hh, out var mm, out var ss); 17 | return $"{hh:D2}:{mm:D2}:{ss:D2}"; 18 | } 19 | 20 | public object ConvertBack(object value, Type targetType, object parameter, string language) 21 | { 22 | throw new NotImplementedException(); 23 | } 24 | } -------------------------------------------------------------------------------- /Display/Converter/TrueToVisibleConverter.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.UI.Xaml; 2 | using Microsoft.UI.Xaml.Data; 3 | using System; 4 | 5 | namespace Display.Converter; 6 | 7 | /// 8 | /// true => Visible; 9 | /// false => Collapsed 10 | /// 11 | public class TrueToVisibleConverter : IValueConverter 12 | { 13 | public object Convert(object value, Type targetType, object parameter, string language) 14 | { 15 | return value is true ? Visibility.Visible : Visibility.Collapsed; 16 | } 17 | 18 | public object ConvertBack(object value, Type targetType, object parameter, string language) 19 | { 20 | throw new NotImplementedException(); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /Display/Converter/ZeroToVisibleConverter.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using Microsoft.UI.Xaml; 3 | using Microsoft.UI.Xaml.Data; 4 | 5 | namespace Display.Converter; 6 | 7 | /// 8 | /// 0 => Visible 9 | /// 10 | public class ZeroToVisibleConverter : IValueConverter 11 | { 12 | public object Convert(object value, Type targetType, object parameter, string language) 13 | { 14 | return value switch 15 | { 16 | int intValue => intValue == 0 ? Visibility.Visible : Visibility.Collapsed, 17 | long longValue => longValue == 0 ? Visibility.Visible : Visibility.Collapsed, 18 | _ => Visibility.Collapsed 19 | }; 20 | } 21 | 22 | public object ConvertBack(object value, Type targetType, object parameter, string language) 23 | { 24 | throw new NotImplementedException(); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /Display/Extensions/ByteSizeExtension.cs: -------------------------------------------------------------------------------- 1 | using ByteSizeLib; 2 | 3 | namespace Display.Extensions; 4 | 5 | internal static class ByteSizeExtension 6 | { 7 | public static string ToByteSizeString(this long value, string format = "0.0") 8 | { 9 | var totalSize = ByteSize.FromBytes(value); 10 | return totalSize.ToString(format); 11 | } 12 | 13 | public static string ToByteSizeString(this double value, string format = "0.0") 14 | { 15 | var totalSize = ByteSize.FromBytes(value); 16 | return totalSize.ToString(format); 17 | } 18 | } -------------------------------------------------------------------------------- /Display/Extensions/MenuItemHelper.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.ObjectModel; 2 | using System.Linq; 3 | using Display.Models.Dto.Settings; 4 | using Display.Models.Enums; 5 | using LiveChartsCore.Collections; 6 | 7 | namespace Display.Extensions; 8 | 9 | internal static class MenuItemHelper 10 | { 11 | public static ObservableCollection ToObservableCollection(this NavigationViewItemEnum[] pageEnumArray, MenuItem[] allArray) 12 | { 13 | return new ObservableCollection(pageEnumArray.Select(pageEnum => 14 | allArray.FirstOrDefault(item => item.PageEnum == pageEnum))); 15 | } 16 | } -------------------------------------------------------------------------------- /Display/Extensions/String.Extension.cs: -------------------------------------------------------------------------------- 1 | using System.Linq; 2 | 3 | namespace Display.Extensions; 4 | 5 | internal static class String 6 | { 7 | public static long? ToNullableLong(this string value) 8 | { 9 | if (string.IsNullOrEmpty(value)) return null; 10 | 11 | return long.TryParse(value, out var longResult) ? longResult : null; 12 | } 13 | 14 | public static long ToLong(this string value) 15 | { 16 | return long.TryParse(value, out var longResult) ? longResult : 0; 17 | } 18 | 19 | 20 | /// 21 | /// 字符串内容是否为数字 22 | /// 23 | /// 24 | /// 25 | public static bool IsNumber(this string @string) 26 | { 27 | return !string.IsNullOrEmpty(@string) 28 | && @string.All(char.IsDigit); 29 | } 30 | } -------------------------------------------------------------------------------- /Display/FFmpeg/bin/x64/avcodec-60.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SingleVrUser/Display/7b8bf3298bef06f1d9c86dc49c97acf547187555/Display/FFmpeg/bin/x64/avcodec-60.dll -------------------------------------------------------------------------------- /Display/FFmpeg/bin/x64/avfilter-9.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SingleVrUser/Display/7b8bf3298bef06f1d9c86dc49c97acf547187555/Display/FFmpeg/bin/x64/avfilter-9.dll -------------------------------------------------------------------------------- /Display/FFmpeg/bin/x64/avformat-60.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SingleVrUser/Display/7b8bf3298bef06f1d9c86dc49c97acf547187555/Display/FFmpeg/bin/x64/avformat-60.dll -------------------------------------------------------------------------------- /Display/FFmpeg/bin/x64/avutil-58.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SingleVrUser/Display/7b8bf3298bef06f1d9c86dc49c97acf547187555/Display/FFmpeg/bin/x64/avutil-58.dll -------------------------------------------------------------------------------- /Display/FFmpeg/bin/x64/swresample-4.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SingleVrUser/Display/7b8bf3298bef06f1d9c86dc49c97acf547187555/Display/FFmpeg/bin/x64/swresample-4.dll -------------------------------------------------------------------------------- /Display/FFmpeg/bin/x64/swscale-7.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SingleVrUser/Display/7b8bf3298bef06f1d9c86dc49c97acf547187555/Display/FFmpeg/bin/x64/swscale-7.dll -------------------------------------------------------------------------------- /Display/FFmpeg/bin/x86/avcodec-60.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SingleVrUser/Display/7b8bf3298bef06f1d9c86dc49c97acf547187555/Display/FFmpeg/bin/x86/avcodec-60.dll -------------------------------------------------------------------------------- /Display/FFmpeg/bin/x86/avfilter-9.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SingleVrUser/Display/7b8bf3298bef06f1d9c86dc49c97acf547187555/Display/FFmpeg/bin/x86/avfilter-9.dll -------------------------------------------------------------------------------- /Display/FFmpeg/bin/x86/avformat-60.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SingleVrUser/Display/7b8bf3298bef06f1d9c86dc49c97acf547187555/Display/FFmpeg/bin/x86/avformat-60.dll -------------------------------------------------------------------------------- /Display/FFmpeg/bin/x86/avutil-58.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SingleVrUser/Display/7b8bf3298bef06f1d9c86dc49c97acf547187555/Display/FFmpeg/bin/x86/avutil-58.dll -------------------------------------------------------------------------------- /Display/FFmpeg/bin/x86/swresample-4.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SingleVrUser/Display/7b8bf3298bef06f1d9c86dc49c97acf547187555/Display/FFmpeg/bin/x86/swresample-4.dll -------------------------------------------------------------------------------- /Display/FFmpeg/bin/x86/swscale-7.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SingleVrUser/Display/7b8bf3298bef06f1d9c86dc49c97acf547187555/Display/FFmpeg/bin/x86/swscale-7.dll -------------------------------------------------------------------------------- /Display/Helper/Crypto/Crc32Helper.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | 5 | namespace Display.Helper.Crypto 6 | { 7 | public static class Crc32Helper 8 | { 9 | private static readonly uint[] CrcTable; 10 | 11 | static Crc32Helper() 12 | { 13 | const uint poly = 0xedb88320u; 14 | CrcTable = new uint[256]; 15 | for (uint i = 0; i < CrcTable.Length; ++i) 16 | { 17 | var crc = i; 18 | for (var j = 8; j > 0; --j) 19 | crc = (crc & 1) == 1 ? poly ^ crc >> 1 : crc >> 1; 20 | CrcTable[i] = crc; 21 | } 22 | } 23 | 24 | public static uint Compute(IEnumerable bytes) 25 | { 26 | var crc = bytes.Aggregate(uint.MaxValue, (current, t) => CrcTable[(current ^ t) & 0xff] ^ current >> 8); 27 | return ~crc; 28 | } 29 | public static byte[] CalcCrc32(byte[] bytes) 30 | { 31 | ArgumentNullException.ThrowIfNull(bytes); 32 | 33 | var newCrc32 = Compute(bytes); 34 | var newResult = BitConverter.GetBytes(newCrc32); 35 | 36 | return newResult; 37 | } 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /Display/Helper/Data/ClassHelper.cs: -------------------------------------------------------------------------------- 1 | using System.Linq; 2 | 3 | namespace Display.Helper.Data; 4 | 5 | internal static class ClassHelper 6 | { 7 | public static bool UpdateOldInfoByNew(ref T oldInfo, T newInfo) 8 | { 9 | var propertyInfos = typeof(T).GetProperties(); 10 | 11 | var isCompleted = true; 12 | foreach (var propertyInfo in propertyInfos) 13 | { 14 | var oldValue = propertyInfo.GetValue(oldInfo); 15 | if (oldValue != null) continue; 16 | 17 | var newValue = propertyInfo.GetValue(newInfo); 18 | if (newValue == null) 19 | { 20 | isCompleted = false; 21 | continue; 22 | } 23 | 24 | propertyInfo.SetValue(oldInfo, newValue); 25 | } 26 | 27 | return isCompleted; 28 | } 29 | 30 | public static bool InfoIsCompleted(T info, string[] alternativeList) 31 | { 32 | return info != null && info.GetType().GetProperties() 33 | .Where(propertyInfo => !alternativeList.Contains(propertyInfo.Name)) 34 | .Select(propertyInfo => propertyInfo.GetValue(info)).All(value => value != null); 35 | } 36 | } -------------------------------------------------------------------------------- /Display/Helper/Data/CookieHelper.cs: -------------------------------------------------------------------------------- 1 | using Display.Models.Data; 2 | using SharpCompress; 3 | using System.Collections.Generic; 4 | using Display.Models.Records; 5 | 6 | namespace Display.Helper.Data; 7 | 8 | internal static class CookieHelper 9 | { 10 | internal static IEnumerable ProductCookieKeyValue(string cookie) 11 | { 12 | if (string.IsNullOrEmpty(cookie)) yield break; 13 | 14 | var cookieList = cookie.Split(';'); 15 | 16 | for (var i = 0; i < cookieList.Length; i++) 17 | { 18 | var curCookie = cookieList[i]; 19 | var item = curCookie.Split('='); 20 | 21 | var key = item[0].Trim(); 22 | var value = item.Length > 1 ? item[1].Trim() : string.Empty; 23 | 24 | yield return new CookieKeyValue(i + 1, key, value); 25 | } 26 | } 27 | 28 | internal static CookieKeyValue[] FormatCookieArray(string cookie) 29 | { 30 | List result = []; 31 | ProductCookieKeyValue(cookie).ForEach(result.Add); 32 | return [.. result]; 33 | } 34 | } 35 | 36 | -------------------------------------------------------------------------------- /Display/Helper/Encode/FileEncodingHelper.cs: -------------------------------------------------------------------------------- 1 | using System.IO; 2 | using System.Text; 3 | 4 | namespace Display.Helper.Encode; 5 | 6 | public class FileEncodingHelper 7 | { 8 | public static Encoding GetEncoding(string filePath) 9 | { 10 | // 读取文件前三个字节 11 | var buffer = new byte[3]; 12 | using (FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read)) 13 | { 14 | _ = fs.Read(buffer, 0, 3); 15 | } 16 | 17 | return buffer[0] switch 18 | { 19 | // 判断编码格式 20 | 0xEF when buffer[1] == 0xBB && buffer[2] == 0xBF => Encoding.UTF8, 21 | 0xFE when buffer[1] == 0xFF => Encoding.BigEndianUnicode, 22 | 0xFF when buffer[1] == 0xFE => Encoding.Unicode, 23 | _ => Encoding.Default 24 | }; 25 | } 26 | } -------------------------------------------------------------------------------- /Display/Helper/Encode/XamlHelper.cs: -------------------------------------------------------------------------------- 1 | using System.IO; 2 | using System.Xml; 3 | 4 | namespace Display.Helper.Encode; 5 | 6 | internal class XamlHelper 7 | { 8 | internal static string ConvertXmlToString(XmlDocument xmlDoc) 9 | { 10 | using var stream = ConvertXmlToStream(xmlDoc); 11 | using var sr = new StreamReader(stream); 12 | 13 | return sr.ReadToEnd(); 14 | } 15 | 16 | internal static Stream ConvertXmlToStream(XmlDocument xmlDoc) 17 | { 18 | var stream = new MemoryStream(); 19 | 20 | var settings = new XmlWriterSettings 21 | { 22 | OmitXmlDeclaration = true, 23 | Indent = true 24 | }; 25 | var writer = XmlWriter.Create(stream, settings); 26 | xmlDoc.Save(writer); 27 | stream.Position = 0; 28 | 29 | return stream; 30 | } 31 | } -------------------------------------------------------------------------------- /Display/Helper/Notifications/NotifyConstant.cs: -------------------------------------------------------------------------------- 1 | namespace Display.Helper.Notifications; 2 | 3 | class NotifyConstant 4 | { 5 | public const string NotificationTag = "notificationId"; 6 | } 7 | -------------------------------------------------------------------------------- /Display/Helper/Notifications/Toast.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.Toolkit.Uwp.Notifications; 2 | 3 | namespace Display.Helper.Notifications; 4 | 5 | public class Toast 6 | { 7 | public static void TryToast(string title, string content1, string content2 = "") 8 | { 9 | new ToastContentBuilder() 10 | .AddArgument("action", "viewConversation") 11 | .AddArgument("conversationId", 384928) 12 | 13 | .AddText(title) 14 | 15 | .AddText(content1) 16 | 17 | .AddText(content2) 18 | 19 | .Show(); 20 | } 21 | } -------------------------------------------------------------------------------- /Display/Helper/UI/ResourceHelper.cs: -------------------------------------------------------------------------------- 1 | using Display.Models.Enums; 2 | using Display.Models.Vo.OneOneFive; 3 | using Microsoft.UI.Xaml; 4 | 5 | namespace Display.Helper.UI; 6 | 7 | internal static class ResourceHelper 8 | { 9 | internal static bool TryGetResourceValue(this FrameworkElement element, string key, out T result) 10 | { 11 | if (!element.Resources.TryGetValue(key, out var value) 12 | || value is not T tmpResult) 13 | { 14 | result = default; 15 | return false; 16 | } 17 | 18 | result = tmpResult; 19 | return true; 20 | } 21 | 22 | internal static string GetFileIconFromType(FileType fileType) 23 | { 24 | var iconUrl = Constants.FileType.UnknownSvgPath; 25 | 26 | switch (fileType) 27 | { 28 | case FileType.Folder: 29 | iconUrl = Constants.FileType.FolderSvgPath; 30 | break; 31 | case FileType.File: 32 | iconUrl = Constants.FileType.UnknownSvgPath; 33 | break; 34 | } 35 | 36 | return iconUrl; 37 | } 38 | } -------------------------------------------------------------------------------- /Display/Interfaces/IThumbnailGeneratorService.cs: -------------------------------------------------------------------------------- 1 | using FFmpeg.AutoGen.Abstractions; 2 | using System; 3 | using System.Threading.Tasks; 4 | using Display.Models.Dto.Media; 5 | using LocalThumbnail = Display.Models.Dto.Media.LocalThumbnail; 6 | 7 | namespace Display.Interfaces; 8 | 9 | internal interface IThumbnailGeneratorService 10 | { 11 | // Open url contain video 12 | bool OpenVideo(UrlOptions options); 13 | 14 | // Seek position 15 | bool SeekPosition(long timeStamp); 16 | 17 | Task DecodeAllFramesToImages(ThumbnailGenerateOptions thumbnailGenerateOptions, IProgress progress = null, AVHWDeviceType hwDevice = AVHWDeviceType.AV_HWDEVICE_TYPE_NONE); 18 | } -------------------------------------------------------------------------------- /Display/Managers/DownloadManager.cs: -------------------------------------------------------------------------------- 1 | using Display.Models.Vo.Down; 2 | using Display.Providers.Downloader; 3 | 4 | namespace Display.Managers; 5 | 6 | internal static class DownloadManager 7 | { 8 | private static BaseDownloader[] _downloader; 9 | public static BaseDownloader[] Downloads 10 | { 11 | get 12 | { 13 | return _downloader ??= [ 14 | new Bitcomet(), 15 | new Aria2() 16 | ]; 17 | } 18 | } 19 | } -------------------------------------------------------------------------------- /Display/Models/Api/Aria2/Aria2GlobalOptionRequest.cs: -------------------------------------------------------------------------------- 1 | using Display.Models.Dto.OneOneFive; 2 | using Newtonsoft.Json; 3 | 4 | namespace Display.Models.Api.Aria2; 5 | 6 | public class Aria2GlobalOptionRequest 7 | { 8 | [JsonProperty("id")] 9 | public string Id { get; set; } 10 | 11 | [JsonProperty("jsonrpc")] 12 | public string Jsonrpc { get; set; } 13 | 14 | [JsonProperty("result")] 15 | public Aria2GlobalOptionRequestResult Result { get; set; } 16 | } -------------------------------------------------------------------------------- /Display/Models/Api/Aria2/Aria2Request.cs: -------------------------------------------------------------------------------- 1 | using Newtonsoft.Json; 2 | 3 | namespace Display.Models.Api.Aria2; 4 | 5 | public class Aria2Request 6 | { 7 | [JsonProperty("id")] 8 | public string Id { get; set; } 9 | 10 | [JsonProperty("params")] 11 | public string[] Params { get; set; } 12 | 13 | [JsonProperty("jsonrpc")] 14 | public string Jsonrpc { get; set; } 15 | 16 | [JsonProperty("method")] 17 | public string Method { get; set; } 18 | } -------------------------------------------------------------------------------- /Display/Models/Api/EditorCookie/CookieFormat.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using Newtonsoft.Json; 3 | 4 | namespace Display.Models.Api.EditorCookie; 5 | 6 | public class CookieFormat 7 | { 8 | [JsonProperty("domain")] 9 | public string Domain { get; set; } = ".115.com"; 10 | 11 | [JsonProperty("expirationDate")] 12 | public long ExpirationDate { get; set; } = DateTimeOffset.Now.AddMonths(1).ToUnixTimeSeconds(); 13 | 14 | [JsonProperty("hostOnly")] 15 | public bool HostOnly { get; set; } 16 | 17 | [JsonProperty("httpOnly")] 18 | public bool HttpOnly { get; set; } = true; 19 | 20 | [JsonProperty("name")] 21 | public string Name { get; set; } 22 | 23 | [JsonProperty("path")] 24 | public string Path { get; set; } = "/"; 25 | 26 | [JsonProperty("sameSite")] 27 | public string SameSite { get; set; } 28 | 29 | [JsonProperty("secure")] 30 | public bool Secure { get; set; } 31 | 32 | [JsonProperty("session")] 33 | public bool Session { get; set; } 34 | 35 | [JsonProperty("storeId")] 36 | public string StoreId { get; set; } 37 | 38 | [JsonProperty("value")] 39 | public string Value { get; set; } 40 | } -------------------------------------------------------------------------------- /Display/Models/Api/Fc2Club/Aggregaterating.cs: -------------------------------------------------------------------------------- 1 | using Newtonsoft.Json; 2 | 3 | namespace Display.Models.Api.Fc2Club; 4 | 5 | public class Aggregaterating 6 | { 7 | [JsonProperty("type")] 8 | public string Type { get; set; } 9 | 10 | [JsonProperty("bestRating")] 11 | public int BestRating { get; set; } 12 | 13 | [JsonProperty("worstRating")] 14 | public int WorstRating { get; set; } 15 | 16 | [JsonProperty("ratingCount")] 17 | public int RatingCount { get; set; } 18 | 19 | [JsonProperty("ratingValue")] 20 | public int RatingValue { get; set; } 21 | } -------------------------------------------------------------------------------- /Display/Models/Api/Fc2Club/FcJson.cs: -------------------------------------------------------------------------------- 1 | using Newtonsoft.Json; 2 | 3 | namespace Display.Models.Api.Fc2Club; 4 | 5 | public class FcJson 6 | { 7 | [JsonProperty("context")] 8 | public string Context { get; set; } 9 | 10 | [JsonProperty("type")] 11 | public string Type { get; set; } 12 | 13 | [JsonProperty("name")] 14 | public string Name { get; set; } 15 | 16 | [JsonProperty("description")] 17 | public string Description { get; set; } 18 | 19 | [JsonProperty("image")] 20 | public string Image { get; set; } 21 | 22 | [JsonProperty("identifier")] 23 | public string[] Identifier { get; set; } 24 | 25 | [JsonProperty("datePublished")] 26 | public string DatePublished { get; set; } 27 | 28 | [JsonProperty("duration")] 29 | public string Duration { get; set; } 30 | 31 | [JsonProperty("actor")] 32 | public object[] Actor { get; set; } 33 | 34 | [JsonProperty("genre")] 35 | public string[] Genre { get; set; } 36 | 37 | [JsonProperty("sameAs")] 38 | public string[] SameAs { get; set; } 39 | 40 | [JsonProperty("director")] 41 | public string Director { get; set; } 42 | 43 | [JsonProperty("aggregateRating")] 44 | public Aggregaterating AggregateRating { get; set; } 45 | } -------------------------------------------------------------------------------- /Display/Models/Api/OneOneFive/Browser/Browser115Request.cs: -------------------------------------------------------------------------------- 1 | using Display.Models.Api.OneOneFive.Down; 2 | using Display.Models.Dto.OneOneFive; 3 | using Newtonsoft.Json; 4 | 5 | namespace Display.Models.Api.OneOneFive.Browser; 6 | 7 | /// 8 | /// 用115下载请求 9 | /// 10 | public class Browser115Request 11 | { 12 | [JsonProperty("uid")] 13 | public long Uid { get; set; } 14 | 15 | [JsonProperty("key")] 16 | public string Key { get; set; } 17 | 18 | [JsonProperty("param")] 19 | public ParamRequest Param { get; set; } 20 | 21 | [JsonProperty("type")] 22 | public int Type { get; set; } = 1; 23 | } -------------------------------------------------------------------------------- /Display/Models/Api/OneOneFive/Browser/SelectedItemInBrowser.cs: -------------------------------------------------------------------------------- 1 | using Newtonsoft.Json; 2 | 3 | namespace Display.Models.Api.OneOneFive.Browser; 4 | 5 | /// 6 | /// 浏览器选择项 7 | /// 8 | public class SelectedItemInBrowser 9 | { 10 | [JsonProperty("id")] 11 | public long Id { get; set; } 12 | 13 | [JsonProperty("name")] 14 | public string Name { get; set; } 15 | 16 | [JsonProperty("file_count")] 17 | public int FileCount { get; set; } 18 | 19 | [JsonProperty("folder_count")] 20 | public int FolderCount { get; set; } 21 | 22 | [JsonProperty("size")] 23 | public string Size { get; set; } 24 | 25 | [JsonProperty("pick_code")] 26 | public string PickCode { get; set; } 27 | 28 | [JsonProperty("file_type")] 29 | public int FileType { get; set; } 30 | 31 | [JsonProperty("file_id")] 32 | public long FileId { get; set; } 33 | 34 | /// 35 | /// 是否有隐藏文件,有为1,无为0 36 | /// 37 | 38 | [JsonProperty("hasHiddenFile")] 39 | public int HasHiddenFile { get; set; } 40 | } -------------------------------------------------------------------------------- /Display/Models/Api/OneOneFive/Browser/VerifyAccountResult.cs: -------------------------------------------------------------------------------- 1 | using Newtonsoft.Json; 2 | 3 | namespace Display.Models.Api.OneOneFive.Browser; 4 | 5 | public class VerifyAccountResult 6 | { 7 | [JsonProperty(propertyName: "state")] 8 | public bool State { get; set; } 9 | 10 | [JsonProperty(propertyName: "error")] 11 | public string Error { get; set; } 12 | 13 | [JsonProperty(propertyName: "errno")] 14 | public int Errno { get; set; } 15 | 16 | } -------------------------------------------------------------------------------- /Display/Models/Api/OneOneFive/Down/DownInfo.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using Newtonsoft.Json; 3 | 4 | namespace Display.Models.Api.OneOneFive.Down; 5 | 6 | public class DownInfo 7 | { 8 | [JsonProperty(propertyName: "file_pickcode")] 9 | public string PickCode { get; set; } 10 | 11 | 12 | [JsonProperty(propertyName: "file_name")] 13 | public string FileName { get; set; } 14 | 15 | [JsonProperty(propertyName: "true_url")] 16 | public string TrueUrl { get; set; } 17 | 18 | [JsonProperty(propertyName: "ua")] 19 | public string Ua { get; set; } 20 | 21 | [JsonProperty(propertyName: "add_time")] 22 | public long AddTime { get; set; } = DateTimeOffset.Now.ToUnixTimeSeconds(); 23 | } -------------------------------------------------------------------------------- /Display/Models/Api/OneOneFive/Down/DownRequest.cs: -------------------------------------------------------------------------------- 1 | using Newtonsoft.Json; 2 | 3 | namespace Display.Models.Api.OneOneFive.Down; 4 | 5 | public class DownRequest 6 | { 7 | [JsonProperty("n")] 8 | public string Name; 9 | 10 | [JsonProperty("pc")] 11 | public string PickCode; 12 | 13 | [JsonProperty("is_dir")] 14 | public bool IsDir; 15 | } -------------------------------------------------------------------------------- /Display/Models/Api/OneOneFive/Down/DownUrlBase64EncryptInfo.cs: -------------------------------------------------------------------------------- 1 | using Newtonsoft.Json; 2 | 3 | namespace Display.Models.Api.OneOneFive.Down; 4 | 5 | public class DownUrlBase64EncryptInfo 6 | { 7 | [JsonProperty("state")] 8 | public bool State { get; set; } 9 | 10 | [JsonProperty("msg")] 11 | public string Msg { get; set; } 12 | 13 | [JsonProperty("errno")] 14 | public int Errno { get; set; } 15 | 16 | [JsonProperty("data")] 17 | public string Data { get; set; } 18 | } -------------------------------------------------------------------------------- /Display/Models/Api/OneOneFive/Down/ParamRequest.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | using Newtonsoft.Json; 3 | 4 | namespace Display.Models.Api.OneOneFive.Down; 5 | 6 | public class ParamRequest 7 | { 8 | [JsonProperty("count")] 9 | public int Count { get; set; } 10 | 11 | [JsonProperty("ref_url")] 12 | public string RefUrl { get; set; } 13 | 14 | [JsonProperty("list")] 15 | public List List { get; set; } 16 | } -------------------------------------------------------------------------------- /Display/Models/Api/OneOneFive/File/DeleteFilesResult.cs: -------------------------------------------------------------------------------- 1 | using Newtonsoft.Json; 2 | 3 | namespace Display.Models.Api.OneOneFive.File; 4 | 5 | public class DeleteFilesResult 6 | { 7 | [JsonProperty("state")] 8 | public bool State { get; set; } 9 | 10 | [JsonProperty("error")] 11 | public string Error { get; set; } 12 | 13 | [JsonProperty("errno")] 14 | public string Errno { get; set; } 15 | } -------------------------------------------------------------------------------- /Display/Models/Api/OneOneFive/File/Flag.cs: -------------------------------------------------------------------------------- 1 | using Newtonsoft.Json; 2 | 3 | namespace Display.Models.Api.OneOneFive.File; 4 | 5 | public class Flag 6 | { 7 | [JsonProperty("id")] 8 | public string Id { get; set; } 9 | 10 | [JsonProperty("name")] 11 | public string Name { get; set; } 12 | 13 | [JsonProperty("sort")] 14 | public string Sort { get; set; } 15 | 16 | [JsonProperty("color")] 17 | public string Color { get; set; } 18 | 19 | [JsonProperty("update_time")] 20 | public int UpdateTime { get; set; } 21 | 22 | [JsonProperty("create_time")] 23 | public int CreateTime { get; set; } 24 | } -------------------------------------------------------------------------------- /Display/Models/Api/OneOneFive/File/FolderInfo.cs: -------------------------------------------------------------------------------- 1 | using Newtonsoft.Json; 2 | 3 | namespace Display.Models.Api.OneOneFive.File; 4 | 5 | internal class FolderInfo 6 | { 7 | [JsonProperty(propertyName: "name")] 8 | public string Name { get; set; } 9 | 10 | [JsonProperty(propertyName: "cid")] 11 | public string Cid { get; set; } 12 | 13 | [JsonProperty(propertyName: "pid")] 14 | public string Pid { get; set; } 15 | } -------------------------------------------------------------------------------- /Display/Models/Api/OneOneFive/File/ImageInfo.cs: -------------------------------------------------------------------------------- 1 | using Newtonsoft.Json; 2 | 3 | namespace Display.Models.Api.OneOneFive.File; 4 | 5 | internal class ImageInfo 6 | { 7 | [JsonProperty("state")] 8 | public bool State { get; set; } 9 | 10 | [JsonProperty("data")] 11 | public ImageData Data { get; set; } 12 | 13 | internal class ImageData 14 | { 15 | [JsonProperty("url")] 16 | public string Url { get; set; } 17 | 18 | [JsonProperty("all_url")] 19 | public string[] UrlArray { get; set; } 20 | 21 | [JsonProperty("origin_url")] 22 | public string OriginUrl { get; set; } 23 | 24 | 25 | [JsonProperty("source_url")] 26 | public string SourceUrl { get; set; } 27 | 28 | 29 | [JsonProperty("file_name")] 30 | public string FileName { get; set; } 31 | 32 | 33 | [JsonProperty("file_sha1")] 34 | public string FileSha1 { get; set; } 35 | 36 | 37 | [JsonProperty("pick_code")] 38 | public string PickCode { get; set; } 39 | } 40 | } -------------------------------------------------------------------------------- /Display/Models/Api/OneOneFive/File/ParentPath.cs: -------------------------------------------------------------------------------- 1 | using Newtonsoft.Json; 2 | 3 | namespace Display.Models.Api.OneOneFive.File; 4 | 5 | public class ParentPath 6 | { 7 | [JsonProperty("file_id")] 8 | public long FileId { get; set; } 9 | 10 | [JsonProperty("file_name")] 11 | public string FileName { get; set; } 12 | } -------------------------------------------------------------------------------- /Display/Models/Api/OneOneFive/File/RenameRequest.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | using Newtonsoft.Json; 3 | 4 | namespace Display.Models.Dto.OneOneFive; 5 | 6 | public class RenameRequest 7 | { 8 | [JsonProperty("state")] 9 | public bool State { get; set; } 10 | 11 | [JsonProperty("error")] 12 | public string Error { get; set; } 13 | 14 | [JsonProperty("errno")] 15 | public int Errno { get; set; } 16 | 17 | [JsonProperty("data")] 18 | public Dictionary Data { get; set; } 19 | } -------------------------------------------------------------------------------- /Display/Models/Api/OneOneFive/File/WebPath.cs: -------------------------------------------------------------------------------- 1 | using Newtonsoft.Json; 2 | 3 | namespace Display.Models.Api.OneOneFive.File; 4 | 5 | public class WebPath 6 | { 7 | [JsonProperty("name")] 8 | public string Name { get; set; } 9 | 10 | [JsonProperty("aid")] 11 | public int Aid { get; set; } 12 | 13 | [JsonProperty("cid")] 14 | public long Cid { get; set; } 15 | 16 | [JsonProperty("pid")] 17 | public long Pid { get; set; } 18 | 19 | [JsonProperty("isp")] 20 | public object Isp { get; set; } 21 | 22 | [JsonProperty("p_cid")] 23 | public string PCid { get; set; } 24 | } -------------------------------------------------------------------------------- /Display/Models/Api/OneOneFive/MakeDirRequest.cs: -------------------------------------------------------------------------------- 1 | using Newtonsoft.Json; 2 | 3 | namespace Display.Models.Api.OneOneFive; 4 | 5 | public class MakeDirRequest 6 | { 7 | [JsonProperty("state")] 8 | public bool State { get; set; } 9 | 10 | [JsonProperty("error")] 11 | public string Error { get; set; } 12 | 13 | [JsonProperty("errno")] 14 | public string Errno { get; set; } 15 | 16 | [JsonProperty("errtype")] 17 | public string ErrType { get; set; } 18 | 19 | [JsonProperty("aid")] 20 | public int Aid { get; set; } 21 | 22 | [JsonProperty("cid")] 23 | public long Cid { get; set; } 24 | 25 | [JsonProperty("cname")] 26 | public string Cname { get; set; } 27 | 28 | [JsonProperty("file_id")] 29 | public string FileId { get; set; } 30 | 31 | [JsonProperty("file_name")] 32 | public string FileName { get; set; } 33 | } -------------------------------------------------------------------------------- /Display/Models/Api/OneOneFive/OfflineDown/AddTaskBtResult.cs: -------------------------------------------------------------------------------- 1 | using Newtonsoft.Json; 2 | 3 | namespace Display.Models.Api.OneOneFive.OfflineDown; 4 | 5 | public class AddTaskBtResult 6 | { 7 | [JsonProperty("state")] 8 | public bool State { get; set; } 9 | 10 | [JsonProperty("errno")] 11 | public int Errno { get; set; } 12 | 13 | [JsonProperty("errtype")] 14 | public string ErrType { get; set; } 15 | 16 | [JsonProperty("errcode")] 17 | public int ErrCode { get; set; } 18 | 19 | [JsonProperty("info_hash")] 20 | public string InfoHash { get; set; } 21 | 22 | [JsonProperty("name")] 23 | public string Name { get; set; } 24 | 25 | [JsonProperty("start_torrent")] 26 | public int StartTorrent { get; set; } 27 | } -------------------------------------------------------------------------------- /Display/Models/Api/OneOneFive/OfflineDown/AddTaskUrlInfo.cs: -------------------------------------------------------------------------------- 1 | using Newtonsoft.Json; 2 | 3 | namespace Display.Models.Api.OneOneFive.OfflineDown; 4 | 5 | public class AddTaskUrlInfo 6 | { 7 | [JsonProperty("state")] 8 | public bool State { get; set; } 9 | 10 | [JsonProperty("errno")] 11 | public int Errno { get; set; } 12 | 13 | [JsonProperty("errcode")] 14 | public int ErrCode { get; set; } 15 | 16 | [JsonProperty("errtype")] 17 | public string ErrType { get; set; } 18 | 19 | [JsonProperty("error_msg")] 20 | public string ErrorMsg { get; set; } 21 | 22 | [JsonProperty("info_hash")] 23 | public string InfoHash { get; set; } 24 | 25 | [JsonProperty("url")] 26 | public string Url { get; set; } 27 | 28 | [JsonProperty("AddTaskUrlInfo")] 29 | public AddTaskUrlInfo[] Result { get; set; } 30 | } -------------------------------------------------------------------------------- /Display/Models/Api/OneOneFive/OfflineDown/OfflineDownPathData.cs: -------------------------------------------------------------------------------- 1 | using Newtonsoft.Json; 2 | 3 | namespace Display.Models.Api.OneOneFive.OfflineDown; 4 | 5 | public class OfflineDownPathData 6 | { 7 | [JsonProperty("id")] 8 | public string Id { get; set; } 9 | 10 | [JsonProperty("user_id")] 11 | public int UserId { get; set; } 12 | 13 | [JsonProperty("file_id")] 14 | public long FileId { get; set; } 15 | 16 | [JsonProperty("update_time")] 17 | public string UpdateTime { get; set; } 18 | 19 | [JsonProperty("is_selected")] 20 | public string IsSelected { get; set; } 21 | 22 | [JsonProperty("file_name")] 23 | public string FileName { get; set; } 24 | } -------------------------------------------------------------------------------- /Display/Models/Api/OneOneFive/OfflineDown/OfflineDownPathRequest.cs: -------------------------------------------------------------------------------- 1 | using Newtonsoft.Json; 2 | 3 | namespace Display.Models.Api.OneOneFive.OfflineDown; 4 | 5 | public class OfflineDownPathRequest 6 | { 7 | [JsonProperty("state")] 8 | public bool State { get; set; } 9 | 10 | [JsonProperty("error")] 11 | public object Error { get; set; } 12 | 13 | [JsonProperty("errno")] 14 | public object Errno { get; set; } 15 | 16 | [JsonProperty("data")] 17 | public OfflineDownPathData[] Data { get; set; } 18 | 19 | } -------------------------------------------------------------------------------- /Display/Models/Api/OneOneFive/OfflineDown/OfflineSpaceInfo.cs: -------------------------------------------------------------------------------- 1 | using Newtonsoft.Json; 2 | 3 | namespace Display.Models.Api.OneOneFive.OfflineDown; 4 | 5 | public class OfflineSpaceInfo 6 | { 7 | [JsonProperty("state")] 8 | public bool State { get; set; } 9 | 10 | [JsonProperty("data")] 11 | public long Data { get; set; } 12 | 13 | [JsonProperty("size")] 14 | public string Size { get; set; } 15 | 16 | [JsonProperty("url")] 17 | public string Url { get; set; } 18 | 19 | [JsonProperty("bt_url")] 20 | public string BtUrl { get; set; } 21 | 22 | [JsonProperty("limit")] 23 | public long Limit { get; set; } 24 | 25 | [JsonProperty("sign")] 26 | public string Sign { get; set; } 27 | 28 | [JsonProperty("time")] 29 | public int Time { get; set; } 30 | } -------------------------------------------------------------------------------- /Display/Models/Api/OneOneFive/OfflineDown/TorrentCidResult.cs: -------------------------------------------------------------------------------- 1 | using Newtonsoft.Json; 2 | 3 | namespace Display.Models.Api.OneOneFive.OfflineDown; 4 | 5 | public class TorrentCidResult 6 | { 7 | [JsonProperty("cid")] 8 | public long Cid { get; set; } 9 | } -------------------------------------------------------------------------------- /Display/Models/Api/OneOneFive/OfflineDown/TorrentInfoResult.cs: -------------------------------------------------------------------------------- 1 | using Newtonsoft.Json; 2 | 3 | namespace Display.Models.Api.OneOneFive.OfflineDown; 4 | 5 | public class TorrentInfoResult 6 | { 7 | [JsonProperty("state")] 8 | public bool State { get; set; } 9 | 10 | [JsonProperty("error_msg")] 11 | public string ErrorMsg { get; set; } 12 | 13 | [JsonProperty("errno")] 14 | public int Errno { get; set; } 15 | 16 | [JsonProperty("errtype")] 17 | public string ErrType { get; set; } 18 | 19 | [JsonProperty("errcode")] 20 | public int ErrCode { get; set; } 21 | 22 | [JsonProperty("file_size")] 23 | public long FileSize { get; set; } 24 | 25 | [JsonProperty("torrent_name")] 26 | public string TorrentName { get; set; } 27 | 28 | [JsonProperty("file_count")] 29 | public int FileCount { get; set; } 30 | 31 | [JsonProperty("info_hash")] 32 | public string InfoHash { get; set; } 33 | 34 | [JsonProperty("torrent_filelist_web")] 35 | public TorrentFileListWeb[] TorrentFileListWeb { get; set; } 36 | 37 | 38 | } -------------------------------------------------------------------------------- /Display/Models/Api/OneOneFive/OfflineDown/Torrent_Filelist_Web.cs: -------------------------------------------------------------------------------- 1 | using Newtonsoft.Json; 2 | 3 | namespace Display.Models.Api.OneOneFive.OfflineDown; 4 | 5 | public class TorrentFileListWeb 6 | { 7 | [JsonProperty("size")] 8 | public long Size { get; set; } 9 | 10 | [JsonProperty("path")] 11 | public string Path { get; set; } 12 | 13 | [JsonProperty("wanted")] 14 | public int Wanted { get; set; } 15 | } -------------------------------------------------------------------------------- /Display/Models/Api/OneOneFive/QRCodeInfoResult.cs: -------------------------------------------------------------------------------- 1 | using Display.Models.Api.OneOneFive.User; 2 | 3 | namespace Display.Models.Api.OneOneFive; 4 | 5 | public class QRCodeInfoResult 6 | { 7 | public int state { get; set; } 8 | public int code { get; set; } 9 | public string message { get; set; } 10 | public InfoData data { get; set; } 11 | } -------------------------------------------------------------------------------- /Display/Models/Api/OneOneFive/QRCodeStatusResult.cs: -------------------------------------------------------------------------------- 1 | using Display.Models.Dto.OneOneFive; 2 | using Newtonsoft.Json; 3 | 4 | namespace Display.Models.Api.OneOneFive; 5 | 6 | public class QRCodeStatusResult 7 | { 8 | [JsonProperty("state")] 9 | public int State { get; set; } 10 | 11 | [JsonProperty("code")] 12 | public int Code { get; set; } 13 | 14 | [JsonProperty("message")] 15 | public string Message { get; set; } 16 | 17 | [JsonProperty("data")] 18 | public StatusInfo Data { get; set; } 19 | } -------------------------------------------------------------------------------- /Display/Models/Api/OneOneFive/Result.cs: -------------------------------------------------------------------------------- 1 | using Display.Models.Api.OneOneFive.File; 2 | using Display.Models.Dto.OneOneFive; 3 | using Newtonsoft.Json; 4 | using UserInfo = Display.Models.Api.OneOneFive.User.UserInfo; 5 | 6 | namespace Display.Models.Api.OneOneFive; 7 | 8 | public class Result 9 | { 10 | [JsonProperty("state")] 11 | public int State { get; set; } 12 | 13 | [JsonProperty("error")] 14 | public string Error { get; set; } 15 | 16 | [JsonProperty("errno")] 17 | public int Errno { get; set; } 18 | 19 | [JsonProperty("message")] 20 | public string Message { get; set; } 21 | 22 | [JsonProperty("code")] 23 | public int Code { get; set; } 24 | 25 | [JsonProperty("data")] 26 | public UserInfo Data { get; set; } 27 | } -------------------------------------------------------------------------------- /Display/Models/Api/OneOneFive/Search/CurrUser.cs: -------------------------------------------------------------------------------- 1 | using Newtonsoft.Json; 2 | 3 | namespace Display.Models.Api.OneOneFive.Search; 4 | 5 | public class CurrUser 6 | { 7 | [JsonProperty("state")] 8 | public bool State { get; set; } 9 | 10 | [JsonProperty("user_id")] 11 | public int UserId { get; set; } 12 | 13 | [JsonProperty("error_code")] 14 | public int ErrorCode { get; set; } 15 | 16 | [JsonProperty("error_msg")] 17 | public string ErrorMsg { get; set; } 18 | 19 | [JsonProperty("last_login")] 20 | public int LastLogin { get; set; } 21 | 22 | [JsonProperty("ssoent")] 23 | public string Ssoent { get; set; } 24 | 25 | [JsonProperty("user_name")] 26 | public int UserName { get; set; } 27 | } -------------------------------------------------------------------------------- /Display/Models/Api/OneOneFive/Search/ShaSearchResult.cs: -------------------------------------------------------------------------------- 1 | using Display.Models.Dto.OneOneFive; 2 | using Newtonsoft.Json; 3 | 4 | namespace Display.Models.Api.OneOneFive.Search; 5 | 6 | public class ShaSearchResult 7 | { 8 | [JsonProperty("sha1")] 9 | public string Sha1 { get; set; } 10 | 11 | [JsonProperty("_")] 12 | public string Other { get; set; } 13 | 14 | [JsonProperty("curr_user")] 15 | public CurrUser CurrUser { get; set; } 16 | 17 | [JsonProperty("user_id")] 18 | public int UserId { get; set; } 19 | 20 | [JsonProperty("data")] 21 | public ShaSearchResultData Data { get; set; } 22 | 23 | [JsonProperty("state")] 24 | public bool State { get; set; } 25 | 26 | [JsonProperty("error")] 27 | public string Error { get; set; } 28 | } -------------------------------------------------------------------------------- /Display/Models/Api/OneOneFive/Search/ShaSearchResultData.cs: -------------------------------------------------------------------------------- 1 | using Newtonsoft.Json; 2 | 3 | namespace Display.Models.Api.OneOneFive.Search; 4 | 5 | public class ShaSearchResultData 6 | { 7 | [JsonProperty("file_id")] 8 | public string FileId { get; set; } 9 | 10 | [JsonProperty("file_name")] 11 | public string FileName { get; set; } 12 | 13 | [JsonProperty("file_size")] 14 | public string FileSize { get; set; } 15 | 16 | [JsonProperty("pick_code")] 17 | public string PickCode { get; set; } 18 | 19 | [JsonProperty("is_share")] 20 | public string IsShare { get; set; } 21 | 22 | [JsonProperty("category_id")] 23 | public string CategoryId { get; set; } 24 | 25 | [JsonProperty("area_id")] 26 | public string AreaId { get; set; } 27 | 28 | [JsonProperty("ico")] 29 | public string Ico { get; set; } 30 | } -------------------------------------------------------------------------------- /Display/Models/Api/OneOneFive/Setting/_115Setting.cs: -------------------------------------------------------------------------------- 1 | using Display.Models.Api.OneOneFive.User; 2 | using Display.Models.Dto.OneOneFive; 3 | using Newtonsoft.Json; 4 | 5 | namespace Display.Models.Api.OneOneFive.Setting; 6 | 7 | public class _115Setting 8 | { 9 | [JsonProperty("state")] 10 | public bool State { get; set; } 11 | 12 | [JsonProperty("_goto")] 13 | public string Goto { get; set; } 14 | 15 | [JsonProperty("even")] 16 | public string Even { get; set; } 17 | 18 | [JsonProperty("data")] 19 | public SettingInfo Info { get; set; } 20 | 21 | [JsonProperty("flush")] 22 | public bool Flush { get; set; } 23 | } -------------------------------------------------------------------------------- /Display/Models/Api/OneOneFive/Upload/FastUploadResult.cs: -------------------------------------------------------------------------------- 1 | using Newtonsoft.Json; 2 | 3 | namespace Display.Models.Api.OneOneFive.Upload; 4 | 5 | public class FastUploadResult 6 | { 7 | 8 | [JsonProperty("request")] 9 | public string Request { get; set; } 10 | 11 | [JsonProperty("status")] 12 | public int Status { get; set; } 13 | 14 | [JsonProperty("statuscode")] 15 | public int StatusCode { get; set; } 16 | 17 | [JsonProperty("statusmsg")] 18 | public string StatusMsg { get; set; } 19 | 20 | [JsonProperty("pickcode")] 21 | public string PickCode { get; set; } 22 | 23 | [JsonProperty("target")] 24 | public string Target { get; set; } 25 | 26 | [JsonProperty("version")] 27 | public string Version { get; set; } 28 | 29 | [JsonProperty("sign_key")] 30 | public string SignKey { get; set; } 31 | 32 | [JsonProperty("sign_check")] 33 | public string SignCheck { get; set; } 34 | 35 | [JsonProperty("bucket")] 36 | public string Bucket { get; set; } 37 | 38 | [JsonProperty("object")] 39 | public string Object { get; set; } 40 | 41 | [JsonProperty("OssCallback")] 42 | public OssCallback OssCallback { get; set; } 43 | } -------------------------------------------------------------------------------- /Display/Models/Api/OneOneFive/Upload/OssCallback.cs: -------------------------------------------------------------------------------- 1 | using Newtonsoft.Json; 2 | 3 | namespace Display.Models.Api.OneOneFive.Upload; 4 | 5 | public class OssCallback 6 | { 7 | [JsonProperty("callback")] 8 | public string Callback { get; set; } 9 | 10 | [JsonProperty("callback_var")] 11 | public string CallbackVar { get; set; } 12 | } -------------------------------------------------------------------------------- /Display/Models/Api/OneOneFive/Upload/OssToken.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using Newtonsoft.Json; 3 | 4 | namespace Display.Models.Api.OneOneFive.Upload; 5 | 6 | public class OssToken 7 | { 8 | public string StatusCode { get; set; } 9 | 10 | public string AccessKeySecret { get; set; } 11 | 12 | public string SecurityToken { get; set; } 13 | 14 | public DateTime Expiration { get; set; } 15 | 16 | [JsonProperty("AccessKeyId")] 17 | public string AccessKeyId { get; set; } 18 | } -------------------------------------------------------------------------------- /Display/Models/Api/OneOneFive/Upload/OssUpload.cs: -------------------------------------------------------------------------------- 1 | using Newtonsoft.Json; 2 | 3 | namespace Display.Models.Api.OneOneFive.Upload; 4 | 5 | public class OssUploadResultData 6 | { 7 | [JsonProperty("pick_code")] 8 | public string PickCode { get; } 9 | 10 | [JsonProperty("file_size")] 11 | public long FileSize { get; } 12 | 13 | [JsonProperty("file_id")] 14 | public long FileId { get; } 15 | 16 | [JsonProperty("thumb_url")] 17 | public string ThumbUrl { get; } 18 | 19 | [JsonProperty("sha1")] 20 | public string Sha1 { get; } 21 | 22 | [JsonProperty("aid")] 23 | public int Aid { get; } 24 | 25 | [JsonProperty("file_name")] 26 | public string FileName { get; } 27 | 28 | [JsonProperty("cid")] 29 | public long Cid { get; } 30 | 31 | [JsonProperty("is_video")] 32 | public int IsVideo { get; } 33 | } -------------------------------------------------------------------------------- /Display/Models/Api/OneOneFive/Upload/OssUploadResult.cs: -------------------------------------------------------------------------------- 1 | using Newtonsoft.Json; 2 | 3 | namespace Display.Models.Api.OneOneFive.Upload; 4 | 5 | public class OssUploadResult 6 | { 7 | [JsonProperty("state")] 8 | public bool State { get; set; } 9 | 10 | [JsonProperty("message")] 11 | public string Message { get; set; } 12 | 13 | [JsonProperty("code")] 14 | public int Code { get; set; } 15 | 16 | [JsonProperty("data")] 17 | public OssUploadResultData Data { get; set; } 18 | 19 | public override string ToString() 20 | { 21 | return $"{{\"state\":{State},\"message\":\"{Message}\",\"code\":{Code},\"data\":{{\"pick_code\":\"{Data.PickCode}\",\"file_size\":{Data.FileSize},\"file_id\":\"{Data.FileSize}\",\"thumb_url\":\"{Data.ThumbUrl}\",\"sha1\":\"{Data.Sha1}\",\"aid\":{Data.Aid},\"file_name\":\"{Data.FileName}\",\"cid\":\"{Data.Cid}\",\"is_video\":{Data.IsVideo}}}"; 22 | } 23 | } -------------------------------------------------------------------------------- /Display/Models/Api/OneOneFive/User/Cookie.cs: -------------------------------------------------------------------------------- 1 | using Newtonsoft.Json; 2 | using Newtonsoft.Json.Serialization; 3 | 4 | namespace Display.Models.Api.OneOneFive.User; 5 | 6 | public class Cookie 7 | { 8 | [JsonProperty("UID")] 9 | public string UID { get; set; } 10 | 11 | [JsonProperty("CID")] 12 | public string CID { get; set; } 13 | 14 | [JsonProperty("SEID")] 15 | public string SEID { get; set; } 16 | } -------------------------------------------------------------------------------- /Display/Models/Api/OneOneFive/User/Face.cs: -------------------------------------------------------------------------------- 1 | using Newtonsoft.Json; 2 | 3 | namespace Display.Models.Api.OneOneFive.User; 4 | 5 | public class Face 6 | { 7 | [JsonProperty("face_l")] 8 | public string FaceL { get; set; } 9 | 10 | [JsonProperty("face_m")] 11 | public string FaceM { get; set; } 12 | 13 | [JsonProperty("face_s")] 14 | public string FaceS { get; set; } 15 | } -------------------------------------------------------------------------------- /Display/Models/Api/OneOneFive/User/InfoData.cs: -------------------------------------------------------------------------------- 1 | using Newtonsoft.Json; 2 | 3 | namespace Display.Models.Api.OneOneFive.User; 4 | 5 | public class InfoData 6 | { 7 | [JsonProperty("uid")] 8 | public string Uid { get; set; } 9 | 10 | [JsonProperty("time")] 11 | public int Time { get; set; } 12 | 13 | [JsonProperty("sign")] 14 | public string Sign { get; set; } 15 | 16 | [JsonProperty("qrcode")] 17 | public string Qrcode { get; set; } 18 | } -------------------------------------------------------------------------------- /Display/Models/Api/OneOneFive/User/Privilege.cs: -------------------------------------------------------------------------------- 1 | using Newtonsoft.Json; 2 | 3 | namespace Display.Models.Api.OneOneFive.User; 4 | 5 | public class Privilege 6 | { 7 | [JsonProperty("start")] 8 | public int Start { get; set; } 9 | 10 | [JsonProperty("expire")] 11 | public long Expire { get; set; } 12 | 13 | [JsonProperty("state")] 14 | public bool State { get; set; } 15 | 16 | [JsonProperty("mark")] 17 | public int Mark { get; set; } 18 | } -------------------------------------------------------------------------------- /Display/Models/Api/OneOneFive/User/StatusInfo.cs: -------------------------------------------------------------------------------- 1 | using Newtonsoft.Json; 2 | 3 | namespace Display.Models.Dto.OneOneFive; 4 | 5 | public class StatusInfo 6 | { 7 | [JsonProperty("msg")] 8 | public string Msg { get; set; } 9 | 10 | [JsonProperty("status")] 11 | public int Status { get; set; } 12 | 13 | [JsonProperty("version")] 14 | public string Version { get; set; } 15 | } -------------------------------------------------------------------------------- /Display/Models/Api/OneOneFive/UserInfoResult.cs: -------------------------------------------------------------------------------- 1 | using Display.Models.Api.OneOneFive.User; 2 | using Display.Models.Dto.OneOneFive; 3 | using Newtonsoft.Json; 4 | 5 | namespace Display.Models.Api.OneOneFive; 6 | 7 | public class UserInfoResult 8 | { 9 | [JsonProperty("state")] 10 | public bool State { get; set; } 11 | 12 | [JsonProperty("error")] 13 | public string Error { get; set; } 14 | 15 | [JsonProperty("data")] 16 | public UserData Data { get; set; } 17 | } -------------------------------------------------------------------------------- /Display/Models/Dto/HistorySearchItem.cs: -------------------------------------------------------------------------------- 1 | using DataAccess.Models.Entity; 2 | 3 | namespace Display.Models.Dto; 4 | 5 | public record HistorySearchItem(SearchHistory[] KeywordArray); 6 | -------------------------------------------------------------------------------- /Display/Models/Dto/Media/BaseImage.cs: -------------------------------------------------------------------------------- 1 | #nullable enable 2 | using System; 3 | using System.Threading.Tasks; 4 | using Windows.Storage; 5 | using CommunityToolkit.Mvvm.ComponentModel; 6 | using Microsoft.UI.Xaml.Media.Imaging; 7 | 8 | namespace Display.Models.Dto.Media; 9 | 10 | public abstract partial class BaseImage : ObservableObject 11 | { 12 | public string? Path { get; set; } 13 | 14 | public BitmapImage? Thumbnail; 15 | 16 | [ObservableProperty] 17 | private string? _dimensions; 18 | 19 | public async Task SetBitmap(string path) 20 | { 21 | Path = path; 22 | 23 | Thumbnail = new BitmapImage 24 | { 25 | DecodePixelHeight = 60 26 | }; 27 | var imageFile = await StorageFile.GetFileFromPathAsync(path); 28 | using var fileStream = await imageFile.OpenAsync(FileAccessMode.Read); 29 | await Thumbnail.SetSourceAsync(fileStream); 30 | 31 | Dimensions = $"{Thumbnail.PixelWidth} x {Thumbnail.PixelHeight}"; 32 | } 33 | } -------------------------------------------------------------------------------- /Display/Models/Dto/Media/LocalThumbnail.cs: -------------------------------------------------------------------------------- 1 | #nullable enable 2 | using CommunityToolkit.Mvvm.ComponentModel; 3 | 4 | namespace Display.Models.Dto.Media; 5 | 6 | public partial class LocalThumbnail(long timeStamp) : BaseImage 7 | { 8 | [ObservableProperty] 9 | private long _timeStamp = timeStamp; 10 | } -------------------------------------------------------------------------------- /Display/Models/Dto/Media/ThumbnailGenerateOptions.cs: -------------------------------------------------------------------------------- 1 | namespace Display.Models.Dto.Media; 2 | 3 | public class ThumbnailGenerateOptions 4 | { 5 | public readonly int FrameCount = 10; 6 | 7 | public string SavePath; 8 | 9 | public string StringFormat; 10 | 11 | public UrlOptions UrlOptions; 12 | } -------------------------------------------------------------------------------- /Display/Models/Dto/Media/UrlOptions.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | 3 | namespace Display.Models.Dto.Media; 4 | 5 | public class UrlOptions 6 | { 7 | public string Url { get; init; } 8 | 9 | public Dictionary Headers { get; init; } 10 | 11 | public bool IsM3U8 => Url.Contains("m3u8"); 12 | } -------------------------------------------------------------------------------- /Display/Models/Dto/Settings/BaseMenuItem.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Text.Json.Serialization; 3 | using CommunityToolkit.Mvvm.ComponentModel; 4 | using Display.Models.Enums; 5 | using Microsoft.UI.Xaml.Controls; 6 | 7 | namespace Display.Models.Dto.Settings; 8 | 9 | public abstract partial class BaseMenuItem(NavigationViewItemEnum pageEnum, string content, string glyph, Type pageType) : ObservableObject 10 | { 11 | public NavigationViewItemEnum PageEnum { get; } = pageEnum; 12 | public string Content { get; } = content; 13 | public Type PageType { get; } = pageType; 14 | public string Glyph { get; } = glyph; 15 | 16 | public bool CanSelected { get; init; } = true; 17 | 18 | /// 19 | /// 图标,重复显示IconElement可能会报错 20 | /// 21 | /// 22 | [JsonIgnore] 23 | public IconElement Icon => 24 | new FontIcon 25 | { 26 | Glyph = Glyph 27 | }; 28 | 29 | [ObservableProperty] 30 | private bool _isVisible = true; 31 | } -------------------------------------------------------------------------------- /Display/Models/Dto/Settings/MenuItem.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using Display.Models.Enums; 3 | 4 | namespace Display.Models.Dto.Settings; 5 | 6 | public class MenuItem(NavigationViewItemEnum pageEnum, string content, string glyph, Type pageType) : BaseMenuItem(pageEnum, content, glyph, pageType) 7 | { 8 | 9 | } -------------------------------------------------------------------------------- /Display/Models/Dto/Settings/MoreMenuItem.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using Display.Models.Enums; 3 | using Microsoft.UI.Xaml; 4 | 5 | namespace Display.Models.Dto.Settings; 6 | 7 | public class MoreMenuItem(NavigationViewItemEnum pageEnum ,string content, string description, string glyph, Type pageType) : BaseMenuItem(pageEnum, content, glyph, pageType) 8 | { 9 | public string Description { get; } = description; 10 | public string Label { get; set; } 11 | public Visibility IsRightTopLabelShow => string.IsNullOrEmpty(Label) ? Visibility.Collapsed : Visibility.Visible; 12 | } -------------------------------------------------------------------------------- /Display/Models/Dto/Settings/Options/DownApiSettings.cs: -------------------------------------------------------------------------------- 1 | namespace Display.Models.Dto.Settings.Options; 2 | 3 | public class DownApiSettings 4 | { 5 | public string UserName { get; init; } 6 | public string Password { get; init; } 7 | public string ApiUrl { get; init; } 8 | } -------------------------------------------------------------------------------- /Display/Models/Dto/Settings/Options/Downloader.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.ComponentModel; 4 | using System.Runtime.CompilerServices; 5 | 6 | namespace Display.Models.Dto.Settings.Options; 7 | 8 | internal class Downloader(string name) : INotifyPropertyChanged 9 | { 10 | public string Name { get; set; } = name; 11 | public string Description { get; set; } 12 | public string ApiPlaceholder { get; set; } 13 | public string ApiText { get; set; } 14 | 15 | public Action SavePathAction { get; set; } 16 | public Func ResetPathFunc { get; set; } 17 | 18 | 19 | public event PropertyChangedEventHandler PropertyChanged; 20 | 21 | protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null) 22 | { 23 | PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); 24 | } 25 | 26 | protected bool SetField(ref T field, T value, [CallerMemberName] string propertyName = null) 27 | { 28 | if (EqualityComparer.Default.Equals(field, value)) return false; 29 | field = value; 30 | OnPropertyChanged(propertyName); 31 | return true; 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /Display/Models/Dto/Settings/Options/Spider.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.ComponentModel; 3 | using System.Runtime.CompilerServices; 4 | using Display.Providers.Spider; 5 | using Microsoft.UI.Xaml; 6 | 7 | namespace Display.Models.Dto.Settings.Options; 8 | 9 | internal class Spider : INotifyPropertyChanged 10 | { 11 | public BaseSpider Instance { get; set; } 12 | 13 | private string _cookie; 14 | 15 | public string Cookie 16 | { 17 | get => _cookie; 18 | set 19 | { 20 | if (_cookie == value) return; 21 | _cookie = value; 22 | OnPropertyChanged(); 23 | } 24 | } 25 | 26 | public Action SaveCookieAction { get; set; } 27 | 28 | public Spider(BaseSpider baseInstance) 29 | { 30 | Instance = baseInstance; 31 | 32 | Cookie = baseInstance.Cookie; 33 | } 34 | 35 | public void UpdateCookie(object sender, RoutedEventArgs e) 36 | { 37 | SaveCookieAction?.Invoke(Cookie); 38 | } 39 | 40 | public event PropertyChangedEventHandler PropertyChanged; 41 | 42 | protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null) 43 | { 44 | PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); 45 | } 46 | 47 | } -------------------------------------------------------------------------------- /Display/Models/Dto/Settings/PageEnumAndName.cs: -------------------------------------------------------------------------------- 1 | using Display.Models.Enums; 2 | 3 | namespace Display.Models.Dto.Settings; 4 | 5 | public record PageEnumAndName(NavigationViewItemEnum PageEnum, string Name); -------------------------------------------------------------------------------- /Display/Models/Entities/Details/CommonEditOption.cs: -------------------------------------------------------------------------------- 1 | namespace Display.Models.Entities.Details; 2 | 3 | public class CommonEditOption 4 | { 5 | public string Header; 6 | public string PlaceholderText => $"请输入{Header}"; 7 | public double MinWidth { get; set; } = 150; 8 | 9 | public string Text; 10 | } -------------------------------------------------------------------------------- /Display/Models/Entities/Details/TokenizingEditOption.cs: -------------------------------------------------------------------------------- 1 | using Windows.Foundation; 2 | using CommunityToolkit.WinUI.Controls; 3 | using Microsoft.UI.Xaml; 4 | using Microsoft.UI.Xaml.Controls; 5 | 6 | namespace Display.Models.Entities.Details; 7 | 8 | public class TokenizingEditOption 9 | { 10 | public string Header; 11 | public string PlaceholderText => $"添加{Header}"; 12 | 13 | public SymbolIconSource SymbolIconSource; 14 | 15 | public TypedEventHandler TextChanged; 16 | 17 | public TypedEventHandler ItemAdding; 18 | 19 | public object SuggestedItemsSource; 20 | 21 | public object ItemsSource { get; init; } 22 | 23 | public DataTemplate ItemTemplate; 24 | 25 | 26 | public void OnTextChanged(AutoSuggestBox sender, AutoSuggestBoxTextChangedEventArgs args) 27 | { 28 | TextChanged?.Invoke(sender,args); 29 | } 30 | 31 | public void OnItemAdding(TokenizingTextBox sender, TokenItemAddingEventArgs args) 32 | { 33 | ItemAdding?.Invoke(sender,args); 34 | } 35 | 36 | } -------------------------------------------------------------------------------- /Display/Models/Enums/AttmnTypeEnum.cs: -------------------------------------------------------------------------------- 1 | namespace Display.Models.Enums; 2 | 3 | public enum AttmnTypeEnum 4 | { 5 | Magnet, Torrent, Rar, Txt, Unknown 6 | } -------------------------------------------------------------------------------- /Display/Models/Enums/FileFormatEnum.cs: -------------------------------------------------------------------------------- 1 | namespace Display.Models.Enums; 2 | 3 | public enum FileFormatEnum { Video, Subtitles, Torrent, Image, Audio, Archive } -------------------------------------------------------------------------------- /Display/Models/Enums/FileType.cs: -------------------------------------------------------------------------------- 1 | namespace Display.Models.Enums; 2 | 3 | public enum FileType { Folder, File }; -------------------------------------------------------------------------------- /Display/Models/Enums/NavigationViewItemEnum.cs: -------------------------------------------------------------------------------- 1 | namespace Display.Models.Enums; 2 | 3 | public enum NavigationViewItemEnum 4 | { 5 | //菜单栏 6 | HomePage, 7 | VideoViewPage, 8 | ActorPage, 9 | MorePage, 10 | SettingPage, 11 | 12 | //页脚菜单栏 13 | DownPage, 14 | TaskPage, 15 | 16 | //后台任务 17 | UploadTask, 18 | SpiderTask, 19 | 20 | //设置 21 | AccountSetting, 22 | CommonSetting, 23 | UIShowSetting, 24 | PlaySetting, 25 | SpiderSetting, 26 | SearchSetting, 27 | StorageSetting, 28 | DownSetting, 29 | 30 | //更多页 31 | FilePage, 32 | SpiderPage, 33 | CalculateSha1Page, 34 | BrowserPage, 35 | ThumbnailPage 36 | } -------------------------------------------------------------------------------- /Display/Models/Enums/OneOneFive/FailInfoShowType.cs: -------------------------------------------------------------------------------- 1 | namespace Display.Models.Enums.OneOneFive; 2 | 3 | public enum FailInfoShowType { like, look_later } -------------------------------------------------------------------------------- /Display/Models/Enums/OneOneFive/FailType.cs: -------------------------------------------------------------------------------- 1 | namespace Display.Models.Enums.OneOneFive; 2 | 3 | public enum FailType { All, MatchFail, SpiderFail } -------------------------------------------------------------------------------- /Display/Models/Enums/OneOneFive/ProgressStatus.cs: -------------------------------------------------------------------------------- 1 | namespace Display.Models.Enums.OneOneFive; 2 | 3 | public enum ProgressStatus { normal, error, done, cancel } -------------------------------------------------------------------------------- /Display/Models/Enums/PartNum.cs: -------------------------------------------------------------------------------- 1 | namespace Display.Models.Enums; 2 | 3 | public enum PartNum 4 | { 5 | Chinese, 6 | Arabic, 7 | Roman, 8 | English, 9 | CapsEnglish, 10 | } -------------------------------------------------------------------------------- /Display/Models/Enums/PlayQuality.cs: -------------------------------------------------------------------------------- 1 | namespace Display.Models.Enums; 2 | 3 | public enum PlayQuality 4 | { 5 | M3U8 = 0, 6 | Origin = 1 7 | } -------------------------------------------------------------------------------- /Display/Models/Enums/PlayerType.cs: -------------------------------------------------------------------------------- 1 |  2 | namespace Display.Models.Enums; 3 | 4 | public enum PlayerType 5 | { 6 | WebView = 0, 7 | PotPlayer = 1, 8 | Mpv = 2, 9 | Vlc = 3, 10 | MediaElement = 4, 11 | None = -1 12 | } -------------------------------------------------------------------------------- /Display/Models/Enums/SavePathEnum.cs: -------------------------------------------------------------------------------- 1 | namespace Display.Models.Enums; 2 | 3 | public enum SavePathEnum 4 | { 5 | Data, CoverImage, ActorImage, Thumbnail, Subtitles 6 | } -------------------------------------------------------------------------------- /Display/Models/Enums/SpiderSourceName.cs: -------------------------------------------------------------------------------- 1 | namespace Display.Models.Spider; 2 | 3 | public enum SpiderSourceName 4 | { 5 | Javbus, Jav321, Avmoo, Avsox, Libredmm, Fc2Club, Javdb, Local 6 | } -------------------------------------------------------------------------------- /Display/Models/Enums/Status.cs: -------------------------------------------------------------------------------- 1 | namespace Display.Models.Enums; 2 | 3 | /// 4 | /// 状态 5 | /// 6 | public enum Status { Doing, Success, Error, Pause, BeforeStart }; -------------------------------------------------------------------------------- /Display/Models/Enums/ThumbnailOriginType.cs: -------------------------------------------------------------------------------- 1 | namespace Display.Models.Enums; 2 | 3 | public enum ThumbnailOriginType { Local = 0, Web = 1 } -------------------------------------------------------------------------------- /Display/Models/Enums/UploadState.cs: -------------------------------------------------------------------------------- 1 | namespace Display.Models.Enums; 2 | 3 | internal enum UploadState 4 | { 5 | None, 6 | Initializing, 7 | Initialized, 8 | 9 | FastUploading, 10 | OssUploading, 11 | 12 | Paused, 13 | Faulted, 14 | Canceled, 15 | Succeed 16 | } -------------------------------------------------------------------------------- /Display/Models/Enums/UserInfo.LoginStatus.cs: -------------------------------------------------------------------------------- 1 | namespace Display.Models.Enums; 2 | 3 | public enum LoginStatus 4 | { 5 | None, 6 | Update, 7 | NoLogin, 8 | Login 9 | } -------------------------------------------------------------------------------- /Display/Models/Records/CookieKeyValue.cs: -------------------------------------------------------------------------------- 1 | namespace Display.Models.Records; 2 | 3 | internal record CookieKeyValue(int Index, string Key, string Value); -------------------------------------------------------------------------------- /Display/Models/Records/PageEnumAndIsVisible.cs: -------------------------------------------------------------------------------- 1 | using Display.Models.Enums; 2 | 3 | namespace Display.Models.Records; 4 | 5 | public record PageEnumAndIsVisible(NavigationViewItemEnum PageEnum, bool IsVisible = true); -------------------------------------------------------------------------------- /Display/Models/Records/PartNumCombo.cs: -------------------------------------------------------------------------------- 1 | using Display.Models.Enums; 2 | 3 | namespace Display.Models.Records; 4 | 5 | public record PartNumCombo(PartNum PartNum, string Description) 6 | { 7 | public override string ToString() 8 | { 9 | return Description; 10 | } 11 | } -------------------------------------------------------------------------------- /Display/Models/Records/StoreDatum.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | using DataAccess.Models.Entity; 3 | 4 | namespace Display.Models.Records; 5 | 6 | /// 7 | /// 存储Cid下面的文件列表 8 | /// 9 | public record StoreDatum(long Cid, List DatumList) 10 | { 11 | } -------------------------------------------------------------------------------- /Display/Models/Records/TokenData.cs: -------------------------------------------------------------------------------- 1 | using System.Linq; 2 | 3 | namespace Display.Models.Records; 4 | 5 | public record TokenData(string Name) 6 | { 7 | public string Initials { get; } = string.Empty + Name.FirstOrDefault(); 8 | 9 | } -------------------------------------------------------------------------------- /Display/Models/StaticData.cs: -------------------------------------------------------------------------------- 1 | namespace Display.Models.Data; 2 | 3 | public static class StaticData 4 | { 5 | //public static List 6 | //导入115数据时是否跳过已导入文件夹(修改时间一致) 7 | public static bool IsJumpExistsFolder { get; set; } = true; 8 | } -------------------------------------------------------------------------------- /Display/Models/Vo/FailDatum.cs: -------------------------------------------------------------------------------- 1 | using DataAccess.Models.Entity; 2 | using Display.Models.Api.OneOneFive.File; 3 | 4 | namespace Display.Models.Vo; 5 | 6 | public class FailDatum(FilesInfo datum) 7 | { 8 | public FilesInfo Datum { get; private set; } = datum; 9 | 10 | public string MatchName { get; set; } 11 | 12 | /// 13 | /// 是否是匹配失败 14 | /// 15 | public bool IsMatchFail { get; set; } 16 | 17 | /// 18 | /// 是否是搜刮失败 19 | /// 20 | public bool IsSpiderFail { get; set; } 21 | 22 | } -------------------------------------------------------------------------------- /Display/Models/Vo/FailVideoInfo.cs: -------------------------------------------------------------------------------- 1 | using DataAccess.Models.Entity; 2 | 3 | namespace Display.Models.Vo; 4 | 5 | public class FailVideoInfo : VideoInfoVo 6 | { 7 | public long Cid { get; } 8 | 9 | public long? Fid { get; } 10 | 11 | public string PickCode { get; } 12 | 13 | public string FileName { get; } 14 | 15 | public long Size { get; } 16 | 17 | 18 | public FailVideoInfo(VideoInfo info, int imgWidth) 19 | : base(info, imgWidth) 20 | { 21 | 22 | } 23 | 24 | public FailVideoInfo(FilesInfo failDatum) 25 | { 26 | TrueName = failDatum.Name; 27 | ImagePath = "ms-appx:///Assets/Fail.jpg"; 28 | Url = ImagePath; 29 | Series = "fail"; 30 | ReleaseTime = failDatum.Time; 31 | 32 | Cid = failDatum.CurrentId; 33 | Fid = failDatum.FileId; 34 | PickCode = failDatum.PickCode; 35 | FileName = failDatum.Name; 36 | Size = failDatum.Size; 37 | } 38 | } -------------------------------------------------------------------------------- /Display/Models/Vo/FileStatistics.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | using Display.Models.Enums; 3 | 4 | namespace Display.Models.Vo; 5 | 6 | public class FileStatistics(FileFormatEnum name) 7 | { 8 | public FileFormatEnum Type { get; set; } = name; 9 | public long Size { get; set; } 10 | public int Count { get; set; } 11 | public List FileInfo { get; set; } = []; 12 | 13 | public class Data 14 | { 15 | public string Name { get; init; } 16 | public int Count { get; set; } 17 | public long Size { get; set; } 18 | } 19 | } -------------------------------------------------------------------------------- /Display/Models/Vo/Forum/BaiduShareInfo.cs: -------------------------------------------------------------------------------- 1 | namespace Display.Models.Vo.Forum; 2 | 3 | public class BaiduShareInfo 4 | { 5 | public string ShareLink { get; set; } 6 | public string SharePassword { get; set; } 7 | public string ShareLinkWithPwd => $"{ShareLink}?pwd={SharePassword}"; 8 | } -------------------------------------------------------------------------------- /Display/Models/Vo/Forum/Forum1080AttachmentInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Text.RegularExpressions; 2 | using Display.Models.Enums; 3 | 4 | namespace Display.Models.Vo.Forum; 5 | 6 | public class Forum1080AttachmentInfo(string url, AttmnTypeEnum typeEnum) 7 | { 8 | private string _aid; 9 | 10 | public string Aid 11 | { 12 | get 13 | { 14 | if (_aid != null) return _aid; 15 | 16 | var matchAid = Regex.Match(Url.Replace("%3D", ""), "aid=(\\w+)"); 17 | if (matchAid.Success) 18 | { 19 | _aid = matchAid.Groups[1].Value; 20 | } 21 | 22 | return _aid; 23 | } 24 | } 25 | 26 | public string Url { get; set; } = url; 27 | 28 | public string Name { get; set; } 29 | 30 | public string Size { get; set; } 31 | 32 | public AttmnTypeEnum TypeEnum { get; set; } = typeEnum; 33 | 34 | public int Expense { get; set; } = 0; 35 | 36 | public int DownCount { get; set; } 37 | } -------------------------------------------------------------------------------- /Display/Models/Vo/Forum/Forum1080AttmnFileInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | 3 | namespace Display.Models.Vo.Forum; 4 | 5 | public class Forum1080AttmnFileInfo 6 | { 7 | public Forum1080AttmnFileInfo(string path) 8 | { 9 | Path = path; 10 | Name = System.IO.Path.GetFileNameWithoutExtension(Path); 11 | } 12 | 13 | public string Name { get; private set; } 14 | 15 | private string Path { get; set; } 16 | public string QrCodeImagePath { get; set; } 17 | public string DetailFileContent { get; set; } 18 | public BaiduShareInfo BaiduShareInfo { get; set; } 19 | 20 | public string SrtPath { get; set; } 21 | 22 | public Dictionary> Links { get; set; } = new(); 23 | 24 | public string CompressedPassword { get; set; } 25 | } -------------------------------------------------------------------------------- /Display/Models/Vo/Forum/Forum1080SearchResult.cs: -------------------------------------------------------------------------------- 1 | namespace Display.Models.Vo.Forum; 2 | 3 | public class Forum1080SearchResult 4 | { 5 | public string Url { get; init; } 6 | 7 | public string Title { get; init; } 8 | 9 | public string Description { get; set; } 10 | 11 | public string Author { get; set; } 12 | 13 | public string Time { get; set; } 14 | 15 | public string Type { get; set; } 16 | 17 | } -------------------------------------------------------------------------------- /Display/Models/Vo/GetFilesProgressInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | using DataAccess.Models.Entity; 3 | using Display.Models.Api.OneOneFive.File; 4 | 5 | namespace Display.Models.Vo; 6 | 7 | public class GetFilesProgressInfo 8 | { 9 | public int FolderCount { get; set; } = 0; 10 | 11 | public int FilesCount { get; set; } = 0; 12 | 13 | public int AllCount => FolderCount + FilesCount; 14 | 15 | public List FailCid { get; set; } = []; 16 | } -------------------------------------------------------------------------------- /Display/Models/Vo/M3U8Info.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | 5 | namespace Display.Models.Dto.OneOneFive; 6 | 7 | public class M3U8Info(string name, string bandwidth, string resolution, string url) 8 | { 9 | public static M3U8Info CreateInstance(string name, string bandwidth, string resolution, string url) 10 | { 11 | return new M3U8Info(name, bandwidth, resolution, url); 12 | } 13 | 14 | public string Name { get; set; } = name; 15 | public string Bandwidth { get; set; } = bandwidth; 16 | public string Resolution { get; set; } = resolution; 17 | public string Url { get; set; } = url; 18 | 19 | public double TotalSecond => TsInfoList.Sum(x => x.Second); 20 | 21 | public string BaseUrl 22 | { 23 | get 24 | { 25 | var urlInfo = new Uri(Url); 26 | 27 | return $"{urlInfo.Scheme}://{urlInfo.Host}"; 28 | } 29 | } 30 | 31 | public List TsInfoList = []; 32 | 33 | } -------------------------------------------------------------------------------- /Display/Models/Vo/MatchVideoResult.cs: -------------------------------------------------------------------------------- 1 | namespace Display.Models.Vo; 2 | 3 | public class MatchVideoResult 4 | { 5 | public bool Status; 6 | 7 | /** 8 | * 1. 匹配成功、2. 匹配名称已存在(多个视频对应一个匹配名称) 9 | * 3. 正在搜刮、4. 搜刮完成 10 | */ 11 | public int StatusCode; 12 | public string Message; 13 | public string OriginalName; 14 | public string MatchName; 15 | } -------------------------------------------------------------------------------- /Display/Models/Vo/OneOneFive/FileUploadResult.cs: -------------------------------------------------------------------------------- 1 | using Display.Models.Api.OneOneFive.Upload; 2 | using Display.Models.Enums; 3 | 4 | namespace Display.Models.Vo.OneOneFive; 5 | 6 | public class FileUploadResult(string name) 7 | { 8 | public readonly string Name = name; 9 | public long Id; 10 | public long FileSize; 11 | public long Cid; 12 | public string PickCode; 13 | public string Sha1; 14 | public string ThumbUrl; 15 | 16 | public readonly FileType Type = FileType.File; 17 | 18 | public bool Success; 19 | 20 | private bool? _isVideo; 21 | 22 | public bool IsVideo 23 | { 24 | get 25 | { 26 | if (_isVideo != null) return (bool)_isVideo; 27 | 28 | _isVideo = DetailFileInfo.GetTypeFromIcon(Name.Split('.')[^1]) == "video"; 29 | return (bool)_isVideo; 30 | } 31 | private set => _isVideo = value; 32 | } 33 | 34 | public void SetFromOssUploadResult(OssUploadResult uploadResult) 35 | { 36 | var data = uploadResult?.Data; 37 | if (data == null) return; 38 | 39 | PickCode = data.PickCode; 40 | FileSize = data.FileSize; 41 | Id = data.FileId; 42 | ThumbUrl = data.ThumbUrl; 43 | Sha1 = data.Sha1; 44 | Cid = data.Cid; 45 | IsVideo = data.IsVideo == 1; 46 | } 47 | } -------------------------------------------------------------------------------- /Display/Models/Vo/OneOneFive/Sort115HomeModel.cs: -------------------------------------------------------------------------------- 1 | using CommunityToolkit.Mvvm.ComponentModel; 2 | using Display.Models.Api.OneOneFive.File; 3 | using Display.Models.Dto.OneOneFive; 4 | using Display.Models.Enums; 5 | 6 | namespace Display.Models.Vo.OneOneFive; 7 | 8 | public partial class Sort115HomeModel(DetailFileInfo info) : ObservableObject 9 | { 10 | public readonly DetailFileInfo Info = info; 11 | 12 | [ObservableProperty] 13 | private string _destinationName; 14 | 15 | [ObservableProperty] 16 | private string _destinationPathName; 17 | 18 | [ObservableProperty] 19 | private Status _status = Status.BeforeStart; 20 | 21 | public string Format; 22 | 23 | public int Index; 24 | } -------------------------------------------------------------------------------- /Display/Models/Vo/Progress/GetFileProgressIProgress.cs: -------------------------------------------------------------------------------- 1 | using Display.Models.Enums.OneOneFive; 2 | 3 | namespace Display.Models.Vo.Progress; 4 | 5 | public class GetFileProgressIProgress 6 | { 7 | public ProgressStatus Status { get; set; } = ProgressStatus.normal; 8 | public GetFilesProgressInfo GetFilesProgressInfo { get; set; } 9 | public long SendCountPerMinutes { get; set; } 10 | } -------------------------------------------------------------------------------- /Display/Models/Vo/SubInfo.cs: -------------------------------------------------------------------------------- 1 | namespace Display.Models.Vo; 2 | 3 | public class SubInfo(string pickCode, string name, string trueName) 4 | { 5 | public string PickCode { get; set; } = pickCode; 6 | public string Name { get; set; } = name; 7 | 8 | public string TrueName { get; set; } = trueName; 9 | } -------------------------------------------------------------------------------- /Display/Models/Vo/VideoToThumbnail.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | 3 | namespace Display.Models.Dto.OneOneFive; 4 | 5 | public class VideoToThumbnail 6 | { 7 | public string name; 8 | 9 | //总时长 10 | public float play_long { get; set; } = 0; 11 | 12 | //总帧数 13 | public double frame_count { get; set; } = 0; 14 | 15 | //pickCode 16 | public List pickCodeList { get; set; } = new(); 17 | 18 | } -------------------------------------------------------------------------------- /Display/Models/Vo/tsInfo.cs: -------------------------------------------------------------------------------- 1 | namespace Display.Models.Dto.OneOneFive; 2 | 3 | public class tsInfo 4 | { 5 | public double Second; 6 | 7 | public string Url; 8 | 9 | } -------------------------------------------------------------------------------- /Display/Properties/launchSettings.json: -------------------------------------------------------------------------------- 1 | { 2 | "profiles": { 3 | "Display (Package)": { 4 | "commandName": "MsixPackage" 5 | }, 6 | "Display (Unpackaged)": { 7 | "commandName": "Project" 8 | } 9 | } 10 | } -------------------------------------------------------------------------------- /Display/Services/Upload/IUpload.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Threading.Tasks; 3 | using Display.Models.Enums; 4 | 5 | namespace Display.Services.Upload; 6 | 7 | internal interface IUpload : IDisposable, IAsyncDisposable 8 | { 9 | public UploadState State { get; } 10 | 11 | public string Content 12 | { 13 | get; 14 | } 15 | 16 | public bool Running 17 | { 18 | get; 19 | } 20 | 21 | public long Length 22 | { 23 | get; 24 | } 25 | public long Position 26 | { 27 | get; 28 | } 29 | public Task Init(); 30 | public Task Start(); 31 | public void Pause(); 32 | public void Stop(); 33 | 34 | public event Action PositionCallback; 35 | public event Action ProgressChanged; 36 | public event Action StateChanged; 37 | public event Action LengthCallback; 38 | public event Action ContentChanged; 39 | } -------------------------------------------------------------------------------- /Display/ViewModels/MainWindowViewModel.cs: -------------------------------------------------------------------------------- 1 | using Display.ViewModels.Sub; 2 | 3 | namespace Display.ViewModels; 4 | 5 | internal class MainWindowViewModel( 6 | NavigationItemViewModel navigationItemViewModel) 7 | { 8 | public readonly NavigationItemViewModel NavigationItemViewModel = navigationItemViewModel; 9 | 10 | 11 | } -------------------------------------------------------------------------------- /Display/ViewModels/MorePageViewModel.cs: -------------------------------------------------------------------------------- 1 | using Display.Providers; 2 | using System.Linq; 3 | using Display.Constants; 4 | using Display.Models.Dto.Settings; 5 | 6 | namespace Display.ViewModels; 7 | 8 | internal class MorePageViewModel 9 | { 10 | public readonly MoreMenuItem[] MoreMenuItems = AppSettings.MoreMenuItemEnumArray 11 | .Select(pageEnum => 12 | { 13 | var firstOrDefault = MenuItems.MoreMenuItems.FirstOrDefault(item => item.PageEnum == pageEnum.PageEnum); 14 | if (firstOrDefault != null && !pageEnum.IsVisible) 15 | firstOrDefault.IsVisible = false; 16 | 17 | return firstOrDefault; 18 | }) 19 | .Where(i=>i is { IsVisible: true }).ToArray(); 20 | 21 | } -------------------------------------------------------------------------------- /Display/ViewModels/Sub/MoreNavigationItemViewModel.cs: -------------------------------------------------------------------------------- 1 | using Display.Providers; 2 | using System.Collections.ObjectModel; 3 | using System.Collections.Specialized; 4 | using System.Linq; 5 | using Display.Constants; 6 | using Display.Extensions; 7 | using Display.Models.Dto.Settings; 8 | using Display.Models.Records; 9 | 10 | namespace Display.ViewModels.Sub; 11 | 12 | internal class MoreNavigationItemViewModel 13 | { 14 | public readonly ObservableCollection MoreMenuItems; 15 | 16 | public MoreNavigationItemViewModel() 17 | { 18 | MoreMenuItems = new ObservableCollection(AppSettings.MoreMenuItemEnumArray 19 | .Select(enumAndVisible => 20 | { 21 | var firstOrDefault = MenuItems.MoreMenuItems.FirstOrDefault(item => item.PageEnum == enumAndVisible.PageEnum); 22 | if (firstOrDefault != null && !enumAndVisible.IsVisible) 23 | firstOrDefault.IsVisible = false; 24 | return firstOrDefault; 25 | }) 26 | .Where(i=>i != null) 27 | ); 28 | } 29 | 30 | public void SaveSetting() 31 | { 32 | AppSettings.MoreMenuItemEnumArray = [.. MoreMenuItems.Select(i=>new PageEnumAndIsVisible(i.PageEnum, i.IsVisible))]; 33 | } 34 | } -------------------------------------------------------------------------------- /Display/ViewModels/TaskViewModel.cs: -------------------------------------------------------------------------------- 1 | using CommunityToolkit.Mvvm.ComponentModel; 2 | using System.Linq; 3 | using Display.Models.Dto.Settings; 4 | using Display.Models.Enums; 5 | using Display.Views.Pages.Tasks; 6 | 7 | namespace Display.ViewModels; 8 | 9 | internal partial class TaskViewModel : ObservableObject 10 | { 11 | public readonly MenuItem[] NavLinks = 12 | [ 13 | new MenuItem(NavigationViewItemEnum.UploadTask, "上传", "\uF6FA", typeof(UploadTaskPage) ), 14 | new MenuItem(NavigationViewItemEnum.SpiderTask, "搜刮", "\uF6FA", typeof(SpiderTaskPage)), 15 | ]; 16 | 17 | [ObservableProperty] 18 | private MenuItem _currentLink; 19 | 20 | public void SetCurrentLink(NavigationViewItemEnum pageEnum) 21 | { 22 | var link = NavLinks.FirstOrDefault(link => link.PageEnum == pageEnum); 23 | if (link is null) return; 24 | CurrentLink = link; 25 | } 26 | 27 | } -------------------------------------------------------------------------------- /Display/ViewModels/UIShowSettingViewModel.cs: -------------------------------------------------------------------------------- 1 | using Display.ViewModels.Sub; 2 | 3 | namespace Display.ViewModels; 4 | 5 | internal class UIShowSettingViewModel( 6 | NavigationItemViewModel navigationItemViewModel, 7 | MoreNavigationItemViewModel moreNavigationItemViewModel) 8 | { 9 | public readonly NavigationItemViewModel NavigationItemViewModel = navigationItemViewModel; 10 | 11 | public readonly MoreNavigationItemViewModel MoreNavigationItemViewModel = moreNavigationItemViewModel; 12 | } -------------------------------------------------------------------------------- /Display/Views/Pages/DetailInfo/SelectSingleSubFileToSelected.xaml.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | using Display.Models.Dto.OneOneFive; 3 | using Display.Models.Vo; 4 | 5 | namespace Display.Views.Pages.DetailInfo; 6 | 7 | public sealed partial class SelectSingleSubFileToSelected 8 | { 9 | private string TrueName { get; } 10 | 11 | private List SubInfoList { get; } 12 | 13 | public SelectSingleSubFileToSelected() 14 | { 15 | InitializeComponent(); 16 | } 17 | 18 | public SelectSingleSubFileToSelected(List subList, string trueName) 19 | { 20 | InitializeComponent(); 21 | 22 | SubInfoList = subList; 23 | TrueName = trueName; 24 | } 25 | 26 | } 27 | -------------------------------------------------------------------------------- /Display/Views/Pages/DetailInfo/SelectVideoToPlay.xaml.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | using System.Linq; 3 | using DataAccess.Models.Entity; 4 | using Display.Helper.Network; 5 | using Display.Models.Api.OneOneFive.File; 6 | using Display.Models.Dto.Media; 7 | using Display.Models.Dto.OneOneFive; 8 | 9 | namespace Display.Views.Pages.DetailInfo; 10 | 11 | public sealed partial class SelectVideoToPlay 12 | { 13 | private readonly List _pickCodeInfoList; 14 | public SelectVideoToPlay() 15 | { 16 | this.InitializeComponent(); 17 | } 18 | public SelectVideoToPlay(List pickCodeInfoList) 19 | { 20 | InitializeComponent(); 21 | 22 | this._pickCodeInfoList = pickCodeInfoList; 23 | } 24 | 25 | public void PlayAllVideos() 26 | { 27 | PlayVideos(_pickCodeInfoList); 28 | } 29 | 30 | public void PlaySelectedVideos() 31 | { 32 | PlayVideos(ContentListView.SelectedItems.Cast().ToList()); 33 | } 34 | 35 | private async void PlayVideos(IEnumerable infos) 36 | { 37 | var playItems = infos.Select(x => new MediaPlayItem(x)).ToList(); 38 | 39 | await PlayVideoHelper.PlayVideo(playItems, this.XamlRoot, lastPage: this); 40 | } 41 | } -------------------------------------------------------------------------------- /Display/Views/Pages/DetailInfoPage.xaml: -------------------------------------------------------------------------------- 1 |  11 | 12 | 13 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /Display/Views/Pages/More/DatumList/MainPage.xaml: -------------------------------------------------------------------------------- 1 | 2 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /Display/Views/Pages/More/DatumList/MainPage.xaml.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.UI.Xaml; 2 | using Microsoft.UI.Xaml.Controls; 3 | 4 | namespace Display.Views.Pages.More.DatumList; 5 | 6 | public sealed partial class MainPage 7 | { 8 | public MainPage() 9 | { 10 | InitializeComponent(); 11 | } 12 | 13 | private void RootFrame_OnLoaded(object sender, RoutedEventArgs e) 14 | { 15 | if (sender is not Frame frame) return; 16 | 17 | frame.Navigate(typeof(FileListPage)); 18 | } 19 | } -------------------------------------------------------------------------------- /Display/Views/Pages/More/DatumList/TransferStationFiles.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | using System.Linq; 3 | using Display.Models.Api.OneOneFive.File; 4 | using Display.Models.Dto.OneOneFive; 5 | using Display.Models.Vo.OneOneFive; 6 | 7 | namespace Display.Views.Pages.More.DatumList; 8 | 9 | internal class TransferStationFiles 10 | { 11 | public string Name { get; set; } 12 | public List TransferFiles { get; set; } 13 | 14 | public TransferStationFiles(List transferFiles) 15 | { 16 | if (transferFiles.Count == 1) 17 | { 18 | this.Name = $"{transferFiles.FirstOrDefault()?.Name}"; 19 | } 20 | else if (transferFiles.Count > 1) 21 | { 22 | this.Name = $"{transferFiles.FirstOrDefault()?.Name} 等{transferFiles.Count}个文件"; 23 | } 24 | 25 | this.TransferFiles = transferFiles; 26 | 27 | } 28 | 29 | } -------------------------------------------------------------------------------- /Display/Views/Pages/More/VideoPlay.xaml: -------------------------------------------------------------------------------- 1 |  10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /Display/Views/Pages/More/VideoPlay.xaml.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using Microsoft.UI.Xaml.Navigation; 3 | 4 | namespace Display.Views.Pages.More; 5 | 6 | public sealed partial class VideoPlay 7 | { 8 | public VideoPlay() 9 | { 10 | InitializeComponent(); 11 | } 12 | 13 | protected override void OnNavigatedTo(NavigationEventArgs e) 14 | { 15 | base.OnNavigatedTo(e); 16 | 17 | string url; 18 | 19 | if (e.Parameter is string pickCode) 20 | url = $"https://v.anxia.com/?pickcode={pickCode}&share_id=0"; 21 | else 22 | url = "https://115.com/?cid=0&offset=0&mode=wangpan"; 23 | 24 | Browser.WebView.Source = new Uri(url); 25 | } 26 | } -------------------------------------------------------------------------------- /Display/Views/Pages/MorePage.xaml.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using Display.Constants; 3 | using Display.Models.Dto.Settings; 4 | using Display.Models.Enums; 5 | using Display.ViewModels; 6 | using Display.Views.Pages.More; 7 | using Display.Views.Windows; 8 | using Microsoft.UI.Xaml.Controls; 9 | 10 | namespace Display.Views.Pages; 11 | 12 | public sealed partial class MorePage 13 | { 14 | private readonly MorePageViewModel _viewModel = App.GetService(); 15 | 16 | public MorePage() 17 | { 18 | InitializeComponent(); 19 | 20 | } 21 | 22 | private void GridView_ItemClick(object sender, ItemClickEventArgs e) 23 | { 24 | if (e.ClickedItem is not MoreMenuItem item) return; 25 | 26 | if (item.PageEnum == NavigationViewItemEnum.BrowserPage) 27 | { 28 | var window = new CommonWindow(); 29 | window.Content = new BrowserPage(window, isShowButton: true); 30 | window.Activate(); 31 | } 32 | else 33 | { 34 | var page = (Page)Activator.CreateInstance(item.PageType); 35 | CommonWindow.CreateAndShowWindow(page); 36 | } 37 | } 38 | } -------------------------------------------------------------------------------- /Display/Views/Pages/OfflineDown/FailListPage.xaml.cs: -------------------------------------------------------------------------------- 1 | // Copyright (c) Microsoft Corporation and Contributors. 2 | // Licensed under the MIT License. 3 | 4 | using System.Collections.Generic; 5 | using Display.Models.Api.OneOneFive.OfflineDown; 6 | using Display.Models.Dto.OneOneFive; 7 | 8 | namespace Display.Views.Pages.OfflineDown; 9 | 10 | public sealed partial class FailListPage 11 | { 12 | private readonly List _urlInfos; 13 | 14 | public FailListPage(List urlInfos) 15 | { 16 | InitializeComponent(); 17 | 18 | _urlInfos = urlInfos; 19 | 20 | } 21 | } -------------------------------------------------------------------------------- /Display/Views/Pages/SettingPage.xaml.cs: -------------------------------------------------------------------------------- 1 | using Display.Constants; 2 | using Display.ViewModels; 3 | using Microsoft.UI.Xaml.Controls; 4 | 5 | namespace Display.Views.Pages; 6 | 7 | public sealed partial class SettingPage 8 | { 9 | private SettingViewModel _viewModel; 10 | 11 | public SettingPage() 12 | { 13 | _viewModel = App.GetService(); 14 | 15 | InitializeComponent(); 16 | } 17 | 18 | private void Selector_OnSelectionChanged(object sender, SelectionChangedEventArgs e) 19 | { 20 | SettingFrame.Navigate(_viewModel.CurrentLink.PageType, NotificationQueue); 21 | } 22 | } -------------------------------------------------------------------------------- /Display/Views/Pages/Settings/Account/CheckCookie.xaml.cs: -------------------------------------------------------------------------------- 1 | using Display.Helper.Data; 2 | using Display.Models.Data; 3 | using Display.Models.Records; 4 | 5 | namespace Display.Views.Pages.Settings.Account; 6 | 7 | public sealed partial class CheckCookie 8 | { 9 | private CookieKeyValue[] CookieKeyValueArray { get; } 10 | 11 | public CheckCookie(string cookies) 12 | { 13 | InitializeComponent(); 14 | 15 | CookieKeyValueArray = CookieHelper.FormatCookieArray(cookies); 16 | } 17 | } -------------------------------------------------------------------------------- /Display/Views/Pages/Settings/Account/VerifyAccountPage.xaml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /Display/Views/Pages/Settings/CommonPage.xaml.cs: -------------------------------------------------------------------------------- 1 | namespace Display.Views.Pages.Settings; 2 | 3 | public sealed partial class CommonPage 4 | { 5 | public CommonPage() => InitializeComponent(); 6 | } -------------------------------------------------------------------------------- /Display/Views/Pages/Settings/DownPage.xaml.cs: -------------------------------------------------------------------------------- 1 | using Display.Models.Vo.Down; 2 | using Display.Providers.Downloader; 3 | using Microsoft.UI.Xaml.Controls; 4 | using SharpCompress; 5 | 6 | namespace Display.Views.Pages.Settings; 7 | 8 | public sealed partial class DownPage 9 | { 10 | private readonly BaseDownloader[] _downloaders = Managers.DownloadManager.Downloads; 11 | 12 | public DownPage() 13 | { 14 | InitializeComponent(); 15 | 16 | _downloaders.ForEach(download 17 | => download.ShowMessageAction += ShowMessageAction); 18 | } 19 | 20 | private void ShowMessageAction(string subtitle, string content = null, InfoBarSeverity severity = InfoBarSeverity.Informational) 21 | { 22 | ShowTeachingTip(subtitle, content, severity); 23 | } 24 | } -------------------------------------------------------------------------------- /Display/Views/Pages/Settings/SpiderPage.xaml.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | using System.Diagnostics; 3 | using System.Linq; 4 | using Display.Managers; 5 | using Display.Models.Dto.Settings.Options; 6 | using Microsoft.UI.Xaml; 7 | using Microsoft.UI.Xaml.Controls.Primitives; 8 | 9 | namespace Display.Views.Pages.Settings; 10 | 11 | public sealed partial class SpiderPage 12 | { 13 | private List _spiders; 14 | 15 | public SpiderPage() 16 | { 17 | InitializeComponent(); 18 | 19 | InitOptions(); 20 | } 21 | 22 | private void InitOptions() 23 | { 24 | _spiders = []; 25 | 26 | foreach (var spider in SpiderManager.Spiders) 27 | { 28 | _spiders.Add(new Spider(spider) 29 | { 30 | SaveCookieAction = cookie => spider.Cookie = cookie 31 | }); 32 | 33 | } 34 | 35 | _spiders.ForEach(i => Debug.WriteLine(i.Instance.DelayRanges)); 36 | } 37 | 38 | 39 | private void SpiderToggleButton_Unchecked(object sender, RoutedEventArgs e) 40 | { 41 | if (sender is not ToggleButton) return; 42 | 43 | var isOneTurnOn = SpiderManager.Spiders.Any(spider => spider.IsOn); 44 | 45 | if (isOneTurnOn) return; 46 | 47 | ShowTeachingTip("请至少选择一个搜刮源,否则无法正常搜刮"); 48 | } 49 | 50 | 51 | 52 | } -------------------------------------------------------------------------------- /Display/Views/Pages/Settings/UpdateAppPage.xaml.cs: -------------------------------------------------------------------------------- 1 | 2 | using System; 3 | using Windows.System; 4 | using Display.Models.Entities; 5 | using Display.Models.Vo.Github; 6 | 7 | namespace Display.Views.Pages.Settings; 8 | 9 | internal sealed partial class UpdateAppPage 10 | { 11 | public LatestReleaseCheck ReleaseInfo { get; } 12 | 13 | public UpdateAppPage(LatestReleaseCheck releaseInfo) 14 | { 15 | this.InitializeComponent(); 16 | 17 | ReleaseInfo = releaseInfo; 18 | } 19 | 20 | private async void MarkdownTextBlock_LinkClicked(object sender, CommunityToolkit.WinUI.UI.Controls.LinkClickedEventArgs e) 21 | { 22 | if (Uri.TryCreate(e.Link, UriKind.Absolute, out var link)) 23 | { 24 | await Launcher.LaunchUriAsync(link); 25 | } 26 | } 27 | } -------------------------------------------------------------------------------- /Display/Views/Pages/Settings/UpdateImagePath.xaml.cs: -------------------------------------------------------------------------------- 1 | namespace Display.Views.Pages.Settings; 2 | 3 | public sealed partial class UpdateImagePath 4 | { 5 | public string SrcPath { get; private set; } 6 | public string DstPath { get; private set; } 7 | public string ImagePath { get; } 8 | 9 | public UpdateImagePath(string newImagePath, string newSrcPath, string newDstPath) 10 | { 11 | SrcPath = newSrcPath; 12 | DstPath = newDstPath; 13 | ImagePath = newImagePath; 14 | 15 | InitializeComponent(); 16 | 17 | } 18 | 19 | private string GetDstImagePath(string newSrcPath, string newDstPath) 20 | { 21 | return newSrcPath == string.Empty ? "😥" : ImagePath.Replace(newSrcPath, newDstPath); 22 | } 23 | } -------------------------------------------------------------------------------- /Display/Views/Pages/Sort115/Settings18Page.xaml.cs: -------------------------------------------------------------------------------- 1 | 2 | namespace Display.Views.Pages.Sort115; 3 | 4 | public sealed partial class Settings18Page 5 | { 6 | public Settings18Page() 7 | { 8 | InitializeComponent(); 9 | 10 | ViewModel.SetPage(this); 11 | } 12 | } -------------------------------------------------------------------------------- /Display/Views/Pages/Tasks/SpiderTaskPage.xaml.cs: -------------------------------------------------------------------------------- 1 | using Display.ViewModels; 2 | 3 | namespace Display.Views.Pages.Tasks; 4 | 5 | public sealed partial class SpiderTaskPage 6 | { 7 | private readonly SpiderTaskViewModel _viewModel = App.GetService(); 8 | 9 | public SpiderTaskPage() 10 | { 11 | InitializeComponent(); 12 | } 13 | } -------------------------------------------------------------------------------- /Display/Views/Pages/Tasks/UploadTaskPage.xaml.cs: -------------------------------------------------------------------------------- 1 | using Display.ViewModels; 2 | 3 | namespace Display.Views.Pages.Tasks; 4 | 5 | public sealed partial class UploadTaskPage 6 | { 7 | private readonly UploadViewModel _uploadVm = App.GetService(); 8 | 9 | public UploadTaskPage() 10 | { 11 | InitializeComponent(); 12 | } 13 | } -------------------------------------------------------------------------------- /Display/Views/Pages/VideoCoverPage.xaml: -------------------------------------------------------------------------------- 1 |  8 | 9 | 10 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /Display/Views/Pages/VideoViewPage.xaml: -------------------------------------------------------------------------------- 1 |  10 | 11 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /Display/Views/Windows/CommonWindow.xaml: -------------------------------------------------------------------------------- 1 |  9 | 10 | 11 | -------------------------------------------------------------------------------- /Display/Views/Windows/CommonWindow.xaml.cs: -------------------------------------------------------------------------------- 1 | using System.IO; 2 | using Windows.ApplicationModel; 3 | using Display.Helper.UI; 4 | using Microsoft.UI.Xaml.Controls; 5 | using Microsoft.UI.Xaml.Media; 6 | 7 | namespace Display.Views.Windows; 8 | 9 | public sealed partial class CommonWindow 10 | { 11 | private const string DefaultTitle = "Display"; 12 | 13 | public CommonWindow(string title = DefaultTitle, int width = 0, int height = 0) 14 | { 15 | InitializeComponent(); 16 | Title = title; 17 | 18 | // 调整大小 19 | if (width != 0 && height != 0) 20 | { 21 | Width = width; 22 | Height = height; 23 | } 24 | 25 | var appWindow = App.GetAppWindow(this); 26 | 27 | appWindow.SetIcon(Path.Combine(Package.Current.InstalledLocation.Path, "Assets/pokeball.ico")); 28 | 29 | SystemBackdrop = new MicaBackdrop(); 30 | 31 | WindowHelper.TrackWindow(this); 32 | } 33 | 34 | public static void CreateAndShowWindow(Page page, string title = DefaultTitle, int width = 0, int height = 0) 35 | { 36 | var window = new CommonWindow(title, width, height) 37 | { 38 | Content = page 39 | }; 40 | window.Activate(); 41 | } 42 | 43 | } -------------------------------------------------------------------------------- /Display/Views/Windows/LoginWindow.xaml.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using Display.Views.Pages.Settings.Account; 3 | using Microsoft.UI.Xaml.Controls; 4 | 5 | namespace Display.Views.Windows; 6 | 7 | public sealed partial class LoginWindow 8 | { 9 | public LoginWindow(Page page) 10 | { 11 | InitializeComponent(); 12 | 13 | ExtendsContentIntoTitleBar = true; 14 | SetTitleBar(AppTitleBar); 15 | RootContent.Content = page; 16 | } 17 | 18 | public static void ShowLoginWindow(Action closeAction) 19 | { 20 | var loginPage = new LoginPage(); 21 | var loginWindow = new LoginWindow(loginPage); 22 | 23 | loginPage.LoginCompletedAction = () => 24 | { 25 | loginWindow.Close(); 26 | closeAction.Invoke(); 27 | }; 28 | loginWindow.Activate(); 29 | } 30 | 31 | 32 | } -------------------------------------------------------------------------------- /Display/Views/Windows/SingleFrameWindow.xaml: -------------------------------------------------------------------------------- 1 |  8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /Display/Views/Windows/SingleFrameWindow.xaml.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.IO; 3 | using Windows.ApplicationModel; 4 | 5 | namespace Display.Views.Windows; 6 | 7 | public sealed partial class SingleFrameWindow 8 | { 9 | public SingleFrameWindow() 10 | { 11 | InitializeComponent(); 12 | 13 | Title = "Display"; 14 | var appwindow = App.GetAppWindow(this); 15 | appwindow.SetIcon(Path.Combine(Package.Current.InstalledLocation.Path, "Assets/pokeball.ico")); 16 | } 17 | 18 | public void NavigationToPage(Type page) 19 | { 20 | //该Page含有WebView,关闭窗口时必须先关闭WebView,不然会报错 21 | if (page.Name == "Import115DataToLocalDataAccess") 22 | { 23 | return; 24 | } 25 | ContentFrame.Navigate(page); 26 | } 27 | 28 | private void NavigationToPageWithWebView(Type page, Microsoft.UI.Xaml.Window window) 29 | { 30 | ContentFrame.Navigate(page, window); 31 | } 32 | 33 | public static void CreateWindow(Type page) 34 | { 35 | var window = new SingleFrameWindow(); 36 | window.NavigationToPageWithWebView(page, window); 37 | window.Activate(); 38 | } 39 | 40 | } -------------------------------------------------------------------------------- /Display/app.manifest: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 12 | true/PM 13 | PerMonitorV2, PerMonitor 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /Tests/DataAccess/DatabaseTest.cs: -------------------------------------------------------------------------------- 1 | using DataAccess; 2 | using DataAccess.Models.Entity; 3 | 4 | namespace Tests.DataAccess; 5 | 6 | [TestClass] 7 | public class DatabaseTest 8 | { 9 | /** 10 | * 指定位置创建数据库 11 | */ 12 | [TestMethod] 13 | [DataRow(null)] // 默认 14 | [DataRow("D:/")] // 指定 15 | public void CreateDatabaseTest(string savePath) 16 | { 17 | // 设置位置 18 | Context.SetSavePath(savePath); 19 | 20 | var path = Context.DbPath; 21 | // 如果数据库文件存在,则删除 22 | if (File.Exists(path)) File.Delete(path); 23 | 24 | var context = Context.Instance; 25 | var result = context.Database.EnsureCreated(); 26 | Assert.IsTrue(result); 27 | 28 | context.Database.EnsureDeleted(); 29 | } 30 | 31 | 32 | 33 | [TestMethod] 34 | public void GetDbSet() 35 | { 36 | var context = Context.Instance; 37 | var i = context.Set(); 38 | Assert.AreEqual(context.VideoInfos, i); 39 | 40 | } 41 | } -------------------------------------------------------------------------------- /Tests/DataAccess/EntityTest/ActorInfoTest.cs: -------------------------------------------------------------------------------- 1 | using System.Diagnostics; 2 | using DataAccess.Dao.Impl; 3 | using DataAccess.Dao.Interface; 4 | using DataAccess.Models.Entity; 5 | 6 | namespace Tests.DataAccess.EntityTest; 7 | 8 | [TestClass] 9 | public class ActorInfoTest 10 | { 11 | private readonly IActorInfoDao _actorInfoDao = new ActorInfoDao(); 12 | 13 | [TestMethod] 14 | public void UploadSingleTest() 15 | { 16 | // var actorInfo = new ActorInfo 17 | // { 18 | // IsLike = 1 19 | // }; 20 | // _actorInfoDao.ExecuteUpdate(actorInfo); 21 | // 22 | // Debug.WriteLine(actorInfo); 23 | } 24 | } -------------------------------------------------------------------------------- /Tests/DataAccess/EntityTest/VideoInfoDaoTest.cs: -------------------------------------------------------------------------------- 1 | using System.Diagnostics; 2 | using DataAccess; 3 | using DataAccess.Dao.Impl; 4 | 5 | namespace Tests.DataAccess.EntityTest; 6 | 7 | [TestClass] 8 | public class VideoInfoDaoTest 9 | { 10 | [TestMethod] 11 | public void GetOneTest() 12 | { 13 | Context.SetSavePath("D:\\库\\Documents\\winui"); 14 | var videoInfoDao = new VideoInfoDao(); 15 | 16 | 17 | var oneByTrueName = videoInfoDao.GetOneByTrueName("AOZ-322"); 18 | Debug.WriteLine(oneByTrueName); 19 | } 20 | } -------------------------------------------------------------------------------- /Tests/DataAccess/MoreTest/ActorInfoTest.cs: -------------------------------------------------------------------------------- 1 | using System.Diagnostics; 2 | using DataAccess.Dao.Impl; 3 | using DataAccess.Dao.Interface; 4 | 5 | namespace Tests.DataAccess.MoreTest; 6 | 7 | [TestClass] 8 | public class ActorInfoTest 9 | { 10 | private readonly IActorInfoDao _dao = new ActorInfoDao(); 11 | 12 | [TestMethod] 13 | [DataRow("AJVR-188")] 14 | public void GetListByTrueName(string name) 15 | { 16 | var listByTrueName = _dao.GetPartListByVideoName(name); 17 | Debug.WriteLine(listByTrueName); 18 | } 19 | } -------------------------------------------------------------------------------- /Tests/DataAccess/MoreTest/SubFileTest.cs: -------------------------------------------------------------------------------- 1 | using DataAccess; 2 | using Microsoft.EntityFrameworkCore; 3 | 4 | namespace Tests.DataAccess.MoreTest; 5 | 6 | [TestClass] 7 | public class SubFileTest 8 | { 9 | [TestMethod] 10 | public void FindSubTest() 11 | { 12 | string[] srtSuffix = ["srt", "ass", "ssa"]; 13 | var leftName = "mdbk"; 14 | var rightNumber = 273; 15 | var subArray = Context.Instance.FilesInfos.Where(i=>srtSuffix.Contains(i.Ico ) 16 | && EF.Functions.Like(i.Name, "%"+leftName+"%"+rightNumber+"%")).ToArray(); 17 | Assert.IsTrue(subArray.Length == 1); 18 | } 19 | } -------------------------------------------------------------------------------- /Tests/DataAccess/StateTest.cs: -------------------------------------------------------------------------------- 1 | using System.Diagnostics; 2 | using DataAccess; 3 | using DataAccess.Dao.Impl; 4 | using DataAccess.Models.Entity; 5 | using Display.Providers; 6 | 7 | namespace Tests.DataAccess; 8 | 9 | [TestClass] 10 | public class StateTest 11 | { 12 | [TestMethod] 13 | public void EntityStateTest() 14 | { 15 | Context.SetSavePath("D:/库/Documents/winui"); 16 | var actorInfoDao = new ActorInfoDao(); 17 | 18 | var name = "成沢めい"; 19 | var actorInfoFromDb = actorInfoDao.GetPartInfoByActorName(name); 20 | 21 | 22 | Assert.IsNotNull(actorInfoFromDb); 23 | 24 | var entityState = actorInfoDao.GetEntityState(actorInfoFromDb); 25 | Debug.WriteLine(entityState); 26 | 27 | var modifyData = "modify"; 28 | 29 | actorInfoDao.Attach(actorInfoFromDb); 30 | entityState = actorInfoDao.GetEntityState(actorInfoFromDb); 31 | Debug.WriteLine(entityState); 32 | 33 | actorInfoFromDb.BlogUrl = modifyData; 34 | actorInfoDao.SaveChanges(); 35 | 36 | var actorInfoResult = actorInfoDao.GetPartInfoByActorName(name); 37 | Assert.IsTrue(actorInfoResult != null && actorInfoResult.BlogUrl == modifyData); 38 | } 39 | } -------------------------------------------------------------------------------- /Tests/DataAccess/TestSettingProvider.cs: -------------------------------------------------------------------------------- 1 |  2 | namespace Tests.DataAccess; 3 | 4 | // internal class TestSettingProvider : ISettingProvider 5 | // { 6 | // public override T GetValue(T defaultValue = default, string propertyName = null) 7 | // { 8 | // throw new NotImplementedException(); 9 | // } 10 | // 11 | // public override void SetValue(T value, string propertyName = null) 12 | // { 13 | // throw new NotImplementedException(); 14 | // } 15 | // } -------------------------------------------------------------------------------- /Tests/DataAccess/UpdateDatabaseTest.cs: -------------------------------------------------------------------------------- 1 | namespace Tests.DataAccess; 2 | 3 | [TestClass] 4 | public class UpdateDatabaseTest 5 | { 6 | [TestMethod] 7 | public void UpdateTest() 8 | { 9 | 10 | } 11 | } -------------------------------------------------------------------------------- /Tests/LocalSettingTest.cs: -------------------------------------------------------------------------------- 1 | using System.Diagnostics; 2 | using Microsoft.Extensions.Configuration; 3 | using Tests.Models; 4 | 5 | namespace Tests; 6 | 7 | [TestClass] 8 | public class LocalSettingTest 9 | { 10 | [AssemblyInitialize] 11 | public static Task AssemblyInitialize(TestContext testContext) 12 | { 13 | var config = new ConfigurationBuilder() 14 | .AddJsonFile("appsettings.json") 15 | .AddEnvironmentVariables() 16 | .Build(); 17 | 18 | var settings = config.GetRequiredSection("Parent").Get(); 19 | 20 | Debug.WriteLine(settings); 21 | return Task.CompletedTask; 22 | } 23 | 24 | 25 | [TestMethod] 26 | public void SettingTest() 27 | { 28 | Debug.WriteLine("123"); 29 | } 30 | } -------------------------------------------------------------------------------- /Tests/Models/Parent.cs: -------------------------------------------------------------------------------- 1 | namespace Tests.Models; 2 | 3 | internal class Parent 4 | { 5 | public int FavoriteNumber { get; set; } 6 | public int Child { get; set; } 7 | } 8 | 9 | internal class Child 10 | { 11 | public string Name { get; set; } 12 | } -------------------------------------------------------------------------------- /Tests/SortTest.cs: -------------------------------------------------------------------------------- 1 | using Display.Helper.FileProperties.Name; 2 | using System.Diagnostics; 3 | 4 | namespace Tests 5 | { 6 | [TestClass] 7 | public class SortTest 8 | { 9 | private readonly Dictionary _sampleFileDictionary = new() 10 | { 11 | { "hhd1080.com@1nhdtb00259hhb.wtbjj0e3", "NHDTB-259" }, 12 | { "hhd800_com@h_1605stsk00038_4Ks", "STSK-038" }, 13 | { "hotavxxx.com_092411-815-carib-whole_hd1", "092411-815" }, 14 | { "hhd800.com@cawd00302hhb", "CAWD-302" }, 15 | { "hhd800.com@cjod00388hhb", "CJOD-388" }, 16 | { "URE-031-C", "URE-031" }, 17 | { "ciel-001", "CIEL-001" } 18 | }; 19 | 20 | [TestMethod] 21 | public void MatchNameTest() 22 | { 23 | foreach (var (src, dst) in _sampleFileDictionary) 24 | { 25 | var destinationName = FileMatch.MatchName(src).ToUpper(); 26 | Debug.WriteLine(destinationName); 27 | 28 | Assert.IsNotNull(destinationName, "未匹配:" + src); 29 | Assert.AreEqual(dst, destinationName, $"匹配出错:{src}"); 30 | } 31 | } 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /Tests/Usings.cs: -------------------------------------------------------------------------------- 1 | global using Microsoft.VisualStudio.TestTools.UnitTesting; -------------------------------------------------------------------------------- /Tests/appsettings.json: -------------------------------------------------------------------------------- 1 | { 2 | "Parent": { 3 | "FavoriteNumber": 7, 4 | "Child": { 5 | "Name": "Example" 6 | } 7 | } 8 | } -------------------------------------------------------------------------------- /qodana.yaml: -------------------------------------------------------------------------------- 1 | #-------------------------------------------------------------------------------# 2 | # Qodana analysis is configured by qodana.yaml file # 3 | # https://www.jetbrains.com/help/qodana/qodana-yaml.html # 4 | #-------------------------------------------------------------------------------# 5 | version: "1.0" 6 | 7 | #Specify IDE code to run analysis without container (Applied in CI/CD pipeline) 8 | ide: QDNET 9 | 10 | #Specify inspection profile for code analysis 11 | profile: 12 | name: qodana.starter 13 | 14 | #Enable inspections 15 | #include: 16 | # - name: 17 | 18 | #Disable inspections 19 | #exclude: 20 | # - name: 21 | # paths: 22 | # - 23 | 24 | #Execute shell command before Qodana execution (Applied in CI/CD pipeline) 25 | #bootstrap: sh ./prepare-qodana.sh 26 | 27 | #Install IDE plugins before Qodana execution (Applied in CI/CD pipeline) 28 | #plugins: 29 | # - id: #(plugin id can be found at https://plugins.jetbrains.com) 30 | exclude: 31 | - name: All 32 | paths: 33 | - Display\Themes\Generic.xaml 34 | - Display\Views\Pages\SpiderVideoInfo\Progress.xaml 35 | - DataAccess\Models\Entity 36 | - name: UnusedAutoPropertyAccessor.Global 37 | --------------------------------------------------------------------------------