From c91bde761ee4aa288b814253334ca1c6d0a5d7e7 Mon Sep 17 00:00:00 2001 From: "Amir.H Khademi" Date: Fri, 15 Jan 2021 18:13:54 +0330 Subject: [PATCH] Add project files. --- .gitattributes | 63 +++ .gitignore | 340 +++++++++++++++ Plix.sln | 25 ++ Plix.sln.DotSettings | 2 + PlixLogo.ico | Bin 0 -> 125300 bytes PlixLogo.png | Bin 0 -> 28554 bytes PlixP/App.xaml | 44 ++ PlixP/App.xaml.cs | 55 +++ PlixP/Extentions/Assert.cs | 38 ++ PlixP/Extentions/AutoMapperConfig.cs | 29 ++ PlixP/Extentions/WpfExtensions.cs | 49 +++ PlixP/FodyWeavers.xml | 3 + PlixP/FodyWeavers.xsd | 74 ++++ .../20201219204740_init.Designer.cs | 244 +++++++++++ PlixP/Migrations/20201219204740_init.cs | 150 +++++++ PlixP/Migrations/PlixContextModelSnapshot.cs | 242 +++++++++++ PlixP/Models/BaseDto.cs | 60 +++ PlixP/Models/Category.cs | 15 + PlixP/Models/CategoryMovie.cs | 21 + PlixP/Models/CustomMappingProfile.cs | 18 + PlixP/Models/Entity.cs | 18 + PlixP/Models/IMapperConf.cs | 14 + PlixP/Models/Movie.cs | 122 ++++++ PlixP/Models/MovieDto.cs | 78 ++++ PlixP/Models/MovieListModel.cs | 39 ++ PlixP/Models/PlixContext.cs | 19 + PlixP/Models/Rating.cs | 17 + PlixP/PlixLogo.ico | Bin 0 -> 125300 bytes PlixP/PlixP.csproj | 46 +++ PlixP/Renders/ImageCacher.cs | 91 ++++ PlixP/Repositories/BaseRepository.cs | 220 ++++++++++ .../Repositories/Contracts/IBaseRepository.cs | 41 ++ .../Contracts/IRepositoryWrapper.cs | 14 + PlixP/Repositories/RepositoryWrapper.cs | 24 ++ PlixP/Resources/PlixLogo.ico | Bin 0 -> 125300 bytes PlixP/Resources/PlixLogo.png | Bin 0 -> 28554 bytes PlixP/Resources/SPLASH.png | Bin 0 -> 29027 bytes PlixP/Services/CatcherService.cs | 49 +++ PlixP/Services/Contracts/IServiceWrapper.cs | 15 + PlixP/Services/LocalServices.cs | 216 ++++++++++ PlixP/Services/MovieServices.cs | 389 ++++++++++++++++++ PlixP/Services/ServiceWrapper.cs | 48 +++ .../ViewModels/AddCategoryDialogViewModel.cs | 16 + PlixP/ViewModels/GenresDialogViewModel.cs | 45 ++ PlixP/ViewModels/MainWindowViewModel.cs | 45 ++ PlixP/ViewModels/MasterDetailViewModel.cs | 107 +++++ PlixP/ViewModels/MovieDialogViewModel.cs | 162 ++++++++ PlixP/ViewModels/MovieItemViewModel.cs | 18 + PlixP/ViewModels/MovieListViewModel.cs | 195 +++++++++ PlixP/ViewModels/SuggestionBoxViewModel.cs | 16 + PlixP/Views/Dialogs/AddCategoryDialog.xaml | 15 + PlixP/Views/Dialogs/AddCategoryDialog.xaml.cs | 15 + PlixP/Views/Dialogs/GenresDialog.xaml | 101 +++++ PlixP/Views/Dialogs/GenresDialog.xaml.cs | 39 ++ PlixP/Views/Dialogs/LoadingDialog.xaml | 34 ++ PlixP/Views/Dialogs/LoadingDialog.xaml.cs | 28 ++ PlixP/Views/Dialogs/MovieDialog.xaml | 337 +++++++++++++++ PlixP/Views/Dialogs/MovieDialog.xaml.cs | 143 +++++++ PlixP/Views/Dialogs/QuestionDialog.xaml | 49 +++ PlixP/Views/Dialogs/QuestionDialog.xaml.cs | 38 ++ PlixP/Views/Dialogs/RestartAppDialog.xaml | 40 ++ PlixP/Views/Dialogs/RestartAppDialog.xaml.cs | 35 ++ PlixP/Views/MainWindow.xaml | 46 +++ PlixP/Views/MainWindow.xaml.cs | 25 ++ PlixP/Views/MasterDetail.xaml | 173 ++++++++ PlixP/Views/MasterDetail.xaml.cs | 34 ++ PlixP/Views/MovieList.xaml | 198 +++++++++ PlixP/Views/MovieList.xaml.cs | 98 +++++ PlixP/Views/Template/MovieItem.xaml | 115 ++++++ PlixP/Views/Template/MovieItem.xaml.cs | 51 +++ PlixP/Views/Template/SuggestionBox.xaml | 21 + PlixP/Views/Template/SuggestionBox.xaml.cs | 15 + 72 files changed, 5186 insertions(+) create mode 100644 .gitattributes create mode 100644 .gitignore create mode 100644 Plix.sln create mode 100644 Plix.sln.DotSettings create mode 100644 PlixLogo.ico create mode 100644 PlixLogo.png create mode 100644 PlixP/App.xaml create mode 100644 PlixP/App.xaml.cs create mode 100644 PlixP/Extentions/Assert.cs create mode 100644 PlixP/Extentions/AutoMapperConfig.cs create mode 100644 PlixP/Extentions/WpfExtensions.cs create mode 100644 PlixP/FodyWeavers.xml create mode 100644 PlixP/FodyWeavers.xsd create mode 100644 PlixP/Migrations/20201219204740_init.Designer.cs create mode 100644 PlixP/Migrations/20201219204740_init.cs create mode 100644 PlixP/Migrations/PlixContextModelSnapshot.cs create mode 100644 PlixP/Models/BaseDto.cs create mode 100644 PlixP/Models/Category.cs create mode 100644 PlixP/Models/CategoryMovie.cs create mode 100644 PlixP/Models/CustomMappingProfile.cs create mode 100644 PlixP/Models/Entity.cs create mode 100644 PlixP/Models/IMapperConf.cs create mode 100644 PlixP/Models/Movie.cs create mode 100644 PlixP/Models/MovieDto.cs create mode 100644 PlixP/Models/MovieListModel.cs create mode 100644 PlixP/Models/PlixContext.cs create mode 100644 PlixP/Models/Rating.cs create mode 100644 PlixP/PlixLogo.ico create mode 100644 PlixP/PlixP.csproj create mode 100644 PlixP/Renders/ImageCacher.cs create mode 100644 PlixP/Repositories/BaseRepository.cs create mode 100644 PlixP/Repositories/Contracts/IBaseRepository.cs create mode 100644 PlixP/Repositories/Contracts/IRepositoryWrapper.cs create mode 100644 PlixP/Repositories/RepositoryWrapper.cs create mode 100644 PlixP/Resources/PlixLogo.ico create mode 100644 PlixP/Resources/PlixLogo.png create mode 100644 PlixP/Resources/SPLASH.png create mode 100644 PlixP/Services/CatcherService.cs create mode 100644 PlixP/Services/Contracts/IServiceWrapper.cs create mode 100644 PlixP/Services/LocalServices.cs create mode 100644 PlixP/Services/MovieServices.cs create mode 100644 PlixP/Services/ServiceWrapper.cs create mode 100644 PlixP/ViewModels/AddCategoryDialogViewModel.cs create mode 100644 PlixP/ViewModels/GenresDialogViewModel.cs create mode 100644 PlixP/ViewModels/MainWindowViewModel.cs create mode 100644 PlixP/ViewModels/MasterDetailViewModel.cs create mode 100644 PlixP/ViewModels/MovieDialogViewModel.cs create mode 100644 PlixP/ViewModels/MovieItemViewModel.cs create mode 100644 PlixP/ViewModels/MovieListViewModel.cs create mode 100644 PlixP/ViewModels/SuggestionBoxViewModel.cs create mode 100644 PlixP/Views/Dialogs/AddCategoryDialog.xaml create mode 100644 PlixP/Views/Dialogs/AddCategoryDialog.xaml.cs create mode 100644 PlixP/Views/Dialogs/GenresDialog.xaml create mode 100644 PlixP/Views/Dialogs/GenresDialog.xaml.cs create mode 100644 PlixP/Views/Dialogs/LoadingDialog.xaml create mode 100644 PlixP/Views/Dialogs/LoadingDialog.xaml.cs create mode 100644 PlixP/Views/Dialogs/MovieDialog.xaml create mode 100644 PlixP/Views/Dialogs/MovieDialog.xaml.cs create mode 100644 PlixP/Views/Dialogs/QuestionDialog.xaml create mode 100644 PlixP/Views/Dialogs/QuestionDialog.xaml.cs create mode 100644 PlixP/Views/Dialogs/RestartAppDialog.xaml create mode 100644 PlixP/Views/Dialogs/RestartAppDialog.xaml.cs create mode 100644 PlixP/Views/MainWindow.xaml create mode 100644 PlixP/Views/MainWindow.xaml.cs create mode 100644 PlixP/Views/MasterDetail.xaml create mode 100644 PlixP/Views/MasterDetail.xaml.cs create mode 100644 PlixP/Views/MovieList.xaml create mode 100644 PlixP/Views/MovieList.xaml.cs create mode 100644 PlixP/Views/Template/MovieItem.xaml create mode 100644 PlixP/Views/Template/MovieItem.xaml.cs create mode 100644 PlixP/Views/Template/SuggestionBox.xaml create mode 100644 PlixP/Views/Template/SuggestionBox.xaml.cs diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..1ff0c42 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,63 @@ +############################################################################### +# Set default behavior to automatically normalize line endings. +############################################################################### +* text=auto + +############################################################################### +# Set default behavior for command prompt diff. +# +# This is need for earlier builds of msysgit that does not have it on by +# default for csharp files. +# Note: This is only used by command line +############################################################################### +#*.cs diff=csharp + +############################################################################### +# Set the merge driver for project and solution files +# +# Merging from the command prompt will add diff markers to the files if there +# are conflicts (Merging from VS is not affected by the settings below, in VS +# the diff markers are never inserted). Diff markers may cause the following +# file extensions to fail to load in VS. An alternative would be to treat +# these files as binary and thus will always conflict and require user +# intervention with every merge. To do so, just uncomment the entries below +############################################################################### +#*.sln merge=binary +#*.csproj merge=binary +#*.vbproj merge=binary +#*.vcxproj merge=binary +#*.vcproj merge=binary +#*.dbproj merge=binary +#*.fsproj merge=binary +#*.lsproj merge=binary +#*.wixproj merge=binary +#*.modelproj merge=binary +#*.sqlproj merge=binary +#*.wwaproj merge=binary + +############################################################################### +# behavior for image files +# +# image files are treated as binary by default. +############################################################################### +#*.jpg binary +#*.png binary +#*.gif binary + +############################################################################### +# diff behavior for common document formats +# +# Convert binary document formats to text before diffing them. This feature +# is only available from the command line. Turn it on by uncommenting the +# entries below. +############################################################################### +#*.doc diff=astextplain +#*.DOC diff=astextplain +#*.docx diff=astextplain +#*.DOCX diff=astextplain +#*.dot diff=astextplain +#*.DOT diff=astextplain +#*.pdf diff=astextplain +#*.PDF diff=astextplain +#*.rtf diff=astextplain +#*.RTF diff=astextplain diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..4ce6fdd --- /dev/null +++ b/.gitignore @@ -0,0 +1,340 @@ +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. +## +## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore + +# User-specific files +*.rsuser +*.suo +*.user +*.userosscache +*.sln.docstates + +# User-specific files (MonoDevelop/Xamarin Studio) +*.userprefs + +# Build results +[Dd]ebug/ +[Dd]ebugPublic/ +[Rr]elease/ +[Rr]eleases/ +x64/ +x86/ +[Aa][Rr][Mm]/ +[Aa][Rr][Mm]64/ +bld/ +[Bb]in/ +[Oo]bj/ +[Ll]og/ + +# Visual Studio 2015/2017 cache/options directory +.vs/ +# Uncomment if you have tasks that create the project's static files in wwwroot +#wwwroot/ + +# Visual Studio 2017 auto generated files +Generated\ Files/ + +# MSTest test Results +[Tt]est[Rr]esult*/ +[Bb]uild[Ll]og.* + +# NUNIT +*.VisualState.xml +TestResult.xml + +# Build Results of an ATL Project +[Dd]ebugPS/ +[Rr]eleasePS/ +dlldata.c + +# Benchmark Results +BenchmarkDotNet.Artifacts/ + +# .NET Core +project.lock.json +project.fragment.lock.json +artifacts/ + +# StyleCop +StyleCopReport.xml + +# Files built by Visual Studio +*_i.c +*_p.c +*_h.h +*.ilk +*.meta +*.obj +*.iobj +*.pch +*.pdb +*.ipdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.tmp_proj +*_wpftmp.csproj +*.log +*.vspscc +*.vssscc +.builds +*.pidb +*.svclog +*.scc + +# Chutzpah Test files +_Chutzpah* + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opendb +*.opensdf +*.sdf +*.cachefile +*.VC.db +*.VC.VC.opendb + +# Visual Studio profiler +*.psess +*.vsp +*.vspx +*.sap + +# Visual Studio Trace Files +*.e2e + +# TFS 2012 Local Workspace +$tf/ + +# Guidance Automation Toolkit +*.gpState + +# ReSharper is a .NET coding add-in +_ReSharper*/ +*.[Rr]e[Ss]harper +*.DotSettings.user + +# JustCode is a .NET coding add-in +.JustCode + +# TeamCity is a build add-in +_TeamCity* + +# DotCover is a Code Coverage Tool +*.dotCover + +# AxoCover is a Code Coverage Tool +.axoCover/* +!.axoCover/settings.json + +# Visual Studio code coverage results +*.coverage +*.coveragexml + +# NCrunch +_NCrunch_* +.*crunch*.local.xml +nCrunchTemp_* + +# MightyMoose +*.mm.* +AutoTest.Net/ + +# Web workbench (sass) +.sass-cache/ + +# Installshield output folder +[Ee]xpress/ + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html + +# Click-Once directory +publish/ + +# Publish Web Output +*.[Pp]ublish.xml +*.azurePubxml +# Note: Comment the next line if you want to checkin your web deploy settings, +# but database connection strings (with potential passwords) will be unencrypted +*.pubxml +*.publishproj + +# Microsoft Azure Web App publish settings. Comment the next line if you want to +# checkin your Azure Web App publish settings, but sensitive information contained +# in these scripts will be unencrypted +PublishScripts/ + +# NuGet Packages +*.nupkg +# The packages folder can be ignored because of Package Restore +**/[Pp]ackages/* +# except build/, which is used as an MSBuild target. +!**/[Pp]ackages/build/ +# Uncomment if necessary however generally it will be regenerated when needed +#!**/[Pp]ackages/repositories.config +# NuGet v3's project.json files produces more ignorable files +*.nuget.props +*.nuget.targets + +# Microsoft Azure Build Output +csx/ +*.build.csdef + +# Microsoft Azure Emulator +ecf/ +rcf/ + +# Windows Store app package directories and files +AppPackages/ +BundleArtifacts/ +Package.StoreAssociation.xml +_pkginfo.txt +*.appx + +# Visual Studio cache files +# files ending in .cache can be ignored +*.[Cc]ache +# but keep track of directories ending in .cache +!?*.[Cc]ache/ + +# Others +ClientBin/ +~$* +*~ +*.dbmdl +*.dbproj.schemaview +*.jfm +*.pfx +*.publishsettings +orleans.codegen.cs + +# Including strong name files can present a security risk +# (https://github.com/github/gitignore/pull/2483#issue-259490424) +#*.snk + +# Since there are multiple workflows, uncomment next line to ignore bower_components +# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) +#bower_components/ + +# RIA/Silverlight projects +Generated_Code/ + +# Backup & report files from converting an old project file +# to a newer Visual Studio version. Backup files are not needed, +# because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML +UpgradeLog*.htm +ServiceFabricBackup/ +*.rptproj.bak + +# SQL Server files +*.mdf +*.ldf +*.ndf + +# Business Intelligence projects +*.rdl.data +*.bim.layout +*.bim_*.settings +*.rptproj.rsuser +*- Backup*.rdl + +# Microsoft Fakes +FakesAssemblies/ + +# GhostDoc plugin setting file +*.GhostDoc.xml + +# Node.js Tools for Visual Studio +.ntvs_analysis.dat +node_modules/ + +# Visual Studio 6 build log +*.plg + +# Visual Studio 6 workspace options file +*.opt + +# Visual Studio 6 auto-generated workspace file (contains which files were open etc.) +*.vbw + +# Visual Studio LightSwitch build output +**/*.HTMLClient/GeneratedArtifacts +**/*.DesktopClient/GeneratedArtifacts +**/*.DesktopClient/ModelManifest.xml +**/*.Server/GeneratedArtifacts +**/*.Server/ModelManifest.xml +_Pvt_Extensions + +# Paket dependency manager +.paket/paket.exe +paket-files/ + +# FAKE - F# Make +.fake/ + +# JetBrains Rider +.idea/ +*.sln.iml + +# CodeRush personal settings +.cr/personal + +# Python Tools for Visual Studio (PTVS) +__pycache__/ +*.pyc + +# Cake - Uncomment if you are using it +# tools/** +# !tools/packages.config + +# Tabs Studio +*.tss + +# Telerik's JustMock configuration file +*.jmconfig + +# BizTalk build output +*.btp.cs +*.btm.cs +*.odx.cs +*.xsd.cs + +# OpenCover UI analysis results +OpenCover/ + +# Azure Stream Analytics local run output +ASALocalRun/ + +# MSBuild Binary and Structured Log +*.binlog + +# NVidia Nsight GPU debugger configuration file +*.nvuser + +# MFractors (Xamarin productivity tool) working folder +.mfractor/ + +# Local History for Visual Studio +.localhistory/ + +# BeatPulse healthcheck temp database +healthchecksdb \ No newline at end of file diff --git a/Plix.sln b/Plix.sln new file mode 100644 index 0000000..30fbc5f --- /dev/null +++ b/Plix.sln @@ -0,0 +1,25 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.29613.14 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "PlixP", "PlixP\PlixP.csproj", "{D97DA4A8-8F8C-4A43-A868-69912C04BEE7}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {D97DA4A8-8F8C-4A43-A868-69912C04BEE7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D97DA4A8-8F8C-4A43-A868-69912C04BEE7}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D97DA4A8-8F8C-4A43-A868-69912C04BEE7}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D97DA4A8-8F8C-4A43-A868-69912C04BEE7}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {17816672-B5D2-4079-83EA-D88ABDD69DEE} + EndGlobalSection +EndGlobal diff --git a/Plix.sln.DotSettings b/Plix.sln.DotSettings new file mode 100644 index 0000000..1de041c --- /dev/null +++ b/Plix.sln.DotSettings @@ -0,0 +1,2 @@ + + True \ No newline at end of file diff --git a/PlixLogo.ico b/PlixLogo.ico new file mode 100644 index 0000000000000000000000000000000000000000..4ffdaf5f9892781c00e88260dc77c068c27e241c GIT binary patch literal 125300 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

!(SVx~cTr%lR|gw$~ab7!KV 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øW5=yc@>8_hkB4Lt8rKTHB&cz3g2lX`7mbF?KuRe2ChT0I!Q?wNIA|n9^YTV zz&tI<+n?RC>Hpo*jguqJ?@*&10QMigZHK&>8934En^%WFf6L3_iyEqXMAz=;1kC@t z&0M00Mkg0!%l(9J{}1HMPgAv);Vt16R4Sl&uAhLoE=oa?9-b!Boj|VtH05>wK(+aP z8oos=hM&YmoaYvJjx+56Om|x{gE5R-I@Mo)YfJgvSWBty(9aA24?etOqINpZI$^TDNxE4JrncgXA2|YM4%uNUJX)ed9c`SAU4^*kLsA1l8xh1Q5Zb zi35D;>D}{rdRKpl@X%F=cSt@)#b9Qi%WU6gA#;v3QLj9IQ}y?`FUSb&Xd@l~?tS#R z&PY#86^*Z6%12K=viZ_gi^?~qw0qoGF&xDb=O72AASfPysAz$C>BFh91gEW+6}y|`HF~aRbdO3?)~0`{@)wBY2&c- z$aB7Po}2(M*4nW*OiIwm>D+u5zq{f%PV>PpCnj(iNM{7Kpey`KE2Uq_c8gY!9cIInKGDSfwK+P*(VPbYPVo9-apbpi4AZ(wV$Lo|@` zp*qkz8j^1m>7p$1UCEp*p zwURCGd&5ck{wn$raUD`BC{)0dG%HGFcO2I5pY9B%`?Ti?+C?JM2H7oNLhtzoEPo+s zua}XQpG3ao5Xcu2L!B|;tcR83SZ5>E`a94yH{u?;3Ld?Ivg{$DBKRgIEj&Hy@(|xI zK$1b)?wmysOBew!fllgu^(!0wN6RGDN!iZZPVN^2?VK8Zb;1wslz-WK4?FGnmHce# z2q8B#B^)_CEBV5?h!AOz)4^*X7E9^4Ns5QROa8!r<9wh!yquKpN#TYt6xA-VI|-dl zNN*$bTWH}L6h)4aQK}F;II~*FbDkN}-4OvQNr=yJ+FN(!rt*(BYPNo7Ys?0KwY|>H zd3S+_9)VAPv-rKe-qty0c@~aKy$sEIi0W>zF<@Ajz{LiVjLfz18c112FJw3>!qj@g z=5-)O6h|__Igg3piY8Q}fS^ICsuFLG+y`PT@!}Ep#O=8U%q%Bjt`tl}rtnYDFOv zL8XCZzSiS&R_FPs5Y*RFW1&Q-qyB^jYKlu0!5PuAL1(5p%VULe1i=MmePtheu+mR8 zo$Qh%@&GVwV>|B?1X2ax_;&Nk&Zfyff8%N0KbMZr%q3I}=NuaA7K8KAB}gvS<(%s9 z<}d;01V~$Lph*21lv=n0raM03Qtb_x1F?it!=%pObE1P({yB-ESY4it;WUz@U`y#P z{>Zvbf3-Qqo;h|&qILlA&r?+3X)(|QH{Ub-fs+nPhweR^ey)mj(8HPZ8;m;4=HGHw zY&-EysMUnG|NBuhW!~c3~!00GOECHPQHqDY*MVS!+J~+243`>-<*MJtS2T?}d~i;&xz} z(|`f9m`WnfWi*Y>^;6YfesOL3bT=7=n{KDRYj98p0e8j2dts;n>n7awSKZkC-5%~C zL=ba`liCv)Fkqfh*IjNc%Ru3|96K8XBaV2S`CT6A?N=A_Odkl- zKVY6AwPaq7(sLbh1hwk+^EdJ{_jl#)=nYSQ_iF~`z8P5pNPp)qcq8+s|Mh)-<(7xC zPlsGg20_39^NGH?Pme$df@pcy6`T3B2Yc}cg=5A$N6m-GSx)DUSa~Dm3%SGqKR!*7y#%m3*fE? z@2}pozMX#;$q|k0nvCcH19l9xWS0ZqC0R~RhLhd{k96JtnT+leeijXWm_-Hvm`-=S zbMoI!dmXTw;7mxa7Ss{*wOqTa@bn(s()NE)#r&f(i?_CBrvacJ7<78u z!yEFSd1NYmr|^nOBpD1A1_NdjK?|HI$yca1a`g|bE*tNgO7d^Bb>^RD)*1i+1U%ex z)9S`g-@PIKaxR`QyN`IlZbs!56U8jU;gDo^-!virb3Dqd3-~<|vwk>DZxMd?-m!Py zu)6WDSuyBmH(>UVC&;P{$tK9n-}&9~@Sb(izBHS*`ksneZvdb+0-3Y%|Gaj=|M>4a zhySF=XSZ85VD~{SV0nkGj^6wqYuayLSLsFB98$HJ69xe4jKRzk|MkC%_kI2P>^FUG zYn{}(dEij1C9$Kcvj}VHteHOQ0rLwXibtiwiy{WzYqdG~&wTKK>h*WG_3C1db-sS(c9!jS4ftIfqwIs4B`Jl=-wi|9}BI2BV^xB0de#HNj;u zt}XfCecj^c*H-DCxiS+p?^}%u{6@GMABe3tSrP z6b#tGcu&VGNMr=R;o8mlAN*i~-^!eg@2t)}JDWLY0H(=<@xa>R;wx_}UN&CIr-P5? zVnN3lRo=l{#=ry&*l`#V9l5nopRQl0<=ei$F8yhMa*mFDU=AAqsLP2P!B#)CrT8D0 zJP>~0g{lhHK*iWzRC!H_HOze5v3v0i6IMy~_~5sx_s>iW%F6S)aNvJLB^ z|I5!lI{x-{(rf0z9{)38UKjuX1iF=-f7M;?oVynL3Fg8p#ucGLe}fntlDh*Kd0LwVNmYqv3=(80ddW z=8XZE#)(m6)_Y)G_>-?*r|;-AxI9aq+#JY!??yb}xga7`mhj#YD#$H^eDsbrZGQLC zwG;oJN3IJyyL;9QF+b0W+7Oh{zID@m!*9Itf&BfF*#_r*-`WdC0_qlxO2VXmeh?;@ z|G0iNnf4pB3Wi6}WP}jxA>@i5ta;?OIx+rfMApo=S$})xtpR{Kai~hNZsV5l8&}-j zJZJ5=T$eX|Oj(IJMQ}I^fXB>Gs|~?``Azal5XDRo1k->QBRF^O9bNsS&)&V^4QnSm zUk=XA`yo=h(IGV9$MeHB(%G)S~t$G?Y}JhrAFRZSTY4p2+1J{EI3MuxHPZr z;%<+b5K~5>LKP~SSx@incMdx>q_dx0_4^yTzSu^m7Js+j#XI&HsDzJwva# zXKlQo@ZP)?kODE(9zdg4%=F<7*ohc|PZ=7fkVZ+B8u#2Z>3;swHSydHJ-edtyVoLc zw=e+PQ)EUouKDQ2@l6-q7~Z)icCHCIm?b(P5p(^q-`K70hk3)3ZTN~Q4PO$n{L%Zj z@WC%W(tFLdo83o;0#oyOt^Z`q`z62=;RK3|?!AxLCntRC!h;vPcOSIa{o+_ER`oQJ zoRKBhS9lDVD&ity0cV0rLb1LA?10&W;LWJKQCXx&b*EiL2$~QlWI1}zMEI}O>xw_$ zRCO-ys<9vdKW_JT6L#x6I13!-^6FFtX_!dLz1(cZ@^!eq-pG?K&W(GzKRh(oFwE8Ex}g%9fHMav;a!RIFdpUN3m*1w`_z3yufKb|y0{f)wkywUV7K%D zwnqeVZ)}|4j_=)`|IAIRd;fCOUPJFbXvNe|cJ#FjG9%LfnlNvJ6~Zh+ zlHjROFO;!?&)RsP+iqQVbGP%6A54^=PE)N(CpM6l>$BS%0I0`s<{|g6rE8a6^?+RV zz}lt%e)L|wcP}5FILGHUl$ALoPcNS!Igg7C=;sm)m<NzWTzg|Wu>h9L}##;KXdoL<~cE!?k#zL>lT)7za z31o`F*EbueHRKJ*T_DrIRB2aTHQD)(huXzwMACXEM()^c*ZEJy;0}HgoETYvO>Hh7 zUz1;a)4lmAtM=OPb4Rb(^74XgUsEHRAvm-j5pa@F6(Hb5k(5aN6jGbL((tp6B>mbB ztj^ECgC#^9$s*ze>ud0f^}uIj&R9Fe#ScvN{{7)jb)lrV7MGDt$8rZeAp-;OGz14B z80*`1)z!D>S1lg(`%abVr}oIQbC(TqR9Piw&hQpdb>Ia_T`CQb1$;6D#diB}(=$T^ za)X|MIRj@1848pb&B_So>5<6A(_?gfuZmy2dbM6~(?tIDMMbZ-C^N(f1O4cyXJ7!H zAx@wX3^luNP22zJgX6`=Eb-#g51RVfhU!TnD;Ad~m_|H~!g*pvKkgh*_wOT zWS`%-EdTri8^bBBMm+n7W#wD*Jm0^H2`^nlia{5nXNdv5ARvOPwBE`ifEb$Dy?1X( zH$2=8|F$qsSFDY)er=`fQFxp%?@D!d1p@={JjlEu0%q>2>+kbdedC(!?@u_mdhJUO zUH_oH}~}J^_t?6LI?su z1_t)|Ffaf+h(-pR+pO)BeEg9~`S?w%-QJtJ%@fZ)uy^jrP&m-jJH8PD-7>4Q2&IR4 z4@vL}CJwBJ;YgBU1|EkaVFo51Os9k1vm&r%{8*z#=P(>%+BbTFnc)PyC9EGXRT6@M zfHNbRpg1z;$eq#YF*P2!^6qwa)xBGKUplfm{%{ytuy!&kxrZrK5t5AC$Ftdh0kiO2M01m}qtMHm3k_cibj;=H?t#G1X0dJ6tP+CqdJ-oAf zADGlTZr@^KGnU?(90jZptz;8BGyUHbrE zI(}vGM_<3UIQGm#J1(R);|&h5zK^Sj?~XKFRVmG2$slPWGaP?YuemA?8dLXa!cceZVdmm zIOv+M-cNkx{&kLe=IX~_%+fx6_pffp?;JW--Td{3@<(62v>flof{994ksE{j{9Vhy0L%cspNF11$UXOt zm)v{D2D$RMCC2&JH5Q(>S9N@zReL_tDPC~+a(~3~W?bofT;_!(m>|yK#fZ@`2ilJb zm;rrhv+eD|Gapd$gtM(p|EHgzGrg`4^==4?P$ox~WuR8YXm^e$>)bysx9!!M`d&2u z$Y<^yy7{!lz5ANpxOXz=@C6-mS9=qK2>#45FaWavCv_b{e_g++aQyf6Yv6kiyHA{# z<=N<-wEp9op(QI?lP4dsQdW#Mve7MDs*^_xT{)EN(#-p!5v0g7Z5dFSVG0&OR4{Q= zHeJ7{^+gv0QPe=F%VtdtlHo*fB4COIhqHRU??u4SPH9`pL~l#-o5y>)$!ol2ao&6Q zmWk|<%hoh*Idy5gdB4$AUim1Kr!Eur9))Q~-q)R;XW&~N@I(v@z%0b54MHn}%vmMa zmJL&GOGCKZ#JFcYeEO1%6Zcy*a@69rOAlP`i|aOJ#Sb1%2d)}TOZO<^s^Mnd7;Ctp z;f&$JTQe7JcqdXRZ0xy}PHa?6!30c9)w-j(+?6{QJ4t%&M5h;}s>+@pFPU81%~wA> z=^p7t?t9B2tXbD}-5WQAEmu9%+ce_T{@1b4sf-OB=)}I}g0H=u!Em3w3=F^=!Mpk) zfOB;`A#*z6go(_ + + + + + + + + + String 1A + String 1B + String 1C + String 1A + String 1B + String 1C + + + + + + + + + + + + + + + diff --git a/PlixP/App.xaml.cs b/PlixP/App.xaml.cs new file mode 100644 index 0000000..d2e8394 --- /dev/null +++ b/PlixP/App.xaml.cs @@ -0,0 +1,55 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using Prism.Ioc; +using PlixP.Views; +using System.Windows; +using AutoMapper; +using Microsoft.EntityFrameworkCore; +using PlixP.Extentions; +using PlixP.Models; +using PlixP.Repositories; +using PlixP.Repositories.Contracts; +using PlixP.Services; +using PlixP.Services.Contracts; + +namespace PlixP +{ + ///

+ /// Interaction logic for App.xaml + /// + public partial class App + { + protected override Window CreateShell() + { + var _catcherService = new CatcherService(); + _catcherService.Delete>(CatcherKeys.MovieList); + using (var _context = new PlixContext()) + { + _context.Database.Migrate(); + if (_context.Categories.Count() == 0) + { + _context.Categories.Add(new Category + { + Name = "Uncategorized" + }); + _context.SaveChanges(); + } + } + + AutoMapperConfig.ConfigurationMapper(); + App.Current.ConfigureExceptionHandling(AppDomain.CurrentDomain); + MovieServiceRealTime.Instance.StartReal(); + return Container.Resolve(); + } + + + protected override void RegisterTypes(IContainerRegistry containerRegistry) + { + containerRegistry.RegisterForNavigation(); + containerRegistry.Register(); + containerRegistry.Register(); + } + } +} diff --git a/PlixP/Extentions/Assert.cs b/PlixP/Extentions/Assert.cs new file mode 100644 index 0000000..ad56c07 --- /dev/null +++ b/PlixP/Extentions/Assert.cs @@ -0,0 +1,38 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace PlixP.Extentions +{ + public static class Assert + { + public static void NotNull(T obj, string name, string message = null) + where T : class + { + if (obj is null) + throw new ArgumentNullException($"{name} : {typeof(T)}", message); + } + + public static void NotNull(T? obj, string name, string message = null) + where T : struct + { + if (!obj.HasValue) + throw new ArgumentNullException($"{name} : {typeof(T)}", message); + + } + + public static void NotEmpty(T obj, string name, string message = null, T defaultValue = null) + where T : class + { + if (obj == defaultValue + || (obj is string str && string.IsNullOrWhiteSpace(str)) + || (obj is IEnumerable list && !list.Cast().Any())) + { + throw new ArgumentException("Argument is empty : " + message, $"{name} : {typeof(T)}"); + } + } + } +} diff --git a/PlixP/Extentions/AutoMapperConfig.cs b/PlixP/Extentions/AutoMapperConfig.cs new file mode 100644 index 0000000..af34652 --- /dev/null +++ b/PlixP/Extentions/AutoMapperConfig.cs @@ -0,0 +1,29 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using System.Text; +using System.Threading.Tasks; +using AutoMapper; +using PlixP.Models; + +namespace PlixP.Extentions +{ + public static class AutoMapperConfig + { + public static void ConfigurationMapper() + { + Mapper.Initialize(config => { config.AddCustomMapping(Assembly.GetEntryAssembly()); }); + Mapper.Configuration.CompileMappings(); + } + + public static void AddCustomMapping(this IMapperConfigurationExpression expression, Assembly assemblies) + { + var allTypes = assemblies.ExportedTypes; + var list = allTypes + .Where(type => type.IsClass && !type.IsAbstract && type.GetInterfaces().Contains(typeof(IMapperConf))) + .Select(type => (IMapperConf)Activator.CreateInstance(type)).ToList(); + expression.AddProfile(new CustomMappingProfile(list)); + } + } +} diff --git a/PlixP/Extentions/WpfExtensions.cs b/PlixP/Extentions/WpfExtensions.cs new file mode 100644 index 0000000..38d806f --- /dev/null +++ b/PlixP/Extentions/WpfExtensions.cs @@ -0,0 +1,49 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Media; +using MessageBox = HandyControl.Controls.MessageBox; + +namespace PlixP.Extentions +{ + public static class WpfExtensions + { + public static Brush FromHex(string hexColor) + { + return (SolidColorBrush)(new BrushConverter().ConvertFrom(hexColor)); + } + + public static void ConfigureExceptionHandling(this Application application, AppDomain appDomain) + { + application.Dispatcher.UnhandledException += Dispatcher_UnhandledException; + application.DispatcherUnhandledException += Application_DispatcherUnhandledException; + appDomain.UnhandledException += AppDomain_UnhandledException; + } + + private static void AppDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e) + { + MessageBox.Show(e.ExceptionObject.ToString()); + } + + private static void Application_DispatcherUnhandledException(object sender, System.Windows.Threading.DispatcherUnhandledExceptionEventArgs e) + { + if (e.Handled == false) + { + MessageBox.Show(e.Exception.Message); + e.Handled = true; + } + } + + private static void Dispatcher_UnhandledException(object sender, System.Windows.Threading.DispatcherUnhandledExceptionEventArgs e) + { + if (e.Handled == false) + { + MessageBox.Show(e.Exception.Message); + e.Handled = true; + } + } + } +} diff --git a/PlixP/FodyWeavers.xml b/PlixP/FodyWeavers.xml new file mode 100644 index 0000000..d5abfed --- /dev/null +++ b/PlixP/FodyWeavers.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/PlixP/FodyWeavers.xsd b/PlixP/FodyWeavers.xsd new file mode 100644 index 0000000..69dbe48 --- /dev/null +++ b/PlixP/FodyWeavers.xsd @@ -0,0 +1,74 @@ + + + + + + + + + + + Used to control if the On_PropertyName_Changed feature is enabled. + + + + + Used to control if the Dependent properties feature is enabled. + + + + + Used to control if the IsChanged property feature is enabled. + + + + + Used to change the name of the method that fires the notify event. This is a string that accepts multiple values in a comma separated form. + + + + + Used to control if equality checks should be inserted. If false, equality checking will be disabled for the project. + + + + + Used to control if equality checks should use the Equals method resolved from the base class. + + + + + Used to control if equality checks should use the static Equals method resolved from the base class. + + + + + Used to turn off build warnings from this weaver. + + + + + Used to turn off build warnings about mismatched On_PropertyName_Changed methods. + + + + + + + + 'true' to run assembly verification (PEVerify) on the target assembly after all weavers have been executed. + + + + + A comma-separated list of error codes that can be safely ignored in assembly verification. + + + + + 'false' to turn off automatic generation of the XML Schema file. + + + + + \ No newline at end of file diff --git a/PlixP/Migrations/20201219204740_init.Designer.cs b/PlixP/Migrations/20201219204740_init.Designer.cs new file mode 100644 index 0000000..82154b6 --- /dev/null +++ b/PlixP/Migrations/20201219204740_init.Designer.cs @@ -0,0 +1,244 @@ +// +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using PlixP.Models; + +namespace PlixP.Migrations +{ + [DbContext(typeof(PlixContext))] + [Migration("20201219204740_init")] + partial class init + { + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "5.0.1"); + + modelBuilder.Entity("PlixP.Models.Category", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("CreationDate") + .HasColumnType("TEXT"); + + b.Property("IsRemoved") + .HasColumnType("INTEGER"); + + b.Property("Name") + .HasColumnType("TEXT"); + + b.HasKey("Id"); + + b.ToTable("Categories"); + }); + + modelBuilder.Entity("PlixP.Models.CategoryMovie", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("CategoryId") + .HasColumnType("INTEGER"); + + b.Property("CreationDate") + .HasColumnType("TEXT"); + + b.Property("IsRemoved") + .HasColumnType("INTEGER"); + + b.Property("MovieId") + .HasColumnType("INTEGER"); + + b.HasKey("Id"); + + b.HasIndex("CategoryId"); + + b.HasIndex("MovieId"); + + b.ToTable("CategoryMovies"); + }); + + modelBuilder.Entity("PlixP.Models.Movie", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("Actors") + .HasColumnType("TEXT"); + + b.Property("Awards") + .HasColumnType("TEXT"); + + b.Property("BoxOffice") + .HasColumnType("TEXT"); + + b.Property("Country") + .HasColumnType("TEXT"); + + b.Property("CreationDate") + .HasColumnType("TEXT"); + + b.Property("DVD") + .HasColumnType("TEXT"); + + b.Property("Director") + .HasColumnType("TEXT"); + + b.Property("FileName") + .HasColumnType("TEXT"); + + b.Property("Genre") + .HasColumnType("TEXT"); + + b.Property("IsRemoved") + .HasColumnType("INTEGER"); + + b.Property("IsSeen") + .HasColumnType("INTEGER"); + + b.Property("Language") + .HasColumnType("TEXT"); + + b.Property("Location") + .HasColumnType("TEXT"); + + b.Property("Metascore") + .HasColumnType("TEXT"); + + b.Property("Plot") + .HasColumnType("TEXT"); + + b.Property("Poster") + .HasColumnType("TEXT"); + + b.Property("Production") + .HasColumnType("TEXT"); + + b.Property("Quality") + .HasColumnType("TEXT"); + + b.Property("Rated") + .HasColumnType("TEXT"); + + b.Property("Released") + .HasColumnType("TEXT"); + + b.Property("Response") + .HasColumnType("TEXT"); + + b.Property("Runtime") + .HasColumnType("TEXT"); + + b.Property("SyncStatus") + .HasColumnType("INTEGER"); + + b.Property("Title") + .HasColumnType("TEXT"); + + b.Property("Type") + .HasColumnType("TEXT"); + + b.Property("Website") + .HasColumnType("TEXT"); + + b.Property("Writer") + .HasColumnType("TEXT"); + + b.Property("Year") + .HasColumnType("TEXT"); + + b.Property("imdbID") + .HasColumnType("TEXT"); + + b.Property("imdbRating") + .HasColumnType("TEXT"); + + b.Property("imdbVotes") + .HasColumnType("TEXT"); + + b.HasKey("Id"); + + b.ToTable("Movies"); + }); + + modelBuilder.Entity("PlixP.Models.Rating", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("CreationDate") + .HasColumnType("TEXT"); + + b.Property("IsRemoved") + .HasColumnType("INTEGER"); + + b.Property("MovieId") + .HasColumnType("INTEGER"); + + b.Property("Source") + .HasColumnType("TEXT"); + + b.Property("Value") + .HasColumnType("TEXT"); + + b.HasKey("Id"); + + b.HasIndex("MovieId"); + + b.ToTable("Ratings"); + }); + + modelBuilder.Entity("PlixP.Models.CategoryMovie", b => + { + b.HasOne("PlixP.Models.Category", "Category") + .WithMany("Movies") + .HasForeignKey("CategoryId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("PlixP.Models.Movie", "Movie") + .WithMany("Category") + .HasForeignKey("MovieId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Category"); + + b.Navigation("Movie"); + }); + + modelBuilder.Entity("PlixP.Models.Rating", b => + { + b.HasOne("PlixP.Models.Movie", "Movie") + .WithMany("Ratings") + .HasForeignKey("MovieId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Movie"); + }); + + modelBuilder.Entity("PlixP.Models.Category", b => + { + b.Navigation("Movies"); + }); + + modelBuilder.Entity("PlixP.Models.Movie", b => + { + b.Navigation("Category"); + + b.Navigation("Ratings"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/PlixP/Migrations/20201219204740_init.cs b/PlixP/Migrations/20201219204740_init.cs new file mode 100644 index 0000000..561c4c3 --- /dev/null +++ b/PlixP/Migrations/20201219204740_init.cs @@ -0,0 +1,150 @@ +using System; +using Microsoft.EntityFrameworkCore.Migrations; + +namespace PlixP.Migrations +{ + public partial class init : Migration + { + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.CreateTable( + name: "Categories", + columns: table => new + { + Id = table.Column(type: "INTEGER", nullable: false) + .Annotation("Sqlite:Autoincrement", true), + Name = table.Column(type: "TEXT", nullable: true), + IsRemoved = table.Column(type: "INTEGER", nullable: false), + CreationDate = table.Column(type: "TEXT", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_Categories", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "Movies", + columns: table => new + { + Id = table.Column(type: "INTEGER", nullable: false) + .Annotation("Sqlite:Autoincrement", true), + FileName = table.Column(type: "TEXT", nullable: true), + Location = table.Column(type: "TEXT", nullable: true), + Quality = table.Column(type: "TEXT", nullable: true), + Title = table.Column(type: "TEXT", nullable: true), + Year = table.Column(type: "TEXT", nullable: true), + Rated = table.Column(type: "TEXT", nullable: true), + Released = table.Column(type: "TEXT", nullable: true), + Runtime = table.Column(type: "TEXT", nullable: true), + Genre = table.Column(type: "TEXT", nullable: true), + Director = table.Column(type: "TEXT", nullable: true), + Writer = table.Column(type: "TEXT", nullable: true), + Actors = table.Column(type: "TEXT", nullable: true), + Plot = table.Column(type: "TEXT", nullable: true), + Language = table.Column(type: "TEXT", nullable: true), + Country = table.Column(type: "TEXT", nullable: true), + Awards = table.Column(type: "TEXT", nullable: true), + Poster = table.Column(type: "TEXT", nullable: true), + Metascore = table.Column(type: "TEXT", nullable: true), + imdbRating = table.Column(type: "TEXT", nullable: true), + imdbVotes = table.Column(type: "TEXT", nullable: true), + imdbID = table.Column(type: "TEXT", nullable: true), + Type = table.Column(type: "TEXT", nullable: true), + DVD = table.Column(type: "TEXT", nullable: true), + BoxOffice = table.Column(type: "TEXT", nullable: true), + Production = table.Column(type: "TEXT", nullable: true), + Website = table.Column(type: "TEXT", nullable: true), + Response = table.Column(type: "TEXT", nullable: true), + IsSeen = table.Column(type: "INTEGER", nullable: false), + SyncStatus = table.Column(type: "INTEGER", nullable: false), + IsRemoved = table.Column(type: "INTEGER", nullable: false), + CreationDate = table.Column(type: "TEXT", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_Movies", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "CategoryMovies", + columns: table => new + { + Id = table.Column(type: "INTEGER", nullable: false) + .Annotation("Sqlite:Autoincrement", true), + CategoryId = table.Column(type: "INTEGER", nullable: false), + MovieId = table.Column(type: "INTEGER", nullable: false), + IsRemoved = table.Column(type: "INTEGER", nullable: false), + CreationDate = table.Column(type: "TEXT", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_CategoryMovies", x => x.Id); + table.ForeignKey( + name: "FK_CategoryMovies_Categories_CategoryId", + column: x => x.CategoryId, + principalTable: "Categories", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_CategoryMovies_Movies_MovieId", + column: x => x.MovieId, + principalTable: "Movies", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "Ratings", + columns: table => new + { + Id = table.Column(type: "INTEGER", nullable: false) + .Annotation("Sqlite:Autoincrement", true), + Source = table.Column(type: "TEXT", nullable: true), + Value = table.Column(type: "TEXT", nullable: true), + MovieId = table.Column(type: "INTEGER", nullable: false), + IsRemoved = table.Column(type: "INTEGER", nullable: false), + CreationDate = table.Column(type: "TEXT", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_Ratings", x => x.Id); + table.ForeignKey( + name: "FK_Ratings_Movies_MovieId", + column: x => x.MovieId, + principalTable: "Movies", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateIndex( + name: "IX_CategoryMovies_CategoryId", + table: "CategoryMovies", + column: "CategoryId"); + + migrationBuilder.CreateIndex( + name: "IX_CategoryMovies_MovieId", + table: "CategoryMovies", + column: "MovieId"); + + migrationBuilder.CreateIndex( + name: "IX_Ratings_MovieId", + table: "Ratings", + column: "MovieId"); + } + + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropTable( + name: "CategoryMovies"); + + migrationBuilder.DropTable( + name: "Ratings"); + + migrationBuilder.DropTable( + name: "Categories"); + + migrationBuilder.DropTable( + name: "Movies"); + } + } +} diff --git a/PlixP/Migrations/PlixContextModelSnapshot.cs b/PlixP/Migrations/PlixContextModelSnapshot.cs new file mode 100644 index 0000000..dda0711 --- /dev/null +++ b/PlixP/Migrations/PlixContextModelSnapshot.cs @@ -0,0 +1,242 @@ +// +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using PlixP.Models; + +namespace PlixP.Migrations +{ + [DbContext(typeof(PlixContext))] + partial class PlixContextModelSnapshot : ModelSnapshot + { + protected override void BuildModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "5.0.1"); + + modelBuilder.Entity("PlixP.Models.Category", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("CreationDate") + .HasColumnType("TEXT"); + + b.Property("IsRemoved") + .HasColumnType("INTEGER"); + + b.Property("Name") + .HasColumnType("TEXT"); + + b.HasKey("Id"); + + b.ToTable("Categories"); + }); + + modelBuilder.Entity("PlixP.Models.CategoryMovie", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("CategoryId") + .HasColumnType("INTEGER"); + + b.Property("CreationDate") + .HasColumnType("TEXT"); + + b.Property("IsRemoved") + .HasColumnType("INTEGER"); + + b.Property("MovieId") + .HasColumnType("INTEGER"); + + b.HasKey("Id"); + + b.HasIndex("CategoryId"); + + b.HasIndex("MovieId"); + + b.ToTable("CategoryMovies"); + }); + + modelBuilder.Entity("PlixP.Models.Movie", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("Actors") + .HasColumnType("TEXT"); + + b.Property("Awards") + .HasColumnType("TEXT"); + + b.Property("BoxOffice") + .HasColumnType("TEXT"); + + b.Property("Country") + .HasColumnType("TEXT"); + + b.Property("CreationDate") + .HasColumnType("TEXT"); + + b.Property("DVD") + .HasColumnType("TEXT"); + + b.Property("Director") + .HasColumnType("TEXT"); + + b.Property("FileName") + .HasColumnType("TEXT"); + + b.Property("Genre") + .HasColumnType("TEXT"); + + b.Property("IsRemoved") + .HasColumnType("INTEGER"); + + b.Property("IsSeen") + .HasColumnType("INTEGER"); + + b.Property("Language") + .HasColumnType("TEXT"); + + b.Property("Location") + .HasColumnType("TEXT"); + + b.Property("Metascore") + .HasColumnType("TEXT"); + + b.Property("Plot") + .HasColumnType("TEXT"); + + b.Property("Poster") + .HasColumnType("TEXT"); + + b.Property("Production") + .HasColumnType("TEXT"); + + b.Property("Quality") + .HasColumnType("TEXT"); + + b.Property("Rated") + .HasColumnType("TEXT"); + + b.Property("Released") + .HasColumnType("TEXT"); + + b.Property("Response") + .HasColumnType("TEXT"); + + b.Property("Runtime") + .HasColumnType("TEXT"); + + b.Property("SyncStatus") + .HasColumnType("INTEGER"); + + b.Property("Title") + .HasColumnType("TEXT"); + + b.Property("Type") + .HasColumnType("TEXT"); + + b.Property("Website") + .HasColumnType("TEXT"); + + b.Property("Writer") + .HasColumnType("TEXT"); + + b.Property("Year") + .HasColumnType("TEXT"); + + b.Property("imdbID") + .HasColumnType("TEXT"); + + b.Property("imdbRating") + .HasColumnType("TEXT"); + + b.Property("imdbVotes") + .HasColumnType("TEXT"); + + b.HasKey("Id"); + + b.ToTable("Movies"); + }); + + modelBuilder.Entity("PlixP.Models.Rating", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("CreationDate") + .HasColumnType("TEXT"); + + b.Property("IsRemoved") + .HasColumnType("INTEGER"); + + b.Property("MovieId") + .HasColumnType("INTEGER"); + + b.Property("Source") + .HasColumnType("TEXT"); + + b.Property("Value") + .HasColumnType("TEXT"); + + b.HasKey("Id"); + + b.HasIndex("MovieId"); + + b.ToTable("Ratings"); + }); + + modelBuilder.Entity("PlixP.Models.CategoryMovie", b => + { + b.HasOne("PlixP.Models.Category", "Category") + .WithMany("Movies") + .HasForeignKey("CategoryId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("PlixP.Models.Movie", "Movie") + .WithMany("Category") + .HasForeignKey("MovieId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Category"); + + b.Navigation("Movie"); + }); + + modelBuilder.Entity("PlixP.Models.Rating", b => + { + b.HasOne("PlixP.Models.Movie", "Movie") + .WithMany("Ratings") + .HasForeignKey("MovieId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Movie"); + }); + + modelBuilder.Entity("PlixP.Models.Category", b => + { + b.Navigation("Movies"); + }); + + modelBuilder.Entity("PlixP.Models.Movie", b => + { + b.Navigation("Category"); + + b.Navigation("Ratings"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/PlixP/Models/BaseDto.cs b/PlixP/Models/BaseDto.cs new file mode 100644 index 0000000..16914ea --- /dev/null +++ b/PlixP/Models/BaseDto.cs @@ -0,0 +1,60 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using AutoMapper; + +namespace PlixP.Models +{ + /// + /// Base Dto Class initial map config between entity and dto + /// + /// Type of Dto Class + /// Type of Entity Class + public abstract class BaseDto : IMapperConf + where TDto : class, new() + where TEntity : new() + { + + public TEntity ToEntity() + { + return Mapper.Map(CastToDerivedClass(this)); + } + + public TEntity ToEntity(TEntity entity) + { + return Mapper.Map(CastToDerivedClass(this), entity); + } + + public static TDto FromEntity(TEntity model) + { + return Mapper.Map(model); + } + + protected TDto CastToDerivedClass(BaseDto baseInstance) + { + return Mapper.Map(baseInstance); + } + + public virtual void MapperConfig(Profile profile) + { + var mappingExpression = profile.CreateMap(); + + var dtoType = typeof(TDto); + var entityType = typeof(TEntity); + //Ignore any property of source (like Post.Author) that dose not contains in destination + foreach (var property in entityType.GetProperties()) + { + if (dtoType.GetProperty(property.Name) == null) + mappingExpression.ForMember(property.Name, opt => opt.Ignore()); + } + + CustomMappings(mappingExpression.ReverseMap()); + } + + public virtual void CustomMappings(IMappingExpression mapping) + { + } + } +} diff --git a/PlixP/Models/Category.cs b/PlixP/Models/Category.cs new file mode 100644 index 0000000..8816f0b --- /dev/null +++ b/PlixP/Models/Category.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace PlixP.Models +{ + [Serializable] + public class Category : Entity + { + public string Name { get; set; } + public virtual ICollection Movies { get; set; } + } +} diff --git a/PlixP/Models/CategoryMovie.cs b/PlixP/Models/CategoryMovie.cs new file mode 100644 index 0000000..0578b7a --- /dev/null +++ b/PlixP/Models/CategoryMovie.cs @@ -0,0 +1,21 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations.Schema; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace PlixP.Models +{ + [Serializable] + public class CategoryMovie : Entity + { + public int CategoryId { get; set; } + public int MovieId { get; set; } + public Category Category { get; set; } + public Movie Movie { get; set; } + [NotMapped] + public bool IsEditable { get; set; } = false; + + } +} diff --git a/PlixP/Models/CustomMappingProfile.cs b/PlixP/Models/CustomMappingProfile.cs new file mode 100644 index 0000000..903fafe --- /dev/null +++ b/PlixP/Models/CustomMappingProfile.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using AutoMapper; + +namespace PlixP.Models +{ + public class CustomMappingProfile : Profile + { + public CustomMappingProfile(IEnumerable mapperConfs) + { + foreach (var mapperConf in mapperConfs) + mapperConf.MapperConfig(this); + } + } +} diff --git a/PlixP/Models/Entity.cs b/PlixP/Models/Entity.cs new file mode 100644 index 0000000..9ecb0cd --- /dev/null +++ b/PlixP/Models/Entity.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace PlixP.Models +{ + [Serializable] + public class Entity + { + [Key] + public int Id { get; set; } + public bool IsRemoved { get; set; } + public DateTime CreationDate { get; set; } + } +} diff --git a/PlixP/Models/IMapperConf.cs b/PlixP/Models/IMapperConf.cs new file mode 100644 index 0000000..36664e8 --- /dev/null +++ b/PlixP/Models/IMapperConf.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using AutoMapper; + +namespace PlixP.Models +{ + public interface IMapperConf + { + void MapperConfig(Profile profile); + } +} diff --git a/PlixP/Models/Movie.cs b/PlixP/Models/Movie.cs new file mode 100644 index 0000000..6b3a6c2 --- /dev/null +++ b/PlixP/Models/Movie.cs @@ -0,0 +1,122 @@ +using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.ComponentModel.DataAnnotations.Schema; +using System.Drawing; +using System.IO; +using System.Linq; +using System.Runtime.Serialization; +using System.Runtime.Serialization.Formatters.Binary; +using System.Text; +using System.Threading.Tasks; + +namespace PlixP.Models +{ + public enum SyncStatus + { + Synced, + NotSynced + } + [Serializable] + public class Movie : Entity, ICloneable + { + public string FullName + { + get + { + if (Location != null && FileName != null) + return Path.Combine(Location, FileName); + else + return null; + + } + } + public string FileName { get; set; } + public string Location { get; set; } + public string Quality { get; set; } + public string Title { get; set; } + public string Year { get; set; } + + public int IntYear + { + get + { + int year; + if (string.IsNullOrEmpty(Year)) + return 0; + if (int.TryParse(Year, out year)) + return year; + else + return 0; + } + } + + public string Rated { get; set; } + public string Released { get; set; } + public string Runtime { get; set; } + public string Genre { get; set; } + public string Director { get; set; } + public string Writer { get; set; } + public string Actors { get; set; } + public string Plot { get; set; } + public string Language { get; set; } + public string Country { get; set; } + public string Awards { get; set; } + public string Poster { get; set; } + public string Metascore { get; set; } + public string imdbRating { get; set; } + public string imdbVotes { get; set; } + public string imdbID { get; set; } + public string Type { get; set; } + public string DVD { get; set; } + public string BoxOffice { get; set; } + public string Production { get; set; } + public string Website { get; set; } + public string Response { get; set; } + + [NotMapped] + public bool IsDubbed + { + get + { + if (FullName != null && FullName.ToLower().Contains("dubbed")) + return true; + else + return false; + } + } + + public bool IsSeen { get; set; } + + [NotMapped] + public Color SeenStatusColor + { + get + { + if (IsSeen) + return Color.LimeGreen; + else + return Color.OrangeRed; + } + } + + public SyncStatus SyncStatus { get; set; } + public List Ratings { get; set; } + public ObservableCollection Category { get; set; } + [NotMapped] + public List CategoryNames { get; set; } + + public object Clone() + { + using (MemoryStream ms = new MemoryStream()) + { + BinaryFormatter formatter = new BinaryFormatter(); + formatter.Context = new StreamingContext(StreamingContextStates.Clone); + formatter.Serialize(ms, this); + ms.Position = 0; + return formatter.Deserialize(ms); + } + } + + } +} diff --git a/PlixP/Models/MovieDto.cs b/PlixP/Models/MovieDto.cs new file mode 100644 index 0000000..8dedbcd --- /dev/null +++ b/PlixP/Models/MovieDto.cs @@ -0,0 +1,78 @@ +using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.ComponentModel.DataAnnotations.Schema; +using System.Drawing; +using System.IO; +using System.Linq; +using System.Runtime.Serialization; +using System.Runtime.Serialization.Formatters.Binary; +using System.Text; +using System.Threading.Tasks; +using AutoMapper; + +namespace PlixP.Models +{ + public class MovieDto : BaseDto + { + public int Id { get; set; } + public bool IsRemoved { get; set; } + public DateTime CreationDate { get; set; } + public string FullName + { + get; + set; + } + public string FileName { get; set; } + public string Location { get; set; } + public string Quality { get; set; } + public string Title { get; set; } + public string Year { get; set; } + public string Rated { get; set; } + public string Released { get; set; } + public string Runtime { get; set; } + public string Genre { get; set; } + public string Director { get; set; } + public string Writer { get; set; } + public string Actors { get; set; } + public string Plot { get; set; } + public string Language { get; set; } + public string Country { get; set; } + public string Awards { get; set; } + public string Poster { get; set; } + public string Metascore { get; set; } + public string imdbRating { get; set; } + public string imdbVotes { get; set; } + public string imdbID { get; set; } + public string Type { get; set; } + public string DVD { get; set; } + public string BoxOffice { get; set; } + public string Production { get; set; } + public string Website { get; set; } + public string Response { get; set; } + public bool IsDubbed + { + get; + set; + } + + public bool IsSeen { get; set; } + + public Color SeenStatusColor + { + get; + set; + } + + public SyncStatus SyncStatus { get; set; } + public List Ratings { get; set; } + public ObservableCollection Category { get; set; } + public List CategoryNames { get; set; } + public override void CustomMappings(IMappingExpression mapping) + { + base.CustomMappings(mapping); + mapping.ForMember(m => m.CategoryNames + , org => org.MapFrom(m => m.Category.Select(c => c.Category.Name).ToList())); + } + } +} diff --git a/PlixP/Models/MovieListModel.cs b/PlixP/Models/MovieListModel.cs new file mode 100644 index 0000000..711c9ad --- /dev/null +++ b/PlixP/Models/MovieListModel.cs @@ -0,0 +1,39 @@ +using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.ComponentModel; +using System.Linq; +using System.Runtime.CompilerServices; +using System.Text; +using System.Threading.Tasks; + +namespace PlixP.Models +{ + public class MovieListModel : INotifyPropertyChanged + { + public ObservableCollection OriginalMovies { get; set; } = new ObservableCollection(); + public ObservableCollection OriginalCategories { get; set; } = new ObservableCollection(); + public Dictionary OriginalGenres { get; set; } = new Dictionary(); + + public List Genres + { + get + { + return OriginalGenres.Select(g => string.Format("{0} | {1}", g.Key, g.Value.ToString())).ToList(); + } + } + + public ObservableCollection UnPagedMovies { get; set; } = new ObservableCollection(); + public ObservableCollection PageMovies { get; set; } = new ObservableCollection(); + + public int MoviesCount { get; set; } + public bool AllChecked { get; set; } + + public event PropertyChangedEventHandler PropertyChanged; + + protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null) + { + PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); + } + } +} diff --git a/PlixP/Models/PlixContext.cs b/PlixP/Models/PlixContext.cs new file mode 100644 index 0000000..8dbe986 --- /dev/null +++ b/PlixP/Models/PlixContext.cs @@ -0,0 +1,19 @@ +using Microsoft.EntityFrameworkCore; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace PlixP.Models +{ + public class PlixContext : DbContext + { + protected override void OnConfiguring(DbContextOptionsBuilder options) + => options.UseSqlite("Data Source=plix.db"); + public DbSet Movies { get; set; } + public DbSet Ratings { get; set; } + public DbSet Categories { get; set; } + public DbSet CategoryMovies { get; set; } + } +} diff --git a/PlixP/Models/Rating.cs b/PlixP/Models/Rating.cs new file mode 100644 index 0000000..3834978 --- /dev/null +++ b/PlixP/Models/Rating.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace PlixP.Models +{ + [Serializable] + public class Rating : Entity + { + public string Source { get; set; } + public string Value { get; set; } + public int MovieId { get; set; } + public Movie Movie { get; set; } + } +} diff --git a/PlixP/PlixLogo.ico b/PlixP/PlixLogo.ico new file mode 100644 index 0000000000000000000000000000000000000000..4ffdaf5f9892781c00e88260dc77c068c27e241c GIT binary patch literal 125300 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 + + WinExe + net5.0-windows + true + PlixP + PlixLogo.ico + + + + + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/PlixP/Renders/ImageCacher.cs b/PlixP/Renders/ImageCacher.cs new file mode 100644 index 0000000..14241c9 --- /dev/null +++ b/PlixP/Renders/ImageCacher.cs @@ -0,0 +1,91 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Net; +using System.Text; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Media; +using System.Windows.Media.Imaging; + +namespace PlixP.Renders +{ + public class ImageCacher : Image + { + private string BaseRepos = string.Format("{0}\\PlixMovieCacheFolder\\", Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)); + private List FileInfos; + private bool Sourced = false; + + + public static readonly DependencyProperty ImageSourceProperty = + DependencyProperty.Register(nameof(ImageSource), typeof(string), typeof(ImageCacher), + new PropertyMetadata("", new PropertyChangedCallback(OnSetTextChanged))); + + private static void OnSetTextChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) + { + var imageC = d as ImageCacher; + var source = e.NewValue as string; + if (source != null) + { + var name = source.ToString().Split('/').Last(); + var image = imageC.FileInfos.FirstOrDefault(f => f.Name == name); + if (image != null) + { + imageC.Sourced = true; + var src = new BitmapImage(); + src.BeginInit(); + src.UriSource = new Uri(Path.Combine(image.DirectoryName, image.Name), UriKind.Absolute); + src.CacheOption = BitmapCacheOption.OnLoad; + src.EndInit(); + imageC.Source = src; + } + else + { + try + { + App.Current.Dispatcher.Invoke(() => + { + using (WebClient webClient = new WebClient()) + { + if (source != "N/A") + { + byte[] data = webClient.DownloadData(source.ToString()); + File.WriteAllBytes(Path.Combine(imageC.BaseRepos, name), data); + imageC.Source = new BitmapImage(new Uri(Path.Combine(imageC.BaseRepos, name))); + imageC.Sourced = true; + } + } + }); + } + catch (Exception exception) + { + MessageBox.Show(exception.Message); + } + } + + + } + } + + + public string ImageSource + { + get { return (string)GetValue(ImageSourceProperty); } + set { SetValue(ImageSourceProperty, value); } + } + + public ImageCacher() + { + var directoryInfo = new DirectoryInfo(BaseRepos); + if (!Directory.Exists(BaseRepos)) + { + Directory.CreateDirectory(BaseRepos); + } + FileInfos = directoryInfo.GetFiles().ToList(); + if (FileInfos == null) + FileInfos = new List(); + } + } +} diff --git a/PlixP/Repositories/BaseRepository.cs b/PlixP/Repositories/BaseRepository.cs new file mode 100644 index 0000000..587f32a --- /dev/null +++ b/PlixP/Repositories/BaseRepository.cs @@ -0,0 +1,220 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Linq.Expressions; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using Microsoft.EntityFrameworkCore; +using PlixP.Extentions; +using PlixP.Models; +using PlixP.Repositories.Contracts; + +namespace PlixP.Repositories +{ + public class BaseRepository : IBaseRepository + where T : Entity + { + protected readonly PlixContext DbContext; + public DbSet Entities { get; } + public virtual IQueryable Table => Entities.Where(e => e.IsRemoved == false); + public virtual IQueryable TableNoTracking => Entities.AsNoTracking().Where(e => e.IsRemoved == false); + + public BaseRepository(PlixContext dbContext) + { + DbContext = dbContext; + Entities = DbContext.Set(); // City => Cities + } + + #region Async Method + public virtual async Task GetByIdAsync(CancellationToken cancellationToken, params object[] ids) + { + + var entity = await Entities.FindAsync(ids, cancellationToken); + DbContext.Entry(entity).State = EntityState.Detached; + return entity; + + } + + public virtual async Task AddAsync(T entity, CancellationToken cancellationToken, bool saveNow = true) + { + Assert.NotNull(entity, nameof(entity)); + entity.CreationDate = DateTime.Now; + await Entities.AddAsync(entity, cancellationToken).ConfigureAwait(false); + if (saveNow) + await DbContext.SaveChangesAsync(cancellationToken).ConfigureAwait(false); + } + + public virtual async Task AddRangeAsync(IEnumerable entities, CancellationToken cancellationToken, bool saveNow = true) + { + Assert.NotNull(entities, nameof(entities)); + await Entities.AddRangeAsync(entities, cancellationToken).ConfigureAwait(false); + if (saveNow) + await DbContext.SaveChangesAsync(cancellationToken).ConfigureAwait(false); + } + + public virtual async Task UpdateAsync(T entity, CancellationToken cancellationToken, bool saveNow = true) + { + Assert.NotNull(entity, nameof(entity)); + DbContext.Entry(entity).State = EntityState.Detached; + await DbContext.SaveChangesAsync(cancellationToken); + //DbContext.Entry(entity).State = EntityState.Modified; + DbContext.Update(entity); + //DbContext.Entry(entity).CurrentValues.SetValues(entity); + if (saveNow) + await DbContext.SaveChangesAsync(cancellationToken); + } + + public virtual async Task UpdateRangeAsync(IEnumerable entities, CancellationToken cancellationToken, bool saveNow = true) + { + Assert.NotNull(entities, nameof(entities)); + Entities.UpdateRange(entities); + if (saveNow) + await DbContext.SaveChangesAsync(cancellationToken); + } + + public virtual async Task DeleteAsync(T entity, CancellationToken cancellationToken, bool saveNow = true) + { + Assert.NotNull(entity, nameof(entity)); + entity.IsRemoved = true; + Entities.Update(entity); + if (saveNow) + await DbContext.SaveChangesAsync(cancellationToken); + } + + public async Task HardDeleteAsync(T entity, CancellationToken cancellationToken, bool saveNow = true) + { + Assert.NotNull(entity, nameof(entity)); + Entities.Remove(entity); + if (saveNow) + await DbContext.SaveChangesAsync(cancellationToken); + } + + public virtual async Task DeleteRangeAsync(IEnumerable entities, CancellationToken cancellationToken, bool saveNow = true) + { + Assert.NotNull(entities, nameof(entities)); + foreach (var apiEntity in entities) + { + apiEntity.IsRemoved = true; + Entities.Update(apiEntity); + } + if (saveNow) + await DbContext.SaveChangesAsync(cancellationToken); + } + #endregion + + #region Sync Methods + public virtual T GetById(params object[] ids) + { + var ent = Entities.Find(ids); + Detach(ent); + return ent; + } + + public virtual void Add(T entity, bool saveNow = true) + { + Assert.NotNull(entity, nameof(entity)); + Entities.Add(entity); + if (saveNow) + DbContext.SaveChanges(); + } + + public virtual void AddRange(IEnumerable entities, bool saveNow = true) + { + Assert.NotNull(entities, nameof(entities)); + Entities.AddRange(entities); + if (saveNow) + DbContext.SaveChanges(); + } + + public virtual void Update(T entity, bool saveNow = true) + { + Assert.NotNull(entity, nameof(entity)); + Detach(entity); + Entities.Update(entity); + DbContext.SaveChanges(); + } + + public virtual void UpdateRange(IEnumerable entities, bool saveNow = true) + { + Assert.NotNull(entities, nameof(entities)); + Entities.UpdateRange(entities); + if (saveNow) + DbContext.SaveChanges(); + } + + public virtual void Delete(T entity, bool saveNow = true) + { + Assert.NotNull(entity, nameof(entity)); + Entities.Remove(entity); + if (saveNow) + DbContext.SaveChanges(); + } + + public virtual void DeleteRange(IEnumerable entities, bool saveNow = true) + { + Assert.NotNull(entities, nameof(entities)); + Entities.RemoveRange(entities); + if (saveNow) + DbContext.SaveChanges(); + } + #endregion + + #region Attach & Detach + public virtual void Detach(T entity) + { + Assert.NotNull(entity, nameof(entity)); + var entry = DbContext.Entry(entity); + if (entry != null) + entry.State = EntityState.Detached; + } + + public virtual void Attach(T entity) + { + Assert.NotNull(entity, nameof(entity)); + if (DbContext.Entry(entity).State == EntityState.Detached) + Entities.Attach(entity); + } + #endregion + + #region Explicit Loading + public virtual async Task LoadCollectionAsync(T entity, Expression>> collectionProperty, CancellationToken cancellationToken) + where TProperty : class + { + Attach(entity); + + var collection = DbContext.Entry(entity).Collection(collectionProperty); + if (!collection.IsLoaded) + await collection.LoadAsync(cancellationToken).ConfigureAwait(false); + } + + public virtual void LoadCollection(T entity, Expression>> collectionProperty) + where TProperty : class + { + Attach(entity); + var collection = DbContext.Entry(entity).Collection(collectionProperty); + if (!collection.IsLoaded) + collection.Load(); + } + + public virtual async Task LoadReferenceAsync(T entity, Expression> referenceProperty, CancellationToken cancellationToken) + where TProperty : class + { + Attach(entity); + var reference = DbContext.Entry(entity).Reference(referenceProperty); + if (!reference.IsLoaded) + await reference.LoadAsync(cancellationToken).ConfigureAwait(false); + } + + public virtual void LoadReference(T entity, Expression> referenceProperty) + where TProperty : class + { + Attach(entity); + var reference = DbContext.Entry(entity).Reference(referenceProperty); + if (!reference.IsLoaded) + reference.Load(); + } + #endregion + + } +} diff --git a/PlixP/Repositories/Contracts/IBaseRepository.cs b/PlixP/Repositories/Contracts/IBaseRepository.cs new file mode 100644 index 0000000..5d0891f --- /dev/null +++ b/PlixP/Repositories/Contracts/IBaseRepository.cs @@ -0,0 +1,41 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Linq.Expressions; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using Microsoft.EntityFrameworkCore; +using PlixP.Models; + +namespace PlixP.Repositories.Contracts +{ + public interface IBaseRepository where T : Entity + { + DbSet Entities { get; } + IQueryable Table { get; } + IQueryable TableNoTracking { get; } + + void Add(T entity, bool saveNow = true); + Task AddAsync(T entity, CancellationToken cancellationToken, bool saveNow = true); + void AddRange(IEnumerable entities, bool saveNow = true); + Task AddRangeAsync(IEnumerable entities, CancellationToken cancellationToken, bool saveNow = true); + void Attach(T entity); + void Delete(T entity, bool saveNow = true); + Task DeleteAsync(T entity, CancellationToken cancellationToken, bool saveNow = true); + Task HardDeleteAsync(T entity, CancellationToken cancellationToken, bool saveNow = true); + void DeleteRange(IEnumerable entities, bool saveNow = true); + Task DeleteRangeAsync(IEnumerable entities, CancellationToken cancellationToken, bool saveNow = true); + void Detach(T entity); + T GetById(params object[] ids); + Task GetByIdAsync(CancellationToken cancellationToken, params object[] ids); + void LoadCollection(T entity, Expression>> collectionProperty) where TProperty : class; + Task LoadCollectionAsync(T entity, Expression>> collectionProperty, CancellationToken cancellationToken) where TProperty : class; + void LoadReference(T entity, Expression> referenceProperty) where TProperty : class; + Task LoadReferenceAsync(T entity, Expression> referenceProperty, CancellationToken cancellationToken) where TProperty : class; + void Update(T entity, bool saveNow = true); + Task UpdateAsync(T entity, CancellationToken cancellationToken, bool saveNow = true); + void UpdateRange(IEnumerable entities, bool saveNow = true); + Task UpdateRangeAsync(IEnumerable entities, CancellationToken cancellationToken, bool saveNow = true); + } +} diff --git a/PlixP/Repositories/Contracts/IRepositoryWrapper.cs b/PlixP/Repositories/Contracts/IRepositoryWrapper.cs new file mode 100644 index 0000000..4636c28 --- /dev/null +++ b/PlixP/Repositories/Contracts/IRepositoryWrapper.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using PlixP.Models; + +namespace PlixP.Repositories.Contracts +{ + public interface IRepositoryWrapper + { + IBaseRepository SetRepository() where T : Entity; + } +} diff --git a/PlixP/Repositories/RepositoryWrapper.cs b/PlixP/Repositories/RepositoryWrapper.cs new file mode 100644 index 0000000..ed5555c --- /dev/null +++ b/PlixP/Repositories/RepositoryWrapper.cs @@ -0,0 +1,24 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using PlixP.Models; +using PlixP.Repositories.Contracts; + +namespace PlixP.Repositories +{ + public class RepositoryWrapper : IRepositoryWrapper + { + private readonly PlixContext _context; + public RepositoryWrapper(PlixContext context) + { + _context = context; + } + public IBaseRepository SetRepository() where T : Entity + { + IBaseRepository repository = new BaseRepository(_context); + return repository; + } + } +} diff --git a/PlixP/Resources/PlixLogo.ico b/PlixP/Resources/PlixLogo.ico new file mode 100644 index 0000000000000000000000000000000000000000..4ffdaf5f9892781c00e88260dc77c068c27e241c GIT binary patch literal 125300 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

!(SVx~cTr%lR|gw$~ab7!KV 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ø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 key = null) + { + if (string.IsNullOrEmpty(key)) + key = typeof(T).Name; + var json = CrossSettings.Current.GetValueOrDefault(key, string.Empty); + if (string.IsNullOrEmpty(json)) + return Activator.CreateInstance(); + return JsonConvert.DeserializeObject(json); + + } + + public void Delete(string key = null) + { + if (string.IsNullOrEmpty(key)) + key = typeof(T).Name; + CrossSettings.Current.Remove(key); + } + } +} diff --git a/PlixP/Services/Contracts/IServiceWrapper.cs b/PlixP/Services/Contracts/IServiceWrapper.cs new file mode 100644 index 0000000..c155ee2 --- /dev/null +++ b/PlixP/Services/Contracts/IServiceWrapper.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace PlixP.Services.Contracts +{ + public interface IServiceWrapper + { + LocalServices LocalServices { get; } + MovieServices MovieServices { get; } + CatcherService CatcherService { get; } + } +} diff --git a/PlixP/Services/LocalServices.cs b/PlixP/Services/LocalServices.cs new file mode 100644 index 0000000..a43732f --- /dev/null +++ b/PlixP/Services/LocalServices.cs @@ -0,0 +1,216 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows; + +namespace PlixP.Services +{ + + public class LocalServices + { + private string[] extentions = { ".mp4", ".mkv", ".avi" }; + private List _baseDires = new List(); + private List paths = new List(); + public LocalServices() + { + + var pathsJson = Plugin.Settings.CrossSettings.Current.GetValueOrDefault("Paths", string.Empty); + paths = Newtonsoft.Json.JsonConvert.DeserializeObject>(pathsJson); + if (paths == null) + paths = new List(); + if (paths.Count > 0) + paths.ForEach(p => _baseDires.Add(new DirectoryInfo(p))); + } + + public void ResetFolder() + { + RenameAllFile(GetMovieFiles()); + CreateUnFolders(GetMovieFiles()); + RenameAllFolder(); + } + + public string GetFolderNameByMovieFileName(string movieN) + { + string movieName = string.Empty; + bool yeared = false; + bool qualited = false; + movieN = movieN.Replace('-', '.'); + movieN = movieN.Replace('_', '.'); + foreach (var str in movieN.Split('.')) + { + int year = 0; + if (int.TryParse(str, out year) && (year >= 1920 && year <= 2142)) + { + movieName += "(" + year + ")" + " "; + yeared = true; + } + else if (str.Contains("720") || str.Contains("1080") || str.ToLower().Contains("dvdsrc") || str.ToLower().Contains("hdrip") || str.ToLower().Contains("dvdrip")) + { + movieName += "[" + str + "]"; + qualited = true; + } + else if (!yeared && !qualited) + { + movieName += str + " "; + } + } + + return movieName; + } + private void RenameAllFolder() + { + try + { + if (paths.Count > 0) + { + foreach (var path in paths) + { + DirectoryInfo directoryInfo = new DirectoryInfo(path); + string baseDire = directoryInfo.Name; + var dires = GetDirectoryInfos(directoryInfo); + foreach (var dir in dires) + { + string movieN = string.Empty; + string movieName = string.Empty; + foreach (var fileInfo in dir.GetFiles()) + { + if (fileInfo.Name.Contains(extentions[0]) || fileInfo.Name.Contains(extentions[1]) || fileInfo.Name.Contains(extentions[2])) + movieN = fileInfo.Name; + } + + if (!string.IsNullOrEmpty(movieN)) + { + movieName = GetFolderNameByMovieFileName(movieN); + DirectoryInfo di = new DirectoryInfo(string.Concat(dir.Parent, "\\", movieName)); + if (!di.Exists) + Directory.Move(dir.FullName, string.Concat(dir.Parent, "\\", movieName)); + } + + } + } + } + } + catch (Exception e) + { + MessageBox.Show(e.Message); + } + } + public List GetMovieFiles() + { + if (paths.Count > 0) + { + var allFiles = new List(); + foreach (var path in paths) + { + DirectoryInfo dir = new DirectoryInfo(path); + string baseDire = dir.Name; + var dires = GetDirectoryInfos(dir); + List files = new List(); + foreach (var directoryInfo in dires) + { + files.AddRange(directoryInfo.GetFiles()); + } + allFiles.AddRange(files); + } + return allFiles.Where(f => extentions.Contains(f.Extension)).ToList(); + } + else + return new List(); + } + public void RenameAllFile(List fileInfos) + { + fileInfos.ForEach(m => + { + string newName = ""; + foreach (var str in m.DirectoryName.Split("\\")) + { + newName += str + "\\"; + } + var name = m.Name.Replace('_', '.'); + name = name.Replace(' ', '.'); + newName += name; + File.Move(m.FullName, newName); + }); + } + public void CreateUnFolders(List movies) + { + foreach (var baseDire in _baseDires) + { + + movies.Where(m => m.DirectoryName.Split('\\').Last() == baseDire.Name).ToList().ForEach(m => + { + try + { + string movieName = ""; + bool yeared = false; + bool qualited = false; + foreach (var str in m.Name.Split('.')) + { + int year = 0; + if (int.TryParse(str, out year) && (year >= 1920 && year <= 2142)) + { + movieName += "(" + year + ")" + " "; + yeared = true; + } + else if (str.Contains("720") || str.Contains("1080") || str.ToLower().Contains("dvdsrc") || str.ToLower().Contains("hdrip") || str.ToLower().Contains("dvdrip")) + { + movieName += "[" + str + "]"; + qualited = true; + } + else if (!yeared && !qualited && !extentions.Contains(str)) + { + movieName += str + " "; + + } + } + + var newDire = Path.Combine(m.DirectoryName, movieName).Trim(); + Directory.CreateDirectory(newDire); + var orgFile = m.FullName; + var desFile = Path.Combine(newDire, m.Name); + File.Move(orgFile, desFile); + + } + catch (Exception e) + { + Console.WriteLine(e); + MessageBox.Show(e.Message); + } + }); + } + } + public List GetDirectoryInfos(DirectoryInfo baseDirectoryInfo) + { + try + { + List directoryInfos = new List(); + var dires = baseDirectoryInfo.GetDirectories(); + if (dires.Length > 0) + { + foreach (var directory in dires) + { + directoryInfos.AddRange(GetDirectoryInfos(directory)); + } + } + directoryInfos.Add(baseDirectoryInfo); + return directoryInfos; + } + catch (Exception e) + { + Console.WriteLine(e); + return new List(); + } + } + public void RenameFile(FileInfo oldFile, FileInfo newFile) + { + File.Move(oldFile.FullName, newFile.FullName); + } + public void RenameDirection(DirectoryInfo oldDirectory, DirectoryInfo newDirectory) + { + Directory.Move(oldDirectory.FullName, newDirectory.FullName); + } + } +} diff --git a/PlixP/Services/MovieServices.cs b/PlixP/Services/MovieServices.cs new file mode 100644 index 0000000..68a268b --- /dev/null +++ b/PlixP/Services/MovieServices.cs @@ -0,0 +1,389 @@ +using RestSharp; +using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.IO; +using System.Linq; +using System.Net; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using System.Windows; +using AutoMapper.QueryableExtensions; +using HandyControl.Controls; +using MaterialDesignThemes.Wpf; +using Microsoft.EntityFrameworkCore; +using PlixP.Models; +using PlixP.Repositories; +using PlixP.ViewModels; +using PlixP.Views.Dialogs; +using MessageBox = HandyControl.Controls.MessageBox; +using Timer = System.Timers.Timer; + +namespace PlixP.Services +{ + public class MovieServiceRealTime + { + private static MovieServiceRealTime _instance; + public static MovieServiceRealTime Instance + { + get + { + if (_instance == null) + _instance = new MovieServiceRealTime(); + return _instance; + } + } + + private LocalServices _localServices; + private MovieServices _movieServices; + private bool IsWorking = false; + private List _currentFiles = new List(); + private Timer timer; + public List CurreMovies + { + get { return _movieServices.GetMovies().Result; } + } + + public MovieServiceRealTime() + { + timer = new Timer(6000); + _localServices = new LocalServices(); + _movieServices = new MovieServices(); + timer.Elapsed += Timer_Elapsed; + } + + public void StartReal() => timer.Start(); + + private void Timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e) + { + CheckAll(); + } + + private async Task CheckAll() + { + try + { + if (IsWorking) + return; + IsWorking = true; + _localServices.ResetFolder(); + var movieFolders = _localServices.GetMovieFiles(); + foreach (var f in movieFolders) + { + if (!CurreMovies.Any(m => m.Location == f.DirectoryName)) + { + await _movieServices.AddNewMovieToDb(f); + Application.Current.Dispatcher.Invoke(() => + { + Growl.SuccessGlobal("Movie Added : " + f.Name); + }); + } + } + + foreach (var m in CurreMovies.Where(m => m.SyncStatus == SyncStatus.NotSynced)) + { + var creationDate = m.CreationDate; + var movie = await _movieServices.GetMovieAsync(m.Title); + if (movie != null) + { + movie.CreationDate = creationDate; + movie.Id = m.Id; + movie.Location = m.Location; + movie.FileName = m.FileName; + movie.SyncStatus = SyncStatus.Synced; + await _movieServices.EditMovie(movie, SyncStatus.Synced); + Application.Current.Dispatcher.Invoke(() => + { + Growl.WarningGlobal("Movie Synced : " + movie.FullName); + }); + } + } + + + + IsWorking = false; + } + catch (Exception e) + { + MessageBox.Show(e.Message); + } + } + } + public class MovieServices + { + private readonly RepositoryWrapper _repositoryWrapper; + private readonly LocalServices _localServices; + private readonly CatcherService _catcherService; + + public MovieServices() + { + _repositoryWrapper = new RepositoryWrapper(new PlixContext()); + _localServices = new LocalServices(); + _catcherService = new CatcherService(); + } + + + public async Task> GetMovies() + { + try + { + List Movies = new List(); + Movies = _catcherService.Get>(CatcherKeys.MovieList); + if (Movies != null) + if (Movies.Count != 0) + return Movies; + var dtos = _repositoryWrapper.SetRepository() + .TableNoTracking + .ProjectTo() + .ToList(); + dtos.ForEach(m => Movies.Add(m.ToEntity())); + foreach (var movie in Movies) + { + foreach (var categoryMovie in movie.Category) + { + categoryMovie.Category = await _repositoryWrapper.SetRepository() + .GetByIdAsync(CancellationToken.None, categoryMovie.CategoryId); + } + } + _catcherService.Set(Movies, CatcherKeys.MovieList); + return Movies; + } + catch (Exception e) + { + throw e; + } + } + + public async Task AddNewMovieToDb(FileInfo f) + { + var cMovie = new Movie(); + var mName = f.Directory.Name.Split("(")[0]; + cMovie = await GetMovieAsync(mName); + string q = " "; + if (f.Name.Contains("720")) + q = "720P"; + else if (f.Name.Contains("1080")) + q = "1080P"; + if (cMovie != null) + { + cMovie.FileName = f.Name; + cMovie.Location = f.DirectoryName; + cMovie.Quality = q; + cMovie.SyncStatus = SyncStatus.Synced; + cMovie.CreationDate = DateTime.Now; + await _repositoryWrapper.SetRepository().AddAsync(cMovie, CancellationToken.None); + await _repositoryWrapper.SetRepository().AddAsync(new CategoryMovie + { + MovieId = cMovie.Id, + CategoryId = 1 + }, CancellationToken.None); + + } + else + { + cMovie = new Movie(); + cMovie.Location = f.DirectoryName; + cMovie.FileName = f.Name; + cMovie.Quality = q; + cMovie.Title = mName; + cMovie.CreationDate = DateTime.Now; + cMovie.SyncStatus = SyncStatus.NotSynced; + + + await _repositoryWrapper.SetRepository().AddAsync(cMovie, CancellationToken.None); + await _repositoryWrapper.SetRepository().AddAsync(new CategoryMovie + { + MovieId = cMovie.Id, + CategoryId = 1 + }, CancellationToken.None); + } + _catcherService.Delete>(CatcherKeys.MovieList); + return cMovie; + } + public async Task GetMovieAsync(string movieName) + { + RestClient client = new RestClient(); + RestRequest request = new RestRequest("http://omdbapi.com", Method.GET); + request.AddQueryParameter("t", movieName); + request.AddQueryParameter("apikey", "a915dcc9"); + var res = await client.ExecuteGetAsync(request); + if (res.StatusCode == HttpStatusCode.OK) + { + if (res.Data.Response != "False") + return res.Data; + else + { + /*Application.Current.Dispatcher.Invoke(() => + { + Growl.ErrorGlobal($"Cant Sync Movie {movieName} , Please Edit Movie Detail"); + });*/ + return null; + } + } + else + { + /*Application.Current.Dispatcher.Invoke(() => + { + Growl.ErrorGlobal($"Cant Sync Movie {movieName} , Please Edit Movie Detail"); + });*/ + return null; + } + } + public async Task EditMovie(Movie newMovie, SyncStatus syncStatus = SyncStatus.NotSynced) + { + try + { + var oldMovie = await _repositoryWrapper.SetRepository() + .GetByIdAsync(CancellationToken.None, newMovie.Id); + string newMovieFileName = string.Empty; + + foreach (var str in newMovie.Title.Split(" ")) + { + if (string.IsNullOrWhiteSpace(str)) + continue; + newMovieFileName += str + "."; + } + if (!string.IsNullOrWhiteSpace(newMovie.Year)) + newMovieFileName += newMovie.Year + "."; + else + { + foreach (var str in oldMovie.FileName.Split(".")) + { + + int year = 0; + if (int.TryParse(str, out year) && (year >= 1920 && year <= 2142)) + { + newMovieFileName += year + "."; + } + } + } + if (!string.IsNullOrWhiteSpace(newMovie.Quality)) + newMovieFileName += newMovie.Quality + "."; + else + { + bool qulited = false; + foreach (var str in oldMovie.FileName.Split(".")) + { + if (str.Contains("720") || str.Contains("1080") || str.ToLower().Contains("dvdsrc") || str.ToLower().Contains("hdrip") || str.ToLower().Contains("dvdrip")) + { + newMovieFileName += str + "."; + newMovie.Quality = str; + qulited = true; + } + } + if (!qulited) + { + newMovieFileName += "720" + "."; + newMovie.Quality = "720"; + } + } + + newMovieFileName += oldMovie.FileName.Split(".").Last(); + newMovie.FileName = newMovieFileName; + newMovie.FileName = newMovie.FileName.Replace(":", ""); + newMovie.FileName = newMovie.FileName.Replace(@"\", ""); + newMovie.FileName = newMovie.FileName.Replace("?", ""); + newMovie.FileName = newMovie.FileName.Replace("*", ""); + newMovie.FileName = newMovie.FileName.Replace("/", ""); + newMovie.FileName = newMovie.FileName.Replace("<", ""); + newMovie.FileName = newMovie.FileName.Replace(">", ""); + newMovie.FileName = newMovie.FileName.Replace("|", ""); + + var folderName = _localServices.GetFolderNameByMovieFileName(newMovie.FileName); + var location = Path.Combine(newMovie.Location.Split("\\").Take(newMovie.Location.Split("\\").Length - 1) + .ToArray()); + newMovie.Location = $"{Path.Combine(location, folderName)}"; + newMovie.SyncStatus = syncStatus; + newMovie.Category = null; + await _repositoryWrapper.SetRepository().UpdateAsync(newMovie, CancellationToken.None); + if (oldMovie.Location != newMovie.Location) + _localServices.RenameDirection(new DirectoryInfo(oldMovie.Location), new DirectoryInfo(newMovie.Location)); + oldMovie.Location = Path.Combine(location, folderName); + _localServices.RenameFile(new FileInfo(oldMovie.FullName), new FileInfo(newMovie.FullName)); + _catcherService.Delete>(CatcherKeys.MovieList); + MessageBox.Show($"Movie {newMovie.Title} Was Edited !"); + } + catch (Exception e) + { + MessageBox.Show(e.Message); + } + } + public async Task> GetGenres() + { + List Movies = await GetMovies(); + var originalGenres = Movies.Select(m => m.Genre).ToList(); + Dictionary genres = new Dictionary(); + foreach (var originalGenre in originalGenres) + { + if (string.IsNullOrEmpty(originalGenre)) + continue; + var split = originalGenre.Split(','); + foreach (var str in split) + { + var trim = str.Trim(); + if (genres.ContainsKey(trim)) + genres[trim]++; + else + genres.Add(trim, 1); + } + + } + return genres; + } + public async Task> GetGenresModel() + { + List Movies = await GetMovies(); + var originalGenres = Movies.Select(m => m.Genre).ToList(); + List genres = new List(); + foreach (var originalGenre in originalGenres) + { + if (string.IsNullOrEmpty(originalGenre)) + continue; + var split = originalGenre.Split(','); + foreach (var str in split) + { + var trim = str.Trim(); + var genre = genres.FirstOrDefault(g=>g.Name==trim); + if (genre!=null) + genre.MovieCount++; + else + { + var item = new GenreItemModel + { + MovieCount = 1, + Name = trim + }; + foreach (var movie in Movies.Where(m=>m.Genre.Contains(trim))) + { + var poster = movie.Poster; + if (!genres.Any(g => g.Image == poster)) + item.Image = poster; + } + + if (item.Image == null) + item.Image = Movies.FirstOrDefault(m => m.Genre.Contains(trim))?.Poster; + genres = genres.OrderByDescending(g => g.MovieCount).ToList(); + genres.Add(item); + } + } + + + } + return genres; + } + public async Task> SelectByGenre(string genre) + { + return (await GetMovies()).Where(m => m.Genre.Contains(genre)) + .ToList(); + } + public async Task DeleteMovie(Movie movie) + { + movie.Category = null; + await _repositoryWrapper.SetRepository() + .DeleteAsync(movie, CancellationToken.None); + _catcherService.Delete>(CatcherKeys.MovieList); + MovieServiceRealTime.Instance.CurreMovies.RemoveAll(m => m.Id == movie.Id); + } + } +} diff --git a/PlixP/Services/ServiceWrapper.cs b/PlixP/Services/ServiceWrapper.cs new file mode 100644 index 0000000..36b291b --- /dev/null +++ b/PlixP/Services/ServiceWrapper.cs @@ -0,0 +1,48 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using PlixP.Services.Contracts; + +namespace PlixP.Services +{ + public class ServiceWrapper : IServiceWrapper + { + private LocalServices _localServices; + + public LocalServices LocalServices + { + get + { + if (_localServices == null) + _localServices = new LocalServices(); + return _localServices; + } + } + + private MovieServices _movieServices; + + public MovieServices MovieServices + { + get + { + if (_movieServices == null) + _movieServices = new MovieServices(); + return _movieServices; + } + } + + private CatcherService _catcherService; + + public CatcherService CatcherService + { + get + { + if (_catcherService == null) + _catcherService = new CatcherService(); + return _catcherService; + } + } + } +} diff --git a/PlixP/ViewModels/AddCategoryDialogViewModel.cs b/PlixP/ViewModels/AddCategoryDialogViewModel.cs new file mode 100644 index 0000000..c791c03 --- /dev/null +++ b/PlixP/ViewModels/AddCategoryDialogViewModel.cs @@ -0,0 +1,16 @@ +using Prism.Commands; +using Prism.Mvvm; +using System; +using System.Collections.Generic; +using System.Linq; + +namespace PlixP.ViewModels +{ + public class AddCategoryDialogViewModel : BindableBase + { + public AddCategoryDialogViewModel() + { + + } + } +} diff --git a/PlixP/ViewModels/GenresDialogViewModel.cs b/PlixP/ViewModels/GenresDialogViewModel.cs new file mode 100644 index 0000000..62bb55b --- /dev/null +++ b/PlixP/ViewModels/GenresDialogViewModel.cs @@ -0,0 +1,45 @@ +using Prism.Commands; +using Prism.Mvvm; +using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.Linq; +using System.Threading.Tasks; +using System.Windows.Input; +using PlixP.Repositories.Contracts; +using PlixP.Services.Contracts; + +namespace PlixP.ViewModels +{ + public class GenreItemModel + { + public string Name { get; set; } + public int Id { get; set; } + public string Image { get; set; } + public int MovieCount { get; set; } + } + public class GenresDialogViewModel : BindableBase + { + private readonly IServiceWrapper _serviceWrapper; + private readonly IRepositoryWrapper _repositoryWrapper; + public event EventHandler GenreSelected; + public ICommand GenreSelectCommand { get; set; } + public ObservableCollection Genres { get; set; } = new ObservableCollection(); + public GenresDialogViewModel(IServiceWrapper serviceWrapper,IRepositoryWrapper repositoryWrapper) + { + _serviceWrapper = serviceWrapper; + _repositoryWrapper = repositoryWrapper; + GenreSelectCommand = new DelegateCommand(model => + { + GenreSelected?.Invoke(model, model.Name); + }); + Initialize(); + } + + private async Task Initialize() + { + + (await _serviceWrapper.MovieServices.GetGenresModel()).ForEach(g=>Genres.Add(g)); + } + } +} diff --git a/PlixP/ViewModels/MainWindowViewModel.cs b/PlixP/ViewModels/MainWindowViewModel.cs new file mode 100644 index 0000000..e244b64 --- /dev/null +++ b/PlixP/ViewModels/MainWindowViewModel.cs @@ -0,0 +1,45 @@ +using System.Collections.ObjectModel; +using System.Threading.Tasks; +using PlixP.Services.Contracts; +using PlixP.Views; +using Prism.Mvvm; +using Prism.Regions; + +namespace PlixP.ViewModels +{ + public class MainWindowViewModel : BindableBase + { + private string _title = "Prism Application"; + public string Title + { + get { return _title; } + set { SetProperty(ref _title, value); } + } + + + private int _count; + public int Count + { + get { return _count; } + set { SetProperty(ref _count, value); } + } + + private string _background; + + public string Background + { + get { return _background; } + set { SetProperty(ref _background, value); } + } + + + public MainWindowViewModel(IServiceWrapper serviceWrapper , IRegionManager regionManager) + { + var bg = Plugin.Settings.CrossSettings.Current.GetValueOrDefault("Background", string.Empty); + if (string.IsNullOrEmpty(bg)) + Background = "https://www.jakpost.travel/wimages/large/166-1664172_lord-of-the-rings-background.jpg"; + else + Background = bg; + } + } +} diff --git a/PlixP/ViewModels/MasterDetailViewModel.cs b/PlixP/ViewModels/MasterDetailViewModel.cs new file mode 100644 index 0000000..bfa004d --- /dev/null +++ b/PlixP/ViewModels/MasterDetailViewModel.cs @@ -0,0 +1,107 @@ +using Prism.Commands; +using Prism.Mvvm; +using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.Diagnostics; +using System.Linq; +using System.Threading; +using System.Timers; +using System.Windows; +using MaterialDesignThemes.Wpf; +using Microsoft.EntityFrameworkCore; +using Microsoft.Win32; +using Microsoft.Xaml.Behaviors.Core; +using PlixP.Models; +using PlixP.Repositories.Contracts; +using PlixP.Services.Contracts; +using PlixP.Views; +using PlixP.Views.Dialogs; + +namespace PlixP.ViewModels +{ + public class MasterDetailViewModel : BindableBase + { + public ObservableCollection Paths { get; set; } = new ObservableCollection(); + public DelegateCommand PathCommand { get; set; } + public DelegateCommand AddCategoryCommand { get; set; } + public DelegateCommand ResetFolderCommand { get; set; } + public DelegateCommand ChangeBackGroundCommand { get; set; } + public DelegateCommand RemovePathCommand { get; set; } + public DelegateCommand ResetDbCommand { get; set; } + public MasterDetailViewModel(IRepositoryWrapper repositoryWrapper, IServiceWrapper serviceWrapper) + { + var pathsJson = Plugin.Settings.CrossSettings.Current.GetValueOrDefault("Paths", string.Empty); + if (!string.IsNullOrEmpty(pathsJson)) + { + var paths = Newtonsoft.Json.JsonConvert.DeserializeObject>(pathsJson); + if (paths != null) + paths.ForEach(p => Paths.Add(p)); + } + PathCommand = new DelegateCommand((str) => + { + if (!string.IsNullOrEmpty(str)) + { + Paths.Add(str); + var pathJson = Newtonsoft.Json.JsonConvert.SerializeObject(Paths.ToList()); + Plugin.Settings.CrossSettings.Current.AddOrUpdateValue("Paths", pathJson); + MessageBox.Show("Seccuss"); + //serviceWrapper.LocalServices.ResetFolder(); + } + }); + ResetDbCommand = new DelegateCommand(() => + { + QuestionDialog dialog = new QuestionDialog("ایا از ریست کردن دیتابیس مطمئن هستید ؟"); + dialog.Submited += (async (ss, ee) => + { + var context = new PlixContext(); + await context.Database.EnsureDeletedAsync(); + await context.Database.MigrateAsync(); + }); + DialogHost.OpenDialogCommand.Execute(dialog,null); + }); + RemovePathCommand = new DelegateCommand(str => + { + Paths.Remove(str); + var pathJson = Newtonsoft.Json.JsonConvert.SerializeObject(Paths.ToList()); + Plugin.Settings.CrossSettings.Current.AddOrUpdateValue("Paths", pathJson); + MessageBox.Show("Seccuss"); + }); + AddCategoryCommand = new DelegateCommand(async(cat) => + { + try + { + await repositoryWrapper.SetRepository().AddAsync(new Category + { + Name = cat + },CancellationToken.None); + MessageBox.Show("Seccuss"); + } + catch (Exception e) + { + MessageBox.Show(e.Message); + } + }); + ResetFolderCommand = new DelegateCommand(() => + { + serviceWrapper.LocalServices.ResetFolder(); + }); + ChangeBackGroundCommand = new DelegateCommand( ()=> + { + OpenFileDialog openFileDialog = new OpenFileDialog(); + openFileDialog.Multiselect = false; + openFileDialog.Filter = "Image Files(*.BMP;*.JPG;*.GIF*.PNG)|*.BMP;*.JPG;*.GIF*.PNG|All files (*.*)|*.*"; + openFileDialog.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments); + if (openFileDialog.ShowDialog() == true) + { + var str = openFileDialog.FileName; + if (!string.IsNullOrEmpty(str)) + { + Plugin.Settings.CrossSettings.Current.AddOrUpdateValue("Background", str); + DialogHost.OpenDialogCommand.Execute(new RestartAppDialog(),null); + } + } + }); + } + } +} diff --git a/PlixP/ViewModels/MovieDialogViewModel.cs b/PlixP/ViewModels/MovieDialogViewModel.cs new file mode 100644 index 0000000..5754d85 --- /dev/null +++ b/PlixP/ViewModels/MovieDialogViewModel.cs @@ -0,0 +1,162 @@ +using Prism.Commands; +using Prism.Mvvm; +using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.Diagnostics; +using System.Linq; +using System.Threading; +using System.Windows.Input; +using HandyControl.Controls; +using HandyControl.Interactivity; +using MaterialDesignThemes.Wpf; +using Microsoft.EntityFrameworkCore; +using PlixP.Models; +using PlixP.Repositories.Contracts; +using PlixP.Services; +using PlixP.Services.Contracts; +using PlixP.Views.Dialogs; +using MessageBox = System.Windows.MessageBox; + +namespace PlixP.ViewModels +{ + public class MovieDialogViewModel : BindableBase + { + private Movie _movie; + public Movie Movie + { + get { return _movie; } + set { SetProperty(ref _movie, value); } + } + + public ICommand DeleteCommand { get; set; } + public ICommand SaveCommand { get; set; } + public ICommand PlayFileCommand { get; set; } + public ICommand OpenFolderCommand { get; set; } + public ICommand AddCategoryCommand { get; set; } + public ICommand RemoveCategoryCommand { get; set; } + private IServiceWrapper ServiceWrapper { get; set; } + private IRepositoryWrapper RepositoryWrapper { get; set; } + public ObservableCollection Categories { get; set; } + public List Properties { get; set; } = new List(); + public MovieDialogViewModel() + { + + } + public MovieDialogViewModel(IServiceWrapper serviceWrapper, IRepositoryWrapper repositoryWrapper, Movie movie) + { + Categories = new ObservableCollection(); + repositoryWrapper.SetRepository().TableNoTracking.ToList().ForEach(c => Categories.Add(c)); + Movie = movie; + ServiceWrapper = serviceWrapper; + RepositoryWrapper = repositoryWrapper; + Properties.Add(new + { + Name = "Director : ", + Value = movie.Director + }); + Properties.Add(new + { + Name = "Writer : ", + Value = movie.Writer + }); + Properties.Add(new + { + Name = "Awarads : ", + Value = movie.Awards + }); + Properties.Add(new + { + Name = "Actors : ", + Value = movie.Actors + }); + Properties.Add(new + { + Name = "Country : ", + Value = movie.Country + }); + DeleteCommand = new DelegateCommand(() => + { + QuestionDialog dialog = new QuestionDialog("ایا از حذف فیلم مطمئن هستید ؟"); + dialog.Submited += (async (ss, ee) => + { + await serviceWrapper.MovieServices.DeleteMovie(movie); + ControlCommands.CloseAll.Execute(null, null); + HandyControl.Controls.MessageBox.Show($"{movie.Title} Has Removed"); + }); + Dialog.Show(dialog); + }); + PlayFileCommand = new DelegateCommand(() => + { + Process process = new Process(); + process.StartInfo.UseShellExecute = true; + process.StartInfo.FileName = @Movie.Location + "\\" + Movie.FullName; + process.Start(); + }); + OpenFolderCommand = new DelegateCommand(() => + { + try + { + Process process = new Process(); + process.StartInfo.UseShellExecute = true; + process.StartInfo.FileName = @Movie.Location; + process.Start(); + } + catch (Exception e) + { + MessageBox.Show(e.Message); + } + }); + AddCategoryCommand = new DelegateCommand(async (category) => + { + if (category.Id != 0) + { + if (Movie.Category.FirstOrDefault(c => c.CategoryId == category.Id) == null) + { + Movie.Category.Add(new CategoryMovie + { + MovieId = Movie.Id, + Category = category, + CategoryId = category.Id + }); + await repositoryWrapper.SetRepository().AddAsync(new CategoryMovie + { + MovieId = Movie.Id, + CategoryId = category.Id + },CancellationToken.None); + } + } + else + { + Movie.Category.Add(new CategoryMovie + { + MovieId = Movie.Id, + Category = category + }); + await repositoryWrapper.SetRepository().AddAsync(new CategoryMovie + { + MovieId = Movie.Id, + Category = category + },CancellationToken.None); + } + + }); + RemoveCategoryCommand = new DelegateCommand(async (cMovie)=> + { + try + { + await RepositoryWrapper.SetRepository().DeleteAsync(cMovie,CancellationToken.None); + Movie.Category.Remove(cMovie); + } + catch (Exception e) + { + MessageBox.Show(e.Message); + } + }); + SaveCommand = new DelegateCommand(async (m) => + { + await ServiceWrapper.MovieServices.EditMovie(m); + }); + } + } +} diff --git a/PlixP/ViewModels/MovieItemViewModel.cs b/PlixP/ViewModels/MovieItemViewModel.cs new file mode 100644 index 0000000..00b3d5b --- /dev/null +++ b/PlixP/ViewModels/MovieItemViewModel.cs @@ -0,0 +1,18 @@ +using Prism.Commands; +using Prism.Mvvm; +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Linq; + +namespace PlixP.ViewModels +{ + public class MovieItemViewModel : BindableBase + { + + public MovieItemViewModel() + { + + } + } +} diff --git a/PlixP/ViewModels/MovieListViewModel.cs b/PlixP/ViewModels/MovieListViewModel.cs new file mode 100644 index 0000000..82894b0 --- /dev/null +++ b/PlixP/ViewModels/MovieListViewModel.cs @@ -0,0 +1,195 @@ +using Prism.Commands; +using Prism.Mvvm; +using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.Collections.Specialized; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Input; +using HandyControl.Controls; +using MaterialDesignThemes.Wpf; +using PlixP.Models; +using PlixP.Repositories.Contracts; +using PlixP.Services.Contracts; +using PlixP.Views.Dialogs; +using MessageBox = HandyControl.Controls.MessageBox; + +namespace PlixP.ViewModels +{ + public class MovieListViewModel : BindableBase + { + private readonly IServiceWrapper _serviceWrapper; + private readonly IRepositoryWrapper _repositoryWrapper; + private int pagingCount = 25; + private int currentPage = 0; + public bool IsAllActive { get; set; } = true; + public MovieListModel MovieListModel { get; set; } = new MovieListModel(); + public ICommand RefreshCommand { get; set; } + public ICommand CheckByRealease { get; set; } + public ICommand MovieSelectedCommand { get; set; } + public ICommand RefreshFilesCommand { get; set; } + public ICommand CheckByAddedCommand { get; set; } + public ICommand CheckByImdbCommand { get; set; } + public ICommand GenreSelectedCommand { get; set; } + public ICommand NextPageCommand { get; set; } + public ICommand SearchCommand { get; set; } + + public MovieListViewModel(IServiceWrapper serviceWrapper, IRepositoryWrapper repositoryWrapper) + { + _serviceWrapper = serviceWrapper; + _repositoryWrapper = repositoryWrapper; + Initialize(); + CheckByImdbCommand = new DelegateCommand(async () => + { + ChangeByImdb(); + }); + RefreshCommand = new DelegateCommand(async () => + { + //await _serviceWrapper.MovieServices.SyncMovies(); + await Initialize(); + IsAllActive = true; + }); + + MovieSelectedCommand = new DelegateCommand((dataContext) => + { + Dialog.Show(new MovieDialog() { DataContext = new MovieDialogViewModel(serviceWrapper, repositoryWrapper, dataContext) }); + }); + + RefreshFilesCommand = new DelegateCommand(() => + { + serviceWrapper.LocalServices.ResetFolder(); + }); + + CheckByAddedCommand = new DelegateCommand(async () => + { + await Initialize(); + }); + + CheckByRealease = new DelegateCommand(() => + { + ChangeByRelease(); + }); + + GenreSelectedCommand = new DelegateCommand(() => + { + var genreDialog = new GenresDialog(_serviceWrapper,_repositoryWrapper); + genreDialog.GenreSelected += (async (ss, genre) => + { + await ChangeGenre(genre); + }); + Dialog.Show(genreDialog); + }); + SearchCommand = new DelegateCommand(async (search) => + { + try + { + MovieListModel.UnPagedMovies.Clear(); + foreach (var originalMovie in MovieListModel.OriginalMovies) + { + if (originalMovie.Title.ToLower().Contains(search.ToLower())) + MovieListModel.UnPagedMovies.Add(originalMovie); + } + MovieListModel.PageMovies.Clear(); + currentPage = 0; + Pagination(); + } + catch (Exception e) + { + MessageBox.Show(e.Message); + await Initialize(); + } + }); + NextPageCommand = new DelegateCommand(async () => + { + currentPage++; + Pagination(); + }); + + } + + private void ChangeByImdb() + { + MovieListModel.UnPagedMovies.Clear(); + MovieListModel.OriginalMovies.OrderByDescending(m => + { + float rate; + if (float.TryParse(m.imdbRating, out rate)) + return rate; + return 0; + }).ToList() + .ForEach(m => MovieListModel.UnPagedMovies.Add(m)); + MovieListModel.PageMovies.Clear(); + currentPage = 0; + Pagination(); + } + + private async Task ChangeGenre(List genres) + { + MovieListModel.UnPagedMovies.Clear(); + foreach (var genre in genres) + { + var moviesGenre = await _serviceWrapper.MovieServices.SelectByGenre(genre); + moviesGenre.ForEach(m => MovieListModel.UnPagedMovies.Add(m)); + } + MovieListModel.PageMovies.Clear(); + currentPage = 0; + } + private async Task ChangeGenre(string genre) + { + MovieListModel.UnPagedMovies.Clear(); + var moviesGenre = await _serviceWrapper.MovieServices.SelectByGenre(genre); + moviesGenre.ForEach(m => MovieListModel.UnPagedMovies.Add(m)); + MovieListModel.PageMovies.Clear(); + currentPage = 0; + } + + private async Task ChangeByRelease() + { + MovieListModel.UnPagedMovies.Clear(); + MovieListModel.OriginalMovies.OrderByDescending(m => m.IntYear).ToList() + .ForEach(m => MovieListModel.UnPagedMovies.Add(m)); + MovieListModel.PageMovies.Clear(); + currentPage = 0; + Pagination(); + } + + private async Task Initialize() + { + MovieListModel.PageMovies.Clear(); + MovieListModel.UnPagedMovies.Clear(); + MovieListModel.OriginalMovies.Clear(); + (await _serviceWrapper.MovieServices.GetMovies()) + .OrderByDescending(m => m.CreationDate) + .ToList() + .ForEach(m => + { + MovieListModel.OriginalMovies.Add(m); + }); + + MovieListModel.OriginalMovies.ToList() + .ForEach(m => MovieListModel.UnPagedMovies.Add(m)); + MovieListModel.OriginalCategories = new ObservableCollection(_repositoryWrapper + .SetRepository().TableNoTracking); + MovieListModel.MoviesCount = MovieListModel.UnPagedMovies.Count; + MovieListModel.OriginalGenres = await _serviceWrapper.MovieServices.GetGenres(); + currentPage = 0; + Pagination(); + } + + public void Pagination() + { + var selected = MovieListModel.UnPagedMovies.Skip((currentPage * pagingCount)).Take(pagingCount).ToList(); + foreach (var movie in selected) + { + Application.Current.Dispatcher.Invoke(() => + { + MovieListModel.PageMovies.Add(movie); + }); + } + } + + } +} diff --git a/PlixP/ViewModels/SuggestionBoxViewModel.cs b/PlixP/ViewModels/SuggestionBoxViewModel.cs new file mode 100644 index 0000000..da52465 --- /dev/null +++ b/PlixP/ViewModels/SuggestionBoxViewModel.cs @@ -0,0 +1,16 @@ +using Prism.Commands; +using Prism.Mvvm; +using System; +using System.Collections.Generic; +using System.Linq; + +namespace PlixP.ViewModels +{ + public class SuggestionBoxViewModel : BindableBase + { + public SuggestionBoxViewModel() + { + + } + } +} diff --git a/PlixP/Views/Dialogs/AddCategoryDialog.xaml b/PlixP/Views/Dialogs/AddCategoryDialog.xaml new file mode 100644 index 0000000..4d7b9aa --- /dev/null +++ b/PlixP/Views/Dialogs/AddCategoryDialog.xaml @@ -0,0 +1,15 @@ + + + diff --git a/PlixP/Views/Dialogs/AddCategoryDialog.xaml.cs b/PlixP/Views/Dialogs/AddCategoryDialog.xaml.cs new file mode 100644 index 0000000..0e9ff54 --- /dev/null +++ b/PlixP/Views/Dialogs/AddCategoryDialog.xaml.cs @@ -0,0 +1,15 @@ +using System.Windows.Controls; + +namespace PlixP.Views.Dialogs +{ + /// + /// Interaction logic for AddCategoryDialog + /// + public partial class AddCategoryDialog : UserControl + { + public AddCategoryDialog() + { + InitializeComponent(); + } + } +} diff --git a/PlixP/Views/Dialogs/GenresDialog.xaml b/PlixP/Views/Dialogs/GenresDialog.xaml new file mode 100644 index 0000000..3d2ad28 --- /dev/null +++ b/PlixP/Views/Dialogs/GenresDialog.xaml @@ -0,0 +1,101 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/PlixP/Views/Dialogs/GenresDialog.xaml.cs b/PlixP/Views/Dialogs/GenresDialog.xaml.cs new file mode 100644 index 0000000..e951385 --- /dev/null +++ b/PlixP/Views/Dialogs/GenresDialog.xaml.cs @@ -0,0 +1,39 @@ +using System; +using System.Windows.Controls; +using System.Windows.Input; +using HandyControl.Controls; +using HandyControl.Interactivity; +using PlixP.Repositories.Contracts; +using PlixP.Services.Contracts; +using PlixP.ViewModels; +using Card = MaterialDesignThemes.Wpf.Card; + +namespace PlixP.Views.Dialogs +{ + /// + /// Interaction logic for GenresDialog + /// + public partial class GenresDialog : UserControl + { + public event EventHandler GenreSelected; + public GenresDialog(IServiceWrapper serviceWrapper,IRepositoryWrapper repositoryWrapper) + { + var viewModel = new GenresDialogViewModel(serviceWrapper, repositoryWrapper); + DataContext = viewModel; + viewModel.GenreSelected += ((model, genre) => + { + GenreSelected?.Invoke(model,genre); + ControlCommands.Close.Execute(this,this); + }); + + + InitializeComponent(); + } + + private void GenreItem_OnMouseDown(object sender, MouseButtonEventArgs e) + { + if(sender is Card card && card.DataContext is GenreItemModel model && DataContext is GenresDialogViewModel viewModel) + viewModel.GenreSelectCommand.Execute(model); + } + } +} diff --git a/PlixP/Views/Dialogs/LoadingDialog.xaml b/PlixP/Views/Dialogs/LoadingDialog.xaml new file mode 100644 index 0000000..13c397b --- /dev/null +++ b/PlixP/Views/Dialogs/LoadingDialog.xaml @@ -0,0 +1,34 @@ + + + + + + + + + diff --git a/PlixP/Views/Dialogs/LoadingDialog.xaml.cs b/PlixP/Views/Dialogs/LoadingDialog.xaml.cs new file mode 100644 index 0000000..4d89451 --- /dev/null +++ b/PlixP/Views/Dialogs/LoadingDialog.xaml.cs @@ -0,0 +1,28 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Media.Imaging; +using System.Windows.Navigation; +using System.Windows.Shapes; + +namespace PlixP.Views.Dialogs +{ + /// + /// Interaction logic for LoadingDialog.xaml + /// + public partial class LoadingDialog : UserControl + { + public LoadingDialog() + { + InitializeComponent(); + } + } +} diff --git a/PlixP/Views/Dialogs/MovieDialog.xaml b/PlixP/Views/Dialogs/MovieDialog.xaml new file mode 100644 index 0000000..4e5cbd7 --- /dev/null +++ b/PlixP/Views/Dialogs/MovieDialog.xaml @@ -0,0 +1,337 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/PlixP/Views/Dialogs/MovieDialog.xaml.cs b/PlixP/Views/Dialogs/MovieDialog.xaml.cs new file mode 100644 index 0000000..cae90be --- /dev/null +++ b/PlixP/Views/Dialogs/MovieDialog.xaml.cs @@ -0,0 +1,143 @@ +using System; +using System.Diagnostics; +using System.IO; +using System.Linq; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Controls.Primitives; +using MaterialDesignThemes.Wpf; +using Microsoft.EntityFrameworkCore; +using PlixP.Models; +using PlixP.ViewModels; + +namespace PlixP.Views.Dialogs +{ + /// + /// Interaction logic for MovieDialog + /// + public partial class MovieDialog : UserControl + { + public Movie Movie + { + get + { + return (DataContext as MovieDialogViewModel).Movie; + } + } + + public MovieDialog() + { + InitializeComponent(); + seenToggle.Checked += SeenToggle_OnChecked; + dubbedToggle.Checked += DubbedToggle_OnChecked; + } + public MovieDialog(Movie dataContext) + { + InitializeComponent(); + } + + + private void Edit_OnClick(object sender, RoutedEventArgs e) + { + var button = sender as Button; + button.Content = new PackIcon + { + Kind = PackIconKind.Check, + Width = 20 + }; + categoryItems.IsEnabled = true; + button.Click += AcceptEdit_Click; + titleTextBox.IsReadOnly = false; + dubbedToggle.IsEnabled = true; + seenToggle.IsEnabled = true; + addCategoryButton.IsEnabled = true; + } + + private void AcceptEdit_Click(object sender, RoutedEventArgs e) + { + try + { + Movie newMovie = (DataContext as MovieDialogViewModel)?.Movie.Clone() as Movie; + if (Movie.Title != null && !Movie.Title.Equals(titleTextBox.Text)) + { + newMovie.Title = titleTextBox.Text; + } + if (Movie.IsDubbed != dubbedToggle.IsChecked) + { + if (dubbedToggle.IsChecked == true) + { + var newName = Movie.FileName.Split('.'); + string nn = ""; + for (int i = 0; i < newName.Length; i++) + { + if (i == newName.Length - 1) + { + nn += "Dubbed" + "."; + } + + nn += newName[i] + "."; + } + newMovie.FileName = nn; + } + else + { + var newName = Movie.FileName.Replace("Dubbed.", ""); + newMovie.FileName = newName; + } + } + if (Movie.IsSeen != seenToggle.IsChecked) + { + newMovie.IsSeen = seenToggle.IsChecked ?? false; + } + + (DataContext as MovieDialogViewModel)?.SaveCommand.Execute(newMovie); + } + + catch (Exception exception) + { + MessageBox.Show(exception.Message); + } + } + + private void DubbedToggle_OnChecked(object sender, RoutedEventArgs e) + { + var toggel = sender as CheckBox; + if (!categoryItems.IsEnabled) + toggel.IsChecked = !toggel.IsChecked; + } + + private void SeenToggle_OnChecked(object sender, RoutedEventArgs e) + { + var toggel = sender as CheckBox; + if (!categoryItems.IsEnabled) + toggel.IsChecked = !toggel.IsChecked; + } + + private void AddCategoryButtonBase_OnClick(object sender, RoutedEventArgs e) + { + if (!AddCategoryPopUp.IsPopupOpen) + AddCategoryPopUp.IsPopupOpen = true; + else + AddCategoryPopUp.IsPopupOpen = false; + } + + private void CategoryNameTextBox_OnTextChanged(object sender, TextChangedEventArgs e) + { + categoryCombo.IsEnabled = true; + } + + private void AddCategoryButton_OnClick(object sender, RoutedEventArgs e) + { + if (categoryCombo.SelectedValue != null) + { + var category = categoryCombo.SelectedValue as Category; + (DataContext as MovieDialogViewModel)?.AddCategoryCommand.Execute(category); + } + } + + private void RemoveCategoryButton_OnClick(object sender, RoutedEventArgs e) + { + (DataContext as MovieDialogViewModel)?.RemoveCategoryCommand.Execute((sender as Button).DataContext); + } + } +} diff --git a/PlixP/Views/Dialogs/QuestionDialog.xaml b/PlixP/Views/Dialogs/QuestionDialog.xaml new file mode 100644 index 0000000..7f703a2 --- /dev/null +++ b/PlixP/Views/Dialogs/QuestionDialog.xaml @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + diff --git a/PlixP/Views/MainWindow.xaml.cs b/PlixP/Views/MainWindow.xaml.cs new file mode 100644 index 0000000..2fc58ff --- /dev/null +++ b/PlixP/Views/MainWindow.xaml.cs @@ -0,0 +1,25 @@ +using System; +using System.Windows; +using MaterialDesignThemes.Wpf; +using PlixP.Views.Dialogs; +using Prism.Regions; +using Window = HandyControl.Controls.Window; + +namespace PlixP.Views +{ + /// + /// Interaction logic for MainWindow.xaml + /// + public partial class MainWindow : Window + { + public static Snackbar snackbar = new Snackbar(); + public MainWindow(IRegionManager regionManager) + { + InitializeComponent(); + DialogHost.Show(new LoadingDialog()); + regionManager.RegisterViewWithRegion("ContentRegion", typeof(MovieList)); + mainGrid.Children.Add(snackbar); + } + + } +} diff --git a/PlixP/Views/MasterDetail.xaml b/PlixP/Views/MasterDetail.xaml new file mode 100644 index 0000000..26a9cac --- /dev/null +++ b/PlixP/Views/MasterDetail.xaml @@ -0,0 +1,173 @@ + + + + + + + + + + + + + Path + + + + + + + + + + + + + + + + + + + + + + Add Category + + + + + + + + + + + + + + + + + + diff --git a/PlixP/Views/MasterDetail.xaml.cs b/PlixP/Views/MasterDetail.xaml.cs new file mode 100644 index 0000000..ddbe995 --- /dev/null +++ b/PlixP/Views/MasterDetail.xaml.cs @@ -0,0 +1,34 @@ +using System.Windows; +using System.Windows.Controls; +using PlixP.ViewModels; + +namespace PlixP.Views +{ + /// + /// Interaction logic for MasterDetail + /// + public partial class MasterDetail : UserControl + { + public MasterDetail() + { + InitializeComponent(); + } + + private void Path_OnClick(object sender, RoutedEventArgs e) + { + (DataContext as MasterDetailViewModel)?.PathCommand.Execute(addPathTextBox.Text); + } + + private void Cat_OnClick(object sender, RoutedEventArgs e) + { + (DataContext as MasterDetailViewModel)?.AddCategoryCommand.Execute(addCategoryTextBox.Text); + } + + + private void RemovePathButtonBase_OnClick(object sender, RoutedEventArgs e) + { + if(sender is Button button && button.DataContext is string str && DataContext is MasterDetailViewModel viewModel) + viewModel.RemovePathCommand.Execute(str); + } + } +} diff --git a/PlixP/Views/MovieList.xaml b/PlixP/Views/MovieList.xaml new file mode 100644 index 0000000..13f73a7 --- /dev/null +++ b/PlixP/Views/MovieList.xaml @@ -0,0 +1,198 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Seach + + + + +