├── .gitignore ├── FastNZB.sln ├── LICENSE ├── README.md ├── scripts └── FastNZB.Import │ ├── FastNZB.Import.csproj │ ├── Models.cs │ ├── Program.cs │ └── appsettings.sample.txt └── src ├── FastNZB.ServiceInterface ├── APIServices.cs ├── FallbackServices.cs ├── FastNZB.ServiceInterface.csproj ├── FastNZBAuthRepo.cs ├── FastNZBSession.cs ├── ImportServices.cs ├── NZBServices.cs ├── Properties │ └── AssemblyInfo.cs ├── SearchServices.cs ├── SessionServices.cs └── UserServices.cs ├── FastNZB.ServiceModel ├── APIModels.cs ├── FastNZB.ServiceModel.csproj ├── FindNZBModels.cs ├── ImportNZBModels.cs ├── Properties │ └── AssemblyInfo.cs ├── RSS │ ├── Author.cs │ ├── Feed.cs │ └── Item.cs ├── SessionModels.cs ├── Types │ ├── APIKey.cs │ ├── APIRequest.cs │ ├── Category.cs │ ├── Count.cs │ ├── Download.cs │ ├── NZB.cs │ ├── NZBResult.cs │ ├── TVEpisode.cs │ ├── Title.cs │ ├── Video.cs │ └── Vote.cs └── UserModels.cs ├── FastNZB ├── .editorconfig ├── .nvmrc ├── AppHost.cs ├── FastNZB.csproj ├── LICENSE ├── Program.cs ├── Properties │ └── launchSettings.json ├── Startup.cs ├── appsettings.sample.txt ├── config │ ├── empty.js │ ├── github-deploy │ │ └── index.js │ ├── head-config.common.js │ ├── helpers.js │ ├── html-elements-plugin │ │ └── index.js │ ├── karma.conf.js │ ├── protractor.conf.js │ ├── resource-override.js │ ├── spec-bundle.js │ ├── webpack.common.js │ ├── webpack.dev.js │ ├── webpack.github-deploy.js │ ├── webpack.prod.js │ └── webpack.test.js ├── firebase.json ├── karma.conf.js ├── netlify.toml ├── package-lock.json ├── package.json ├── protractor.conf.js ├── src │ ├── app │ │ ├── +detail │ │ │ ├── +child-detail │ │ │ │ ├── child-detail.component.ts │ │ │ │ ├── child-detail.module.ts │ │ │ │ ├── child-detail.routes.ts │ │ │ │ └── index.ts │ │ │ ├── detail.component.html │ │ │ ├── detail.component.ts │ │ │ ├── detail.module.ts │ │ │ ├── detail.routes.ts │ │ │ └── index.ts │ │ ├── +reset │ │ │ ├── index.ts │ │ │ ├── reset.component.html │ │ │ ├── reset.component.ts │ │ │ ├── reset.module.ts │ │ │ └── reset.routes.ts │ │ ├── app.component.css │ │ ├── app.component.spec.ts │ │ ├── app.component.ts │ │ ├── app.e2e.ts │ │ ├── app.module.ts │ │ ├── app.resolver.ts │ │ ├── app.routes.ts │ │ ├── app.service.ts │ │ ├── app.spec.ts │ │ ├── app.style.css │ │ ├── bytes.pipe.ts │ │ ├── environment.ts │ │ ├── home │ │ │ ├── home.component.css │ │ │ ├── home.component.html │ │ │ ├── home.component.spec.ts │ │ │ ├── home.component.ts │ │ │ ├── home.e2e.ts │ │ │ ├── index.ts │ │ │ ├── title │ │ │ │ ├── index.ts │ │ │ │ ├── title.service.spec.ts │ │ │ │ └── title.service.ts │ │ │ └── x-large │ │ │ │ ├── index.ts │ │ │ │ ├── x-large.directive.spec.ts │ │ │ │ └── x-large.directive.ts │ │ ├── index.ts │ │ ├── no-content │ │ │ ├── index.ts │ │ │ └── no-content.component.ts │ │ ├── nzb.component.ts │ │ ├── release-result.component.ts │ │ ├── release-search.component.html │ │ ├── release-search.component.ts │ │ ├── release-search.service.ts │ │ ├── release.component.ts │ │ ├── release.service.ts │ │ ├── search │ │ │ ├── index.ts │ │ │ ├── search.component.html │ │ │ ├── search.component.spec.ts │ │ │ └── search.component.ts │ │ ├── user.component.ts │ │ └── user.service.ts │ ├── assets │ │ ├── css │ │ │ └── .gitkeep │ │ ├── data.json │ │ ├── humans.txt │ │ ├── icon │ │ │ ├── android-icon-144x144.png │ │ │ ├── android-icon-192x192.png │ │ │ ├── android-icon-36x36.png │ │ │ ├── android-icon-48x48.png │ │ │ ├── android-icon-72x72.png │ │ │ ├── android-icon-96x96.png │ │ │ ├── apple-icon-114x114.png │ │ │ ├── apple-icon-120x120.png │ │ │ ├── apple-icon-144x144.png │ │ │ ├── apple-icon-152x152.png │ │ │ ├── apple-icon-180x180.png │ │ │ ├── apple-icon-57x57.png │ │ │ ├── apple-icon-60x60.png │ │ │ ├── apple-icon-72x72.png │ │ │ ├── apple-icon-76x76.png │ │ │ ├── apple-icon-precomposed.png │ │ │ ├── apple-icon.png │ │ │ ├── browserconfig.xml │ │ │ ├── favicon-16x16.png │ │ │ ├── favicon-32x32.png │ │ │ ├── favicon-96x96.png │ │ │ ├── favicon.ico │ │ │ ├── ms-icon-144x144.png │ │ │ ├── ms-icon-150x150.png │ │ │ ├── ms-icon-310x310.png │ │ │ └── ms-icon-70x70.png │ │ ├── img │ │ │ ├── angular-logo.png │ │ │ ├── angularclass-avatar.png │ │ │ ├── angularclass-logo.png │ │ │ ├── btc.png │ │ │ └── nzb.png │ │ ├── manifest.json │ │ ├── mock-data │ │ │ └── mock-data.json │ │ ├── robots.txt │ │ └── service-worker.js │ ├── custom-typings.d.ts │ ├── fonts │ │ ├── FontAwesome.otf │ │ ├── fontawesome-webfont.eot │ │ ├── fontawesome-webfont.svg │ │ ├── fontawesome-webfont.ttf │ │ ├── fontawesome-webfont.woff │ │ └── fontawesome-webfont.woff2 │ ├── index.html │ ├── main.browser.aot.ts │ ├── main.browser.ts │ ├── meta │ │ ├── humans.txt │ │ └── robots.txt │ ├── polyfills.browser.ts │ ├── styles │ │ ├── _variables.scss │ │ ├── headings.css │ │ └── styles.scss │ └── vendor.browser.ts ├── tsconfig.json ├── tsconfig.webpack.json ├── tslint.json ├── typedoc.json ├── typings.json ├── typings │ ├── globals │ │ └── jquery │ │ │ ├── index.d.ts │ │ │ └── typings.json │ └── index.d.ts ├── web.config ├── webpack.config.js ├── wwwroot │ ├── 0.fb795abddb64fb794e68.chunk.js │ ├── 1.a85d2a7f3e86deb8bacf.chunk.js │ ├── 2.ab3d001619a899ed5bb8.chunk.js │ ├── assets │ │ ├── css │ │ │ └── .gitkeep │ │ ├── data.json │ │ ├── humans.txt │ │ ├── icon │ │ │ ├── android-icon-144x144.png │ │ │ ├── android-icon-192x192.png │ │ │ ├── android-icon-36x36.png │ │ │ ├── android-icon-48x48.png │ │ │ ├── android-icon-72x72.png │ │ │ ├── android-icon-96x96.png │ │ │ ├── apple-icon-114x114.png │ │ │ ├── apple-icon-120x120.png │ │ │ ├── apple-icon-144x144.png │ │ │ ├── apple-icon-152x152.png │ │ │ ├── apple-icon-180x180.png │ │ │ ├── apple-icon-57x57.png │ │ │ ├── apple-icon-60x60.png │ │ │ ├── apple-icon-72x72.png │ │ │ ├── apple-icon-76x76.png │ │ │ ├── apple-icon-precomposed.png │ │ │ ├── apple-icon.png │ │ │ ├── browserconfig.xml │ │ │ ├── favicon-16x16.png │ │ │ ├── favicon-32x32.png │ │ │ ├── favicon-96x96.png │ │ │ ├── favicon.ico │ │ │ ├── ms-icon-144x144.png │ │ │ ├── ms-icon-150x150.png │ │ │ ├── ms-icon-310x310.png │ │ │ └── ms-icon-70x70.png │ │ ├── img │ │ │ ├── angular-logo.png │ │ │ ├── angularclass-avatar.png │ │ │ ├── angularclass-logo.png │ │ │ ├── btc.png │ │ │ └── nzb.png │ │ ├── manifest.json │ │ ├── robots.txt │ │ └── service-worker.js │ ├── humans.txt │ ├── index.html │ ├── main.903320ae724f7b4fce31fd535d77a96d.css │ ├── main.903320ae724f7b4fce31fd535d77a96d.css.map │ ├── main.c07ecfd6a0c523a13a39.bundle.js │ ├── polyfills.9902f753799924f02fc6.bundle.js │ └── robots.txt └── yarn.lock └── lib ├── ServiceStack.Admin.deps.json ├── ServiceStack.Admin.dll ├── ServiceStack.Admin.xml ├── ServiceStack.Aws.deps.json ├── ServiceStack.Aws.dll ├── ServiceStack.Aws.xml ├── ServiceStack.Client.deps.json ├── ServiceStack.Client.dll ├── ServiceStack.Client.xml ├── ServiceStack.Common.deps.json ├── ServiceStack.Common.dll ├── ServiceStack.Common.xml ├── ServiceStack.Interfaces.deps.json ├── ServiceStack.Interfaces.dll ├── ServiceStack.Interfaces.xml ├── ServiceStack.Mvc.dll ├── ServiceStack.OrmLite.MySql.deps.json ├── ServiceStack.OrmLite.MySql.dll ├── ServiceStack.OrmLite.MySql.dll.config ├── ServiceStack.OrmLite.MySql.xml ├── ServiceStack.OrmLite.PostgreSQL.deps.json ├── ServiceStack.OrmLite.PostgreSQL.dll ├── ServiceStack.OrmLite.PostgreSQL.xml ├── ServiceStack.OrmLite.SqlServer.deps.json ├── ServiceStack.OrmLite.SqlServer.dll ├── ServiceStack.OrmLite.SqlServer.xml ├── ServiceStack.OrmLite.Sqlite.deps.json ├── ServiceStack.OrmLite.Sqlite.dll ├── ServiceStack.OrmLite.Sqlite.xml ├── ServiceStack.OrmLite.deps.json ├── ServiceStack.OrmLite.dll ├── ServiceStack.OrmLite.xml ├── ServiceStack.Redis.deps.json ├── ServiceStack.Redis.dll ├── ServiceStack.Redis.xml ├── ServiceStack.Server.deps.json ├── ServiceStack.Server.dll ├── ServiceStack.Server.xml ├── ServiceStack.Text.deps.json ├── ServiceStack.Text.dll ├── ServiceStack.Text.xml ├── ServiceStack.dll └── ServiceStack.xml /.gitignore: -------------------------------------------------------------------------------- 1 | ## Ignore Visual Studio temporary files, build results, and 2 | ## files generated by popular Visual Studio add-ons. 3 | 4 | # User-specific files 5 | *.suo 6 | *.user 7 | *.userosscache 8 | *.sln.docstates 9 | 10 | # User-specific files (MonoDevelop/Xamarin Studio) 11 | *.userprefs 12 | 13 | # Build results 14 | [Dd]ebug/ 15 | [Dd]ebugPublic/ 16 | [Rr]elease/ 17 | [Rr]eleases/ 18 | x64/ 19 | x86/ 20 | bld/ 21 | [Bb]in/ 22 | [Oo]bj/ 23 | [Ll]og/ 24 | 25 | # Visual Studio 2015 cache/options directory 26 | .vs/ 27 | # Uncomment if you have tasks that create the project's static files in wwwroot 28 | #wwwroot/ 29 | 30 | # MSTest test Results 31 | [Tt]est[Rr]esult*/ 32 | [Bb]uild[Ll]og.* 33 | 34 | # NUNIT 35 | *.VisualState.xml 36 | TestResult.xml 37 | 38 | # Build Results of an ATL Project 39 | [Dd]ebugPS/ 40 | [Rr]eleasePS/ 41 | dlldata.c 42 | 43 | # DNX 44 | project.lock.json 45 | artifacts/ 46 | 47 | *_i.c 48 | *_p.c 49 | *_i.h 50 | *.ilk 51 | *.meta 52 | *.obj 53 | *.pch 54 | *.pdb 55 | *.pgc 56 | *.pgd 57 | *.rsp 58 | *.sbr 59 | *.tlb 60 | *.tli 61 | *.tlh 62 | *.tmp 63 | *.tmp_proj 64 | *.log 65 | *.vspscc 66 | *.vssscc 67 | .builds 68 | *.pidb 69 | *.svclog 70 | *.scc 71 | 72 | # Chutzpah Test files 73 | _Chutzpah* 74 | 75 | # Visual C++ cache files 76 | ipch/ 77 | *.aps 78 | *.ncb 79 | *.opendb 80 | *.opensdf 81 | *.sdf 82 | *.cachefile 83 | *.VC.db 84 | *.VC.VC.opendb 85 | 86 | # Visual Studio profiler 87 | *.psess 88 | *.vsp 89 | *.vspx 90 | *.sap 91 | 92 | # TFS 2012 Local Workspace 93 | $tf/ 94 | 95 | # Guidance Automation Toolkit 96 | *.gpState 97 | 98 | # ReSharper is a .NET coding add-in 99 | _ReSharper*/ 100 | *.[Rr]e[Ss]harper 101 | *.DotSettings.user 102 | 103 | # JustCode is a .NET coding add-in 104 | .JustCode 105 | 106 | # TeamCity is a build add-in 107 | _TeamCity* 108 | 109 | # DotCover is a Code Coverage Tool 110 | *.dotCover 111 | 112 | # NCrunch 113 | _NCrunch_* 114 | .*crunch*.local.xml 115 | nCrunchTemp_* 116 | 117 | # MightyMoose 118 | *.mm.* 119 | AutoTest.Net/ 120 | 121 | # Web workbench (sass) 122 | .sass-cache/ 123 | 124 | # Installshield output folder 125 | [Ee]xpress/ 126 | 127 | # DocProject is a documentation generator add-in 128 | DocProject/buildhelp/ 129 | DocProject/Help/*.HxT 130 | DocProject/Help/*.HxC 131 | DocProject/Help/*.hhc 132 | DocProject/Help/*.hhk 133 | DocProject/Help/*.hhp 134 | DocProject/Help/Html2 135 | DocProject/Help/html 136 | 137 | # Click-Once directory 138 | publish/ 139 | 140 | # Publish Web Output 141 | *.[Pp]ublish.xml 142 | *.azurePubxml 143 | # TODO: Comment the next line if you want to checkin your web deploy settings 144 | # but database connection strings (with potential passwords) will be unencrypted 145 | *.pubxml 146 | *.publishproj 147 | 148 | # Microsoft Azure Web App publish settings. Comment the next line if you want to 149 | # checkin your Azure Web App publish settings, but sensitive information contained 150 | # in these scripts will be unencrypted 151 | PublishScripts/ 152 | 153 | # NuGet Packages 154 | *.nupkg 155 | # The packages folder can be ignored because of Package Restore 156 | **/packages/* 157 | # except build/, which is used as an MSBuild target. 158 | !**/packages/build/ 159 | # Uncomment if necessary however generally it will be regenerated when needed 160 | #!**/packages/repositories.config 161 | # NuGet v3's project.json files produces more ignoreable files 162 | *.nuget.props 163 | *.nuget.targets 164 | 165 | # Microsoft Azure Build Output 166 | csx/ 167 | *.build.csdef 168 | 169 | # Microsoft Azure Emulator 170 | ecf/ 171 | rcf/ 172 | 173 | # Windows Store app package directories and files 174 | AppPackages/ 175 | BundleArtifacts/ 176 | Package.StoreAssociation.xml 177 | _pkginfo.txt 178 | 179 | # Visual Studio cache files 180 | # files ending in .cache can be ignored 181 | *.[Cc]ache 182 | # but keep track of directories ending in .cache 183 | !*.[Cc]ache/ 184 | 185 | # Others 186 | ClientBin/ 187 | ~$* 188 | *~ 189 | *.dbmdl 190 | *.dbproj.schemaview 191 | *.pfx 192 | *.publishsettings 193 | node_modules/ 194 | orleans.codegen.cs 195 | 196 | # Since there are multiple workflows, uncomment next line to ignore bower_components 197 | # (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) 198 | #bower_components/ 199 | 200 | # RIA/Silverlight projects 201 | Generated_Code/ 202 | 203 | # Backup & report files from converting an old project file 204 | # to a newer Visual Studio version. Backup files are not needed, 205 | # because we have git ;-) 206 | _UpgradeReport_Files/ 207 | Backup*/ 208 | UpgradeLog*.XML 209 | UpgradeLog*.htm 210 | 211 | # SQL Server files 212 | *.mdf 213 | *.ldf 214 | 215 | # Business Intelligence projects 216 | *.rdl.data 217 | *.bim.layout 218 | *.bim_*.settings 219 | 220 | # Microsoft Fakes 221 | FakesAssemblies/ 222 | 223 | # GhostDoc plugin setting file 224 | *.GhostDoc.xml 225 | 226 | # Node.js Tools for Visual Studio 227 | .ntvs_analysis.dat 228 | 229 | # Visual Studio 6 build log 230 | *.plg 231 | 232 | # Visual Studio 6 workspace options file 233 | *.opt 234 | 235 | # Visual Studio LightSwitch build output 236 | **/*.HTMLClient/GeneratedArtifacts 237 | **/*.DesktopClient/GeneratedArtifacts 238 | **/*.DesktopClient/ModelManifest.xml 239 | **/*.Server/GeneratedArtifacts 240 | **/*.Server/ModelManifest.xml 241 | _Pvt_Extensions 242 | 243 | # Paket dependency manager 244 | .paket/paket.exe 245 | paket-files/ 246 | 247 | # FAKE - F# Make 248 | .fake/ 249 | 250 | # JetBrains Rider 251 | .idea/ 252 | *.sln.iml 253 | 254 | #Visual studio code 255 | .vs 256 | .vscode 257 | 258 | #FastNZB App settings 259 | appsettings.txt 260 | 261 | /src/FastNZB/.awcache 262 | .DS_Store 263 | -------------------------------------------------------------------------------- /FastNZB.sln: -------------------------------------------------------------------------------- 1 | 2 | Microsoft Visual Studio Solution File, Format Version 12.00 3 | # Visual Studio Version 16 4 | VisualStudioVersion = 16.0.29728.190 5 | MinimumVisualStudioVersion = 10.0.40219.1 6 | Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "FastNZB", "src\FastNZB\FastNZB.csproj", "{EAF8171A-B8E6-4BC3-9A10-6F6C29E7A394}" 7 | EndProject 8 | Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "FastNZB.ServiceModel", "src\FastNZB.ServiceModel\FastNZB.ServiceModel.csproj", "{D6E47201-1CF1-48DA-8B40-7418070EC783}" 9 | EndProject 10 | Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "FastNZB.ServiceInterface", "src\FastNZB.ServiceInterface\FastNZB.ServiceInterface.csproj", "{E532E09D-D750-4A9F-B682-E7BA1508EA2C}" 11 | EndProject 12 | Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "FastNZB.Import", "scripts\FastNZB.Import\FastNZB.Import.csproj", "{B57DAF33-2F3F-48D6-94FC-24A9684EE65E}" 13 | EndProject 14 | Global 15 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 16 | Debug|Any CPU = Debug|Any CPU 17 | Release|Any CPU = Release|Any CPU 18 | EndGlobalSection 19 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 20 | {EAF8171A-B8E6-4BC3-9A10-6F6C29E7A394}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 21 | {EAF8171A-B8E6-4BC3-9A10-6F6C29E7A394}.Debug|Any CPU.Build.0 = Debug|Any CPU 22 | {EAF8171A-B8E6-4BC3-9A10-6F6C29E7A394}.Release|Any CPU.ActiveCfg = Release|Any CPU 23 | {EAF8171A-B8E6-4BC3-9A10-6F6C29E7A394}.Release|Any CPU.Build.0 = Release|Any CPU 24 | {D6E47201-1CF1-48DA-8B40-7418070EC783}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 25 | {D6E47201-1CF1-48DA-8B40-7418070EC783}.Debug|Any CPU.Build.0 = Debug|Any CPU 26 | {D6E47201-1CF1-48DA-8B40-7418070EC783}.Release|Any CPU.ActiveCfg = Release|Any CPU 27 | {D6E47201-1CF1-48DA-8B40-7418070EC783}.Release|Any CPU.Build.0 = Release|Any CPU 28 | {E532E09D-D750-4A9F-B682-E7BA1508EA2C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 29 | {E532E09D-D750-4A9F-B682-E7BA1508EA2C}.Debug|Any CPU.Build.0 = Debug|Any CPU 30 | {E532E09D-D750-4A9F-B682-E7BA1508EA2C}.Release|Any CPU.ActiveCfg = Release|Any CPU 31 | {E532E09D-D750-4A9F-B682-E7BA1508EA2C}.Release|Any CPU.Build.0 = Release|Any CPU 32 | {B57DAF33-2F3F-48D6-94FC-24A9684EE65E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 33 | {B57DAF33-2F3F-48D6-94FC-24A9684EE65E}.Debug|Any CPU.Build.0 = Debug|Any CPU 34 | {B57DAF33-2F3F-48D6-94FC-24A9684EE65E}.Release|Any CPU.ActiveCfg = Release|Any CPU 35 | {B57DAF33-2F3F-48D6-94FC-24A9684EE65E}.Release|Any CPU.Build.0 = Release|Any CPU 36 | EndGlobalSection 37 | GlobalSection(SolutionProperties) = preSolution 38 | HideSolutionNode = FALSE 39 | EndGlobalSection 40 | GlobalSection(ExtensibilityGlobals) = postSolution 41 | SolutionGuid = {83DAEC0D-2E5E-4DDB-83F1-7143EB3F76D3} 42 | EndGlobalSection 43 | EndGlobal 44 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # fastNZB 2 | source for the frontend and api of https://fastnzb.com. 3 | designed to operate alongside the indexing software nZEDb (https://github.com/nZEDb/nZEDb), this software does not index usenet, instead if operates as an off-site frontend to nZEDb to reduce load on the public facing server 4 | 5 | # requirements 6 | dotnet core v2.1 7 | mysql 8 | Amazon S3 bucket for storing NZB files 9 | sphinxsearch (optional) 10 | nginx (or apache) 11 | 12 | # running 13 | In one terminal 14 | ``` 15 | cd src/FastNZB 16 | npm i 17 | npm run start 18 | ``` 19 | In another 20 | ``` 21 | dotnet watch run 22 | ``` 23 | 24 | # configuring 25 | copy appsettings.sample.txt to appsettings.txt in both scripts/FastNZB.Import and src/FastNZB (each has a separate format) 26 | 27 | # installation - import 28 | run the following queries on your nZEDb database 29 | ```mysql 30 | ALTER TABLE releases ADD exported TINYINT(1) DEFAULT 0; 31 | ALTER TABLE releases ADD failedexport TINYINT(1) DEFAULT 0; 32 | ``` 33 | copy the build output from scripts/FastNZB.Import to your nZEDb server 34 | run this console program as a cron job however often as you'd like 35 | the configuration value ApiKey should be the same on both the import appsettings.txt and the api appsettings, this is a hacky way to verify the import is coming from a valid source 36 | 37 | # installation - frontend 38 | ``` 39 | npm build:prod 40 | ``` 41 | will build a production version of the angular 2 app and copy the output to wwwroot, copy wwwroot to your production server 42 | 43 | # installation - api 44 | ``` 45 | dotnet build -o bin/Publish 46 | ``` 47 | this will build the api and place it in bin/Publish, copy this to your production server 48 | 49 | to install as a service on CentOS, add the following file to /etc/systemd/system/fastnzb.service 50 | ``` 51 | [Unit] 52 | Description=FastNZB 53 | 54 | [Service] 55 | WorkingDirectory=/srv/www/fastnzb.com/public_html 56 | ExecStart=/usr/bin/dotnet /srv/www/fastnzb.com/public_html/FastNZB.dll --server.urls http://*:5021 57 | Restart=always 58 | SyslogIdentifier=fastnzb 59 | User=root 60 | Environment=ASPNETCORE_ENVIRONMENT=Production 61 | Environment=ASPNETCORE_URLS=http://localhost:5021 62 | 63 | [Install] 64 | WantedBy=multi-user.target 65 | ``` 66 | run 67 | ``` 68 | sudo systemctl daemon-reload 69 | sudo service fastnzb start 70 | ``` 71 | 72 | # appsettings.txt - api 73 | ``` 74 | MySQL - read/write connection string 75 | MySQLRead - read-only connection string (if using read-replicas, if not copy from above) 76 | AWS_ACCESS_KEY - AWS access for s3 bucket 77 | AWS_SECRET_KEY - AWS access for s3 bucket 78 | S3BucketName AWS s3 bucket name 79 | Redis - redis server for session/caching 80 | BaseUrl - public url 81 | FSPath - local nzb cache location 82 | ``` 83 | -------------------------------------------------------------------------------- /scripts/FastNZB.Import/FastNZB.Import.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Exe 5 | netcoreapp2.1 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | ..\..\src\lib\ServiceStack.dll 15 | 16 | 17 | ..\..\src\lib\ServiceStack.Client.dll 18 | 19 | 20 | ..\..\src\lib\ServiceStack.Common.dll 21 | 22 | 23 | ..\..\src\lib\ServiceStack.Interfaces.dll 24 | 25 | 26 | ..\..\src\lib\ServiceStack.OrmLite.dll 27 | 28 | 29 | ..\..\src\lib\ServiceStack.OrmLite.MySQL.dll 30 | 31 | 32 | ..\..\src\lib\ServiceStack.Server.dll 33 | 34 | 35 | ..\..\src\lib\ServiceStack.Text.dll 36 | 37 | 38 | 39 | 40 | 41 | PreserveNewest 42 | 43 | 44 | PreserveNewest 45 | 46 | 47 | 48 | 49 | -------------------------------------------------------------------------------- /scripts/FastNZB.Import/Models.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Text; 4 | using ServiceStack.DataAnnotations; 5 | 6 | namespace FastNZB.Import 7 | { 8 | 9 | // nZEDb tables 10 | 11 | [Alias("releases")] 12 | public class NZEDBRelease 13 | { 14 | public int id { get; set; } 15 | public string searchname { get; set; } 16 | public int totalpart { get; set; } 17 | public int groups_id { get; set; } 18 | public Int64 size { get; set; } 19 | public string guid { get; set; } 20 | public string tv_title { get; set; } 21 | public string se_complete { get; set; } 22 | public string movie_title { get; set; } 23 | public int imdbid { get; set; } 24 | public int videos_id { get; set; } 25 | public int tv_episodes_id { get; set; } 26 | public DateTime postdate { get; set; } 27 | public bool exported { get; set; } 28 | public int failedexport { get; set; } 29 | public int categories_id { get; set; } 30 | public DateTime adddate { get; set; } 31 | } 32 | 33 | [Alias("videos")] 34 | public class NZEDBVideo 35 | { 36 | 37 | private int _id = 0; 38 | private int _type = 0; 39 | private string _title = String.Empty; 40 | private string _countriesId = String.Empty; 41 | private DateTime _started = DateTime.MinValue; 42 | private int _anidb = 0; 43 | private int _imdb = 0; 44 | private int _tmdb = 0; 45 | private int _trakt = 0; 46 | private int _tvdb = 0; 47 | private int _tvmaze = 0; 48 | private int _tvrage = 0; 49 | private int _source = 0; 50 | 51 | 52 | [AutoIncrementAttribute] 53 | [PrimaryKey] 54 | [Alias("id")] 55 | public int Id { get { return _id; } set { _id = value; } } 56 | [Alias("type")] 57 | public int Type { get { return _type; } set { _type = value; } } 58 | [Alias("title")] 59 | public string Title { get { return _title; } set { _title = value; } } 60 | [Alias("country_id")] 61 | public string CountriesId { get { return _countriesId; } set { _countriesId = value; } } 62 | [Alias("started")] 63 | public DateTime Started { get { return _started; } set { _started = value; } } 64 | [Alias("anidb")] 65 | public int AniDB { get { return _anidb; } set { _anidb = value; } } 66 | [Alias("imdb")] 67 | public int Imdb { get { return _imdb; } set { _imdb = value; } } 68 | [Alias("tmdb")] 69 | public int Tmdb { get { return _tmdb; } set { _tmdb = value; } } 70 | [Alias("trakt")] 71 | public int Trakt { get { return _trakt; } set { _trakt = value; } } 72 | [Alias("tvdb")] 73 | public int Tvdb { get { return _tvdb; } set { _tvdb = value; } } 74 | [Alias("tvmaze")] 75 | public int TvMaze { get { return _tvmaze; } set { _tvmaze = value; } } 76 | [Alias("tvrage")] 77 | public int TvRage { get { return _tvrage; } set { _tvrage = value; } } 78 | [Alias("source")] 79 | public int Source { get { return _source; } set { _source = value; } } 80 | } 81 | [Alias("tv_episodes")] 82 | public class NZEDBTVEpisode 83 | { 84 | 85 | private int _id = 0; 86 | private int _videosId = 0; 87 | private int _series = 0; 88 | private int _episode = 0; 89 | private string _secomplete = String.Empty; 90 | private string _title = String.Empty; 91 | private DateTime _firstaired = DateTime.MinValue; 92 | private string _summary = String.Empty; 93 | 94 | [AutoIncrementAttribute] 95 | [PrimaryKey] 96 | [Alias("id")] 97 | public int Id { get { return _id; } set { _id = value; } } 98 | [Alias("videos_id")] 99 | public int VideosId { get { return _videosId; } set { _videosId = value; } } 100 | [Alias("series")] 101 | public int Series { get { return _series; } set { _series = value; } } 102 | [Alias("episode")] 103 | public int Episode { get { return _episode; } set { _episode = value; } } 104 | [Alias("se_complete")] 105 | public string SeComplete { get { return _secomplete; } set { _secomplete = value; } } 106 | [Alias("title")] 107 | public string Title { get { return _title; } set { _title = value; } } 108 | [Alias("firstaired")] 109 | public DateTime FirstAired { get { return _firstaired; } set { _firstaired = value; } } 110 | [Alias("summary")] 111 | public string Summary { get { return _summary; } set { _summary = value; } } 112 | } 113 | } 114 | -------------------------------------------------------------------------------- /scripts/FastNZB.Import/appsettings.sample.txt: -------------------------------------------------------------------------------- 1 | #copy this to appsettings.txt 2 | MySQL Server=127.0.0.1;Database=fastnzb;UID=root;Password=;SslMode=None 3 | BaseUrl https://localhost:5000 4 | NZBPath / 5 | ApiKey 123 6 | -------------------------------------------------------------------------------- /src/FastNZB.ServiceInterface/FallbackServices.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections; 3 | using System.Collections.Generic; 4 | using System.Linq; 5 | using System.IO; 6 | using System.IO.Compression; 7 | using System.Data; 8 | using ServiceStack; 9 | using ServiceStack.OrmLite; 10 | using ServiceStack.Data; 11 | using ServiceStack.Configuration; 12 | 13 | using FastNZB.ServiceModel.Types; 14 | 15 | using FastNZB.ServiceModel; 16 | 17 | namespace FastNZB.ServiceInterface 18 | { 19 | [FallbackRoute("/{Path*}")] 20 | [Route("/index.html")] 21 | public class Fallback 22 | { 23 | public string Path { get; set; } 24 | } 25 | 26 | public class FallBackService : Service 27 | { 28 | public TextFileSettings Settings { get; set; } 29 | public object Any(Fallback request) 30 | { 31 | return new HttpResult(new FileInfo("wwwroot/index.html")) { ContentType = "text/html" }; 32 | } 33 | } 34 | } -------------------------------------------------------------------------------- /src/FastNZB.ServiceInterface/FastNZB.ServiceInterface.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | netcoreapp2.0 5 | FastNZB.ServiceInterface 6 | FastNZB.ServiceInterface 7 | false 8 | false 9 | false 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | ..\lib\ServiceStack.dll 26 | 27 | 28 | ..\lib\ServiceStack.Client.dll 29 | 30 | 31 | ..\lib\ServiceStack.Common.dll 32 | 33 | 34 | ..\lib\ServiceStack.Interfaces.dll 35 | 36 | 37 | ..\lib\ServiceStack.OrmLite.dll 38 | 39 | 40 | ..\lib\ServiceStack.Server.dll 41 | 42 | 43 | ..\lib\ServiceStack.Text.dll 44 | 45 | 46 | 47 | 48 | -------------------------------------------------------------------------------- /src/FastNZB.ServiceInterface/FastNZBAuthRepo.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Web; 5 | using System.Data; 6 | 7 | using ServiceStack; 8 | using ServiceStack.Data; 9 | using ServiceStack.Auth; 10 | using ServiceStack.OrmLite; 11 | using ServiceStack.Configuration; 12 | 13 | using MailKit.Net.Smtp; 14 | using MimeKit; 15 | 16 | using FastNZB.ServiceModel.Types; 17 | using FastNZB.ServiceModel; 18 | 19 | namespace FastNZB 20 | { 21 | public class FastNZBOrmLiteAuthRepository 22 | : OrmLiteAuthRepository, IUserAuthRepository 23 | { 24 | protected IDbConnectionFactory dbFactory { get; set; } 25 | 26 | public FastNZBOrmLiteAuthRepository(IDbConnectionFactory dbFactory) 27 | : base(dbFactory) 28 | { 29 | this.dbFactory = dbFactory; 30 | } 31 | 32 | public override IUserAuth CreateUserAuth(IUserAuth newUser, string password) 33 | { 34 | var user = base.CreateUserAuth(newUser, password); 35 | 36 | using (var db = dbFactory.OpenDbConnection()) 37 | { 38 | var settings = new TextFileSettings("appsettings.txt"); 39 | var provider = new ApiKeyAuthProvider(); 40 | provider.KeySizeBytes = 32; 41 | var key = provider.GenerateApiKey(String.Empty, String.Empty, 32).Substring(0, 32); 42 | db.Save(new APIKey() 43 | { 44 | UserId = user.Id, 45 | RequestLimit = 2500, 46 | Key = key 47 | }); 48 | 49 | var mimeMessage = new MimeMessage(); 50 | mimeMessage.From.Add(new MailboxAddress(settings.GetString("EmailFromName"), settings.GetString("EmailFrom"))); 51 | mimeMessage.To.Add(new MailboxAddress(user.Email, user.Email)); 52 | mimeMessage.Subject = "Your api key"; 53 | var builder = new BodyBuilder(); 54 | builder.TextBody = 55 | "Your api key is: " + key + 56 | "\n\n" + 57 | "Support: " + settings.GetString("EmailFrom"); 58 | builder.HtmlBody = 59 | "Your api key is: " + key + 60 | "" + 61 | "Support: " + settings.GetString("EmailFrom"); 62 | 63 | mimeMessage.Body = builder.ToMessageBody(); 64 | using (var client = new SmtpClient()) 65 | { 66 | 67 | client.Connect(settings.GetString("SMTPHost"), 587, false); 68 | // Note: only needed if the SMTP server requires authentication 69 | // Error 5.5.1 Authentication 70 | client.Authenticate(settings.GetString("SMTPUser"), settings.GetString("SMTPPass")); 71 | client.Send(mimeMessage); 72 | client.Disconnect(true); 73 | 74 | } 75 | } 76 | 77 | return user; 78 | } 79 | 80 | public PasswordResetRequest ResetPassword(PasswordResetRequest request, IUserAuth user) 81 | { 82 | request.Id = Guid.NewGuid().ToString().Replace("-", ""); 83 | var settings = new TextFileSettings("appsettings.txt"); 84 | string subject = "Password Reset Requested"; 85 | string html = String.Format(String.Concat( 86 | "Hello {0},", 87 | "", 88 | "You recently requested to change your password at {1}", 89 | "", 90 | "You may use the following link to set your passowrd: {2}", 91 | "", 92 | "This link will be valid for 1 hour"), 93 | user.UserName, 94 | settings.Get("BaseUrl"), 95 | String.Format("{0}/reset/{1}", settings.Get("BaseUrl"), request.Id) 96 | ); 97 | 98 | var mimeMessage = new MimeMessage(); 99 | mimeMessage.From.Add(new MailboxAddress(settings.GetString("EmailFromName"), settings.GetString("EmailFrom"))); 100 | mimeMessage.To.Add(new MailboxAddress(user.Email, user.Email)); 101 | mimeMessage.Subject = subject; 102 | var builder = new BodyBuilder(); 103 | builder.HtmlBody = html; 104 | mimeMessage.Body = builder.ToMessageBody(); 105 | using (var client = new SmtpClient()) 106 | { 107 | 108 | client.Connect(settings.GetString("SMTPHost"), 587, false); 109 | // Note: only needed if the SMTP server requires authentication 110 | // Error 5.5.1 Authentication 111 | client.Authenticate(settings.GetString("SMTPUser"), settings.GetString("SMTPPass")); 112 | client.Send(mimeMessage); 113 | client.Disconnect(true); 114 | 115 | } 116 | return request; 117 | } 118 | 119 | } 120 | 121 | } -------------------------------------------------------------------------------- /src/FastNZB.ServiceInterface/FastNZBSession.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Runtime.Serialization; 4 | using ServiceStack; 5 | using ServiceStack.Auth; 6 | using ServiceStack.Configuration; 7 | using ServiceStack.Data; 8 | 9 | using FastNZB.ServiceModel.Types; 10 | 11 | namespace FastNZB.ServiceInterface 12 | { 13 | [DataContract] 14 | public class FastNZBUserSession : AuthUserSession 15 | { 16 | [DataMember] 17 | public string APIKey { get; set; } 18 | 19 | [DataMember] 20 | public long APIRequests { get; set; } 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/FastNZB.ServiceInterface/Properties/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Reflection; 2 | using System.Runtime.CompilerServices; 3 | using System.Runtime.InteropServices; 4 | 5 | // General Information about an assembly is controlled through the following 6 | // set of attributes. Change these attribute values to modify the information 7 | // associated with an assembly. 8 | [assembly: AssemblyConfiguration("")] 9 | [assembly: AssemblyCompany("")] 10 | [assembly: AssemblyProduct("RedisGeo.ServiceInterface")] 11 | [assembly: AssemblyTrademark("")] 12 | 13 | // Setting ComVisible to false makes the types in this assembly not visible 14 | // to COM components. If you need to access a type in this assembly from 15 | // COM, set the ComVisible attribute to true on that type. 16 | [assembly: ComVisible(false)] 17 | 18 | // The following GUID is for the ID of the typelib if this project is exposed to COM 19 | [assembly: Guid("e532e09d-d750-4a9f-b682-e7ba1508ea2c")] 20 | -------------------------------------------------------------------------------- /src/FastNZB.ServiceInterface/SearchServices.cs: -------------------------------------------------------------------------------- 1 | using System.Threading.Tasks; 2 | using System.Collections.Generic; 3 | using ServiceStack; 4 | using FastNZB.ServiceModel; 5 | using ServiceStack.Redis; 6 | using ServiceStack.Data; 7 | using ServiceStack.OrmLite; 8 | using FastNZB.ServiceModel.Types; 9 | 10 | namespace FastNZB.ServiceInterface 11 | { 12 | [Authenticate] 13 | public class SearchServices : Service 14 | { 15 | public object Any(FindNZB request) 16 | { 17 | return Db.Select("SELECT * FROM Title WHERE MATCH(Name) AGAINST(@term)", new { term = request.text }); 18 | } 19 | } 20 | } -------------------------------------------------------------------------------- /src/FastNZB.ServiceInterface/SessionServices.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using ServiceStack; 3 | using ServiceStack.Auth; 4 | using FastNZB.ServiceModel; 5 | using FastNZB.ServiceModel.Types; 6 | using System.Data; 7 | using ServiceStack.Data; 8 | using ServiceStack.OrmLite; 9 | using ServiceStack.Configuration; 10 | 11 | namespace FastNZB.ServiceInterface 12 | { 13 | [Authenticate] 14 | [ConnectionInfo(NamedConnection="ReadOnly")] 15 | public class SessionInfoServices : Service 16 | { 17 | public object Any(SessionInfo request) 18 | { 19 | var result = SessionAs(); 20 | var userId = int.Parse(result.UserAuthId); 21 | 22 | if (String.IsNullOrEmpty(result.APIKey)) { 23 | var apiKey = Db.Single(q=> q.UserId == userId); 24 | result.APIKey = apiKey != null ? apiKey.Key : ""; 25 | Request.SaveSession(result); 26 | } 27 | 28 | result.APIRequests = Db.Count(q=>q.UserId == userId && q.Date > DateTime.Now.AddDays(-1)); 29 | 30 | return result; 31 | } 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /src/FastNZB.ServiceInterface/UserServices.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using ServiceStack; 3 | using ServiceStack.Auth; 4 | using FastNZB.ServiceModel; 5 | using FastNZB.ServiceModel.Types; 6 | using FastNZB; 7 | using System.Data; 8 | using ServiceStack.Data; 9 | using ServiceStack.OrmLite; 10 | using ServiceStack.Configuration; 11 | 12 | namespace FastNZB.ServiceInterface 13 | { 14 | public class UserServices : Service 15 | { 16 | public IAuthRepository AuthRepo { get; set; } 17 | 18 | //Called when a password reset link is clicked. 19 | public object Get(PasswordResetRequest request) 20 | { 21 | //Display Change Password Screen 22 | var resetrequest = Cache.Get(request.Id); 23 | 24 | var response = new PasswordResetResponse(); 25 | response.Valid = !(resetrequest == null); 26 | response.Id = request.Id; 27 | 28 | return response; 29 | } 30 | 31 | //Called when the password request is initiated. 32 | public object Post(PasswordResetRequest request) 33 | { 34 | if (request.Email == null) 35 | { 36 | //this.Response.StatusCode = 400; 37 | return new HttpError(400, "you must provide an username."); 38 | } 39 | 40 | if (AuthRepo.GetUserAuthByUserName(request.Email) == null) 41 | { 42 | //this.Response.StatusCode = 400; 43 | return new HttpError(400, "user not registered."); 44 | } 45 | 46 | request = ((FastNZBOrmLiteAuthRepository)AuthRepo).ResetPassword(request, AuthRepo.GetUserAuthByUserName(request.Email)); 47 | 48 | Cache.Add(request.Id, request, new TimeSpan(1, 0, 0)); 49 | 50 | return new HttpResult("an email has been sent with a link to reset your password."); 51 | } 52 | 53 | public PasswordResetResponse Put(PasswordResetRequest request) 54 | { 55 | // VALIDATE 56 | 57 | //Changes the password 58 | var resetrequest = Cache.Get(request.Id); 59 | 60 | var response = new PasswordResetResponse(); 61 | if (resetrequest == null) 62 | { 63 | response.Valid = false; 64 | return response; 65 | } 66 | if (request.Email != resetrequest.Email) 67 | { 68 | response.Valid = false; 69 | return response; 70 | } 71 | else if (resetrequest == null) 72 | { 73 | response.Valid = false; 74 | return response; 75 | } 76 | else 77 | { 78 | response.Valid = true; 79 | } 80 | 81 | var existingUser = AuthRepo.GetUserAuthByUserName(resetrequest.Email); 82 | if (existingUser == null) 83 | { 84 | return new PasswordResetResponse() { Valid = false }; 85 | } 86 | 87 | AuthRepo.UpdateUserAuth(existingUser, existingUser, request.NewPassword); 88 | 89 | response.PasswordChanged = true; 90 | Cache.Remove(resetrequest.Id); 91 | return response; 92 | } 93 | } 94 | } 95 | -------------------------------------------------------------------------------- /src/FastNZB.ServiceModel/FastNZB.ServiceModel.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | netcoreapp2.0 5 | FastNZB.ServiceModel 6 | FastNZB.ServiceModel 7 | false 8 | false 9 | false 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | ..\lib\ServiceStack.Interfaces.dll 20 | 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /src/FastNZB.ServiceModel/FindNZBModels.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | using ServiceStack; 3 | using FastNZB.ServiceModel.Types; 4 | namespace FastNZB.ServiceModel 5 | { 6 | [Route("/api/search/{text}")] 7 | public class FindNZB : IReturn 8 | { 9 | public string text { get; set; } 10 | } 11 | 12 | [Route("/api/nzb/{Id}")] 13 | public class GetNZB 14 | { 15 | public string Id { get; set; } 16 | } 17 | 18 | [Route("/api/nzb/detail/{Id}")] 19 | public class GetNZBDetail { 20 | public string Id { get; set; } 21 | } 22 | 23 | [Route("/api/title/{Id}")] 24 | public class ListNZBs : IReturn> 25 | { 26 | public int Id { get; set; } 27 | } 28 | 29 | public class ListNZBResult { 30 | public int Id { get; set; } 31 | public string Name { get; set; } 32 | public long Size { get; set; } 33 | public string Guid { get; set; } 34 | public int _Days { get; set; } 35 | public int _Votes { get; set; } 36 | } 37 | 38 | [Route("/api/vote/{Id}")] 39 | public class SubmitVote { 40 | public int Id { get; set; } 41 | public int val { get; set; } 42 | } 43 | } -------------------------------------------------------------------------------- /src/FastNZB.ServiceModel/ImportNZBModels.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using ServiceStack; 4 | using FastNZB.ServiceModel.Types; 5 | using System.Runtime.Serialization; 6 | using ServiceStack.Web; 7 | 8 | namespace FastNZB.ServiceModel 9 | { 10 | [Route("/api/import", Verbs="POST")] 11 | public class ImportNZB 12 | { 13 | public string Key { get; set; } 14 | public int ReleaseId { get; set; } 15 | public int ImdbId { get; set; } 16 | public int VideoId { get; set; } 17 | public string Name { get; set; } 18 | public string Name1 { get; set; } 19 | public string Name2 { get; set; } 20 | public int Parts { get; set; } 21 | public long Size { get; set; } 22 | public string Guid { get; set; } 23 | public int GroupId { get; set; } 24 | public string NzbGuid { get; set; } 25 | public int TVEpisodeId { get; set; } 26 | public DateTime PostDate { get; set; } 27 | public string Data { get; set; } 28 | public int CategoryId { get; set; } 29 | public Video Video { get; set; } 30 | public TVEpisode TVEpisode { get; set; } 31 | public DateTime AddDate { get; set; } 32 | } 33 | 34 | /*[Route("/api/import", Verbs="POST")] 35 | public class ImportNZBs : IReturn 36 | { 37 | public List NZBs { get; set; } 38 | }*/ 39 | 40 | public class ImportNZBResponse { 41 | } 42 | 43 | public class UpdateNZB { 44 | public List NZBs { get; set; } 45 | } 46 | } -------------------------------------------------------------------------------- /src/FastNZB.ServiceModel/Properties/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Reflection; 2 | using System.Runtime.CompilerServices; 3 | using System.Runtime.InteropServices; 4 | 5 | // General Information about an assembly is controlled through the following 6 | // set of attributes. Change these attribute values to modify the information 7 | // associated with an assembly. 8 | [assembly: AssemblyConfiguration("")] 9 | [assembly: AssemblyCompany("")] 10 | [assembly: AssemblyProduct("RedisGeo.ServiceModel")] 11 | [assembly: AssemblyTrademark("")] 12 | 13 | // Setting ComVisible to false makes the types in this assembly not visible 14 | // to COM components. If you need to access a type in this assembly from 15 | // COM, set the ComVisible attribute to true on that type. 16 | [assembly: ComVisible(false)] 17 | 18 | // The following GUID is for the ID of the typelib if this project is exposed to COM 19 | [assembly: Guid("d6e47201-1cf1-48da-8b40-7418070ec783")] 20 | -------------------------------------------------------------------------------- /src/FastNZB.ServiceModel/RSS/Author.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | 3 | namespace FastNZB.ServiceModel.Rss 4 | { 5 | public class Author 6 | { 7 | public string Name { get; set; } 8 | public string Email { get; set; } 9 | } 10 | } -------------------------------------------------------------------------------- /src/FastNZB.ServiceModel/RSS/Item.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using FastNZB.ServiceModel.Types; 4 | 5 | namespace FastNZB.ServiceModel.Rss 6 | { 7 | public class Item 8 | { 9 | public Author Author { get; set; } 10 | public string Body { get; set; } 11 | public ICollection Categories { get; set; } = new List(); 12 | public Uri Comments { get; set; } 13 | public Uri Link { get; set; } 14 | public string Permalink { get; set; } 15 | public DateTime PublishDate { get; set; } 16 | public string Title { get; set; } 17 | public string Description { get; set; } 18 | public string Category { get; set; } 19 | public string Length { get; set; } 20 | public string CategoryId { get; set; } 21 | public NZBResult Result { get; set; } 22 | 23 | } 24 | } -------------------------------------------------------------------------------- /src/FastNZB.ServiceModel/SessionModels.cs: -------------------------------------------------------------------------------- 1 | using ServiceStack; 2 | 3 | namespace FastNZB.ServiceModel 4 | { 5 | [Route("/api/session-info")] 6 | public class SessionInfo { } 7 | } 8 | -------------------------------------------------------------------------------- /src/FastNZB.ServiceModel/Types/APIKey.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using ServiceStack.DataAnnotations; 3 | 4 | namespace FastNZB.ServiceModel.Types 5 | { 6 | public class APIKey { 7 | 8 | private int _id = 0; 9 | private int _userId = 0; 10 | private int _requests = 0; 11 | private int _requestLimit = 0; 12 | private string _key = String.Empty; 13 | 14 | [AutoIncrementAttribute] 15 | [PrimaryKey] 16 | public int Id { get { return _id; } set { _id = value; } } 17 | public int UserId { get { return _userId; } set { _userId = value; } } 18 | public int Requests { get { return _requests; } set { _requests = value;} } 19 | public int RequestLimit { get { return _requestLimit; } set { _requestLimit = value; } } 20 | public string Key { get { return _key; } set { _key = value; } } 21 | } 22 | } -------------------------------------------------------------------------------- /src/FastNZB.ServiceModel/Types/APIRequest.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using ServiceStack.DataAnnotations; 3 | 4 | namespace FastNZB.ServiceModel.Types 5 | { 6 | public class APIRequest { 7 | 8 | // no default values here simply because i'm lazy 9 | [AutoIncrementAttribute] 10 | [PrimaryKey] 11 | public long Id { get; set; } 12 | public int UserId { get; set; } 13 | public long APIKeyId { get; set; } 14 | public DateTime Date { get; set; } 15 | public string t { get; set; } 16 | [Alias("id_a")] 17 | public string id { get; set; } 18 | public string q { get; set; } 19 | public string vid { get; set; } 20 | public string tvdbid { get; set; } 21 | public string traktid { get; set; } 22 | public string rid { get; set; } 23 | public string tvmazeid { get; set; } 24 | public string imdbid { get; set; } 25 | public string tmdbid { get; set; } 26 | public string season { get; set; } 27 | public string ep { get; set; } 28 | public int maxage { get; set; } 29 | public int minsize { get; set; } 30 | public string cat { get; set; } 31 | public string group { get; set; } 32 | public int limit { get; set; } 33 | public int offset { get; set; } 34 | public string o { get; set; } 35 | public long results { get; set; } 36 | } 37 | } -------------------------------------------------------------------------------- /src/FastNZB.ServiceModel/Types/Category.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using ServiceStack.DataAnnotations; 3 | 4 | namespace FastNZB.ServiceModel.Types 5 | { 6 | public class Category 7 | { 8 | private int _id = 0; 9 | private string _title = String.Empty; 10 | private int _parentId = 0; 11 | 12 | [PrimaryKey] 13 | [Alias("id")] 14 | public int Id { get { return _id; } set { _id = value; } } 15 | [Alias("title")] 16 | public string Title { get { return _title; } set { _title = value; } } 17 | [Alias("parentid")] 18 | public int ParentId { get { return _parentId; } set { _parentId = value; } } 19 | 20 | public bool IsParent() { 21 | return this.ParentId == 0; 22 | } 23 | } 24 | } -------------------------------------------------------------------------------- /src/FastNZB.ServiceModel/Types/Count.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using ServiceStack.DataAnnotations; 3 | 4 | namespace FastNZB.ServiceModel.Types 5 | { 6 | public class Count 7 | { 8 | private int _categoryId = 0; 9 | private long _total = 0; 10 | 11 | [PrimaryKey] 12 | public int CategoryId { get { return _categoryId; } set { _categoryId = value; } } 13 | [Alias("Count")] 14 | public long Total { get { return _total; } set { _total = value; } } 15 | } 16 | } -------------------------------------------------------------------------------- /src/FastNZB.ServiceModel/Types/Download.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using ServiceStack.DataAnnotations; 3 | 4 | namespace FastNZB.ServiceModel.Types 5 | { 6 | public class Download 7 | { 8 | private int _id = 0; 9 | private int _apiKeyId = 0; 10 | private int _nzbId = 0; 11 | private string _ipAddress = String.Empty; 12 | 13 | [AutoIncrementAttribute] 14 | [PrimaryKey] 15 | public int Id { get { return _id; } set { _id = value; } } 16 | public int APIKeyId { get { return _apiKeyId; } set { _apiKeyId = value; } } 17 | public int NZBId { get { return _nzbId; } set { _nzbId = value; } } 18 | public string IPAddress { get { return _ipAddress; } set { _ipAddress = value; } } 19 | } 20 | } -------------------------------------------------------------------------------- /src/FastNZB.ServiceModel/Types/NZB.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using ServiceStack.DataAnnotations; 3 | using System.Collections.Generic; 4 | using System.Linq; 5 | 6 | namespace FastNZB.ServiceModel.Types 7 | { 8 | public class NZB 9 | { 10 | private int _id = 0; 11 | private int _titleId = 0; 12 | private int _imdbId = 0; 13 | private int _videoId = 0; 14 | private string _name = String.Empty; 15 | private int _parts = 0; 16 | private long _size = 0; 17 | private int _groupId = 0; 18 | private string _guid = String.Empty; 19 | private string _nzbGuid = String.Empty; 20 | private int _releaseId = 0; 21 | private int _tvEpisodeId = 0; 22 | private int _categoryId = 0; 23 | private DateTime _importDate = DateTime.Now; 24 | private DateTime _postDate = DateTime.MinValue; 25 | private DateTime _added = DateTime.MinValue; 26 | 27 | [AutoIncrementAttribute] 28 | [PrimaryKey] 29 | public int Id { get { return _id; } set { _id = value; } } 30 | [References(typeof(Title))] 31 | [Index] 32 | public int TitleId { get { return _titleId; } set { _titleId = value; } } 33 | [Index] 34 | public int ImdbId { get { return _imdbId; } set { _imdbId = value; } } 35 | [Index] 36 | public int VideoId { get { return _videoId; } set { _videoId = value; } } 37 | public string Name { get { return _name; } set { _name = value; } } 38 | public int Parts { get { return _parts; } set { _parts = value; } } 39 | public Int64 Size { get { return _size; } set { _size = value; } } 40 | [Index] 41 | public int GroupId { get { return _groupId; } set { _groupId = value; } } 42 | public string Guid { get { return _guid; } set { _guid = value; } } 43 | public string NzbGuid { get { return _nzbGuid; } set { _nzbGuid = value; } } 44 | [Index] 45 | public int ReleaseId { get { return _releaseId; } set { _releaseId = value; } } 46 | [Index] 47 | public int TVEpisodeId { get { return _tvEpisodeId; } set { _tvEpisodeId = value; } } 48 | [Index] 49 | public int CategoryId { get { return _categoryId; } set { _categoryId = value; } } 50 | public DateTime ImportDate { get { return _importDate; } set { _importDate = value; } } 51 | [Index] 52 | public DateTime PostDate { get { return _postDate; } set { _postDate = value; } } 53 | public DateTime Added { get { return _added; } set { _added = value; } } 54 | [Reference] 55 | public List Votes { get; set; } 56 | 57 | [Ignore] 58 | public int _Days { 59 | get 60 | { 61 | return PostDate != DateTime.MinValue ? (DateTime.Now - PostDate).Days : 0; 62 | } 63 | } 64 | 65 | [Ignore] 66 | public int _Votes { 67 | get 68 | { 69 | return this.Votes == null ? 0 : this.Votes.Sum(q=>q.Value); 70 | } 71 | } 72 | 73 | public string GetLink(string baseUrl, string apiKey, string i = "") { 74 | return String.Format("{0}/api?t=g&id={1}&apikey={2}&i={3}", 75 | baseUrl, 76 | this.Guid, 77 | apiKey, 78 | i 79 | ); 80 | } 81 | } 82 | } -------------------------------------------------------------------------------- /src/FastNZB.ServiceModel/Types/NZBResult.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using ServiceStack.DataAnnotations; 3 | 4 | namespace FastNZB.ServiceModel.Types 5 | { 6 | public class NZBResult : NZB { 7 | 8 | private int _season = 0; 9 | private int _episode = 0; 10 | private DateTime _tvAirDate = DateTime.MinValue; 11 | private int _tvdbId = 0; 12 | private int _tvRageId = 0; 13 | private int _tvMazeId = 0; 14 | private int _imdbId = 0; 15 | private string _categoryName = String.Empty; 16 | private string _groupName = String.Empty; 17 | 18 | [Alias("series")] 19 | public int Season { get { return _season; } set { _season = value; } } 20 | [Alias("episode")] 21 | public int Episode { get { return _episode; } set { _episode = value; } } 22 | [Alias("firstaired")] 23 | public DateTime TVAirDate { get { return _tvAirDate; } set { _tvAirDate = value; } } 24 | [Alias("tvdb")] 25 | public int TvdbId { get { return _tvdbId; } set { _tvdbId = value; } } 26 | [Alias("tvrage")] 27 | public int TvRageId { get { return _tvRageId; } set { _tvRageId = value;} } 28 | [Alias("tvmase")] 29 | public int TvMazeId { get { return _tvMazeId; } set { _tvMazeId = value; } } 30 | [Alias("imdb")] 31 | public new int ImdbId { get { return _imdbId; } set { _imdbId = value; } } 32 | [Alias("category_name")] 33 | public string CategoryName { get { return _categoryName; } set { _categoryName = value; } } 34 | [Alias("group_name")] 35 | public string GroupName { get { return _groupName; } set { _groupName = value; } } 36 | } 37 | } -------------------------------------------------------------------------------- /src/FastNZB.ServiceModel/Types/TVEpisode.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using ServiceStack.DataAnnotations; 3 | 4 | namespace FastNZB.ServiceModel.Types 5 | { 6 | public class TVEpisode { 7 | 8 | private int _id = 0; 9 | private int _videosId = 0; 10 | private int _series = 0; 11 | private int _episode = 0; 12 | private string _secomplete = String.Empty; 13 | private string _title = String.Empty; 14 | private DateTime _firstaired = DateTime.MinValue; 15 | private string _summary = String.Empty; 16 | 17 | //[AutoIncrementAttribute] 18 | [PrimaryKey] 19 | [Alias("id")] 20 | public int Id { get { return _id; } set { _id = value;} } 21 | [Alias("videos_id")] 22 | [Index] 23 | public int VideosId { get { return _videosId; } set { _videosId = value; } } 24 | [Alias("series")] 25 | [Index] 26 | public int Series { get { return _series; } set { _series = value; } } 27 | [Alias("episode")] 28 | [Index] 29 | public int Episode { get { return _episode; } set { _episode = value; } } 30 | [Index] 31 | [Alias("se_complete")] 32 | public string SeComplete { get { return _secomplete; } set { _secomplete = value; } } 33 | [Alias("title")] 34 | public string Title { get { return _title; } set { _title = value; } } 35 | [Alias("firstaired")] 36 | public DateTime FirstAired { get { return _firstaired; } set { _firstaired = value; } } 37 | [Alias("summary")] 38 | public string Summary { get { return _summary; } set { _summary = value; } } 39 | } 40 | } -------------------------------------------------------------------------------- /src/FastNZB.ServiceModel/Types/Title.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using ServiceStack.DataAnnotations; 3 | namespace FastNZB.ServiceModel.Types 4 | { 5 | public class Title 6 | { 7 | private int _id = 0; 8 | private string _name = String.Empty; 9 | private int _imdbId = 0; 10 | private int _tvEpisodeId = 0; 11 | private int _videoId = 0; 12 | private string _name1 = String.Empty; 13 | private string _name2 = String.Empty; 14 | 15 | [AutoIncrementAttribute] 16 | [PrimaryKey] 17 | public int Id { get { return _id; } set { _id = value; } } 18 | public string Name { get { return _name; } set { _name = value; } } 19 | [Index] 20 | public int ImdbId { get { return _imdbId; } set { _imdbId = value; } } 21 | [Index] 22 | public int TVEpisodeId { get { return _tvEpisodeId; } set { _tvEpisodeId = value; } } 23 | [Index] 24 | public int VideoId { get { return _videoId; } set { _videoId = value; } } 25 | public string Name1 { get { return _name1; } set { _name1 = value; } } 26 | public string Name2 { get { return _name2; } set { _name2 = value; } } 27 | } 28 | } -------------------------------------------------------------------------------- /src/FastNZB.ServiceModel/Types/Video.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using ServiceStack.DataAnnotations; 3 | 4 | namespace FastNZB.ServiceModel.Types 5 | { 6 | public class Video { 7 | 8 | private int _id = 0; 9 | private int _type = 0; 10 | private string _title = String.Empty; 11 | private string _countriesId = String.Empty; 12 | private DateTime _started = DateTime.MinValue; 13 | private int _anidb = 0; 14 | private int _imdb = 0; 15 | private int _tmdb = 0; 16 | private int _trakt = 0; 17 | private int _tvdb = 0; 18 | private int _tvmaze = 0; 19 | private int _tvrage = 0; 20 | private int _source = 0; 21 | 22 | 23 | //[AutoIncrementAttribute] 24 | [PrimaryKey] 25 | [Alias("id")] 26 | public int Id { get { return _id; } set { _id = value; } } 27 | [Alias("type")] 28 | public int Type { get { return _type; } set { _type = value; } } 29 | [Alias("title")] 30 | public string Title { get { return _title; } set { _title = value; } } 31 | [Alias("countries_id")] 32 | public string CountriesId { get { return _countriesId; } set { _countriesId = value; } } 33 | [Alias("started")] 34 | public DateTime Started { get { return _started; } set { _started = value; } } 35 | [Alias("anidb")] 36 | public int AniDB { get { return _anidb; } set { _anidb = value; } } 37 | [Alias("imdb")] 38 | public int Imdb { get { return _imdb; } set { _imdb = value; } } 39 | [Alias("tmdb")] 40 | public int Tmdb { get { return _tmdb; } set { _tmdb = value; } } 41 | [Alias("trakt")] 42 | public int Trakt { get { return _trakt; } set { _trakt = value; } } 43 | [Alias("tvdb")] 44 | public int Tvdb { get { return _tvdb; } set { _tvdb = value; } } 45 | [Alias("tvmaze")] 46 | public int TvMaze { get { return _tvmaze; } set { _tvmaze = value; } } 47 | [Alias("tvrage")] 48 | public int TvRage { get { return _tvrage; } set { _tvrage = value; } } 49 | [Alias("source")] 50 | public int Source { get { return _source; } set { _source = value; } } 51 | } 52 | } -------------------------------------------------------------------------------- /src/FastNZB.ServiceModel/Types/Vote.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using ServiceStack.DataAnnotations; 3 | 4 | namespace FastNZB.ServiceModel.Types 5 | { 6 | public class Vote 7 | { 8 | private int _id = 0; 9 | private int _nzbId = 0; 10 | private string _ipAddress = String.Empty; 11 | private int _value = 0; 12 | private int _userId = 0; 13 | 14 | [AutoIncrementAttribute] 15 | [PrimaryKey] 16 | public int Id { get { return _id; } set { _id = value; } } 17 | 18 | [References(typeof(NZB))] 19 | public int NZBId { get { return _nzbId; } set { _nzbId = value; } } 20 | public string IPAddress { get { return _ipAddress; } set { _ipAddress = value; } } 21 | public int Value { get { return _value; } set { _value = value; } } 22 | public int UserId { get { return _userId; } set { _userId = value; } } 23 | } 24 | } -------------------------------------------------------------------------------- /src/FastNZB.ServiceModel/UserModels.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Text; 5 | using System.Threading.Tasks; 6 | using ServiceStack; 7 | using FastNZB.ServiceModel.Types; 8 | 9 | namespace FastNZB.ServiceModel 10 | { 11 | [Route("/api/users/passwordreset/{Id}")] 12 | [Route("/api/users/passwordreset")] 13 | public class PasswordResetRequest 14 | { 15 | public string Email { get; set; } 16 | public string Id { get; set; } 17 | public string NewPassword { get; set; } 18 | } 19 | 20 | public class PasswordResetResponse 21 | { 22 | public string Id { get; set; } 23 | public bool PasswordChanged { get; set; } 24 | public bool Valid { get; set; } 25 | } 26 | 27 | } 28 | -------------------------------------------------------------------------------- /src/FastNZB/.editorconfig: -------------------------------------------------------------------------------- 1 | # @AngularClass 2 | # http://editorconfig.org 3 | 4 | root = true 5 | 6 | [*] 7 | charset = utf-8 8 | indent_style = space 9 | indent_size = 2 10 | end_of_line = lf 11 | insert_final_newline = true 12 | trim_trailing_whitespace = true 13 | 14 | [*.md] 15 | insert_final_newline = false 16 | trim_trailing_whitespace = false 17 | -------------------------------------------------------------------------------- /src/FastNZB/.nvmrc: -------------------------------------------------------------------------------- 1 | lts/* 2 | -------------------------------------------------------------------------------- /src/FastNZB/AppHost.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | using System.IO; 3 | using Funq; 4 | using System.Linq; 5 | using ServiceStack; 6 | using ServiceStack.IO; 7 | using ServiceStack.VirtualPath; 8 | using ServiceStack.Configuration; 9 | using ServiceStack.OrmLite; 10 | using ServiceStack.Data; 11 | using ServiceStack.Text; 12 | using System.Configuration; 13 | using ServiceStack.Redis; 14 | using ServiceStack.Auth; 15 | using ServiceStack.Caching; 16 | 17 | using FastNZB.ServiceInterface; 18 | using FastNZB.ServiceModel.Types; 19 | 20 | namespace FastNZB 21 | { 22 | public class AppHost : AppHostBase 23 | { 24 | /// 25 | /// Configure your ServiceStack AppHost singleton instance: 26 | /// Call base constructor with App Name and assembly where Service classes are located 27 | /// 28 | public AppHost() : base("FastNZB", typeof(SearchServices).Assembly) 29 | { 30 | AppSettings = new MultiAppSettings( 31 | new TextFileSettings("appsettings.txt"), 32 | new EnvironmentVariableSettings(), 33 | new AppSettings()); 34 | } 35 | 36 | public override void Configure(Container container) 37 | { 38 | // ServiceStack config 39 | SetConfig(new HostConfig() { 40 | //HandlerFactoryPath = "/api", 41 | DebugMode = true, 42 | DefaultRedirectPath = "index.html", 43 | StrictMode = false 44 | }); 45 | 46 | // register app settings in container for use later 47 | container.Register(new TextFileSettings("appsettings.txt")); 48 | 49 | // master db 50 | var dbFactory = new OrmLiteConnectionFactory(AppSettings.Get("MySQL"), MySqlDialect.Provider); 51 | container.Register(dbFactory); 52 | 53 | // read-only db 54 | dbFactory.RegisterConnection("ReadOnly", AppSettings.Get("MySQLRead"), MySqlDialect.Provider); 55 | 56 | // init tables if they don't exist 57 | using (var db = dbFactory.OpenDbConnection()) 58 | { 59 | db.CreateTableIfNotExists(); 60 | db.CreateTableIfNotExists(); 61 | db.CreateTableIfNotExists(); 62 | db.CreateTableIfNotExists(); 63 | db.CreateTableIfNotExists(); 64 | db.CreateTableIfNotExists(); 65 | db.CreateTableIfNotExists(); 66 | db.CreateTableIfNotExists(); 67 | db.CreateTableIfNotExists(); 68 | db.CreateTableIfNotExists(); 69 | } 70 | 71 | // auto query is used for paging/querying titles 72 | Plugins.Add(new AutoQueryFeature { MaxLimit = 100 }); 73 | 74 | // configure redis as cache 75 | string redisHost = AppSettings.Get("Redis", defaultValue: "localhost"); 76 | var redisClient = new PooledRedisClientManager(new string[] { redisHost }); 77 | var cacheClient = new RedisClientManagerCacheClient(redisClient); 78 | container.Register(cacheClient); 79 | cacheClient.InitSchema(); 80 | 81 | // register auth repo 82 | var authRepo = new FastNZBOrmLiteAuthRepository(dbFactory); 83 | container.Register(authRepo); 84 | authRepo.InitSchema(); 85 | 86 | Plugins.Add(new AuthFeature(() => new FastNZBUserSession(), 87 | new IAuthProvider[] { 88 | new CredentialsAuthProvider(), //HTML Form post of UserName/Password credentials 89 | }) 90 | { 91 | HtmlRedirect = null, 92 | IncludeRegistrationService = false, 93 | MaxLoginAttempts = 5,//appSettings.Get("MaxLoginAttempts", 5), 94 | IncludeAssignRoleServices = false, 95 | ValidateUniqueEmails = false, 96 | ValidateUniqueUserNames = false, 97 | }); 98 | 99 | Plugins.Add(new RegistrationFeature() { 100 | AtRestPath = "/api/register" 101 | }); 102 | } 103 | } 104 | } 105 | -------------------------------------------------------------------------------- /src/FastNZB/FastNZB.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | netcoreapp2.0 5 | true 6 | FastNZB 7 | Exe 8 | FastNZB 9 | 10 | 11 | 12 | 13 | PreserveNewest 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | true 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | ..\lib\ServiceStack.dll 40 | 41 | 42 | ..\lib\ServiceStack.Client.dll 43 | 44 | 45 | ..\lib\ServiceStack.Common.dll 46 | 47 | 48 | ..\lib\ServiceStack.Interfaces.dll 49 | 50 | 51 | ..\lib\ServiceStack.Mvc.dll 52 | 53 | 54 | ..\lib\ServiceStack.OrmLite.dll 55 | 56 | 57 | ..\lib\ServiceStack.OrmLite.MySql.dll 58 | 59 | 60 | ..\lib\ServiceStack.Redis.dll 61 | 62 | 63 | ..\lib\ServiceStack.Server.dll 64 | 65 | 66 | ..\lib\ServiceStack.Text.dll 67 | 68 | 69 | 70 | 71 | 72 | Always 73 | 74 | 75 | 76 | 77 | 78 | PreserveNewest 79 | 80 | 81 | 82 | 83 | -------------------------------------------------------------------------------- /src/FastNZB/LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2015-2016 AngularClass LLC 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | 23 | -------------------------------------------------------------------------------- /src/FastNZB/Program.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.IO; 4 | using System.Linq; 5 | using System.Threading.Tasks; 6 | using Microsoft.AspNetCore.Hosting; 7 | using Microsoft.Extensions.Configuration; 8 | 9 | namespace FastNZB 10 | { 11 | public class Program 12 | { 13 | public static void Main(string[] args) 14 | { 15 | var config = new ConfigurationBuilder() 16 | .SetBasePath(Directory.GetCurrentDirectory()) 17 | .AddEnvironmentVariables() 18 | .Build(); 19 | 20 | var host = new WebHostBuilder() 21 | .UseConfiguration(config) 22 | .UseKestrel() 23 | .UseContentRoot(Directory.GetCurrentDirectory()) 24 | .UseIISIntegration() 25 | .UseStartup() 26 | .Build(); 27 | 28 | host.Run(); 29 | } 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /src/FastNZB/Properties/launchSettings.json: -------------------------------------------------------------------------------- 1 | { 2 | "iisSettings": { 3 | "windowsAuthentication": false, 4 | "anonymousAuthentication": true, 5 | "iisExpress": { 6 | "applicationUrl": "http://localhost:57573/", 7 | "sslPort": 0 8 | } 9 | }, 10 | "profiles": { 11 | "IIS Express": { 12 | "commandName": "IISExpress", 13 | "launchBrowser": true, 14 | "environmentVariables": { 15 | "ASPNETCORE_ENVIRONMENT": "Development" 16 | } 17 | }, 18 | "RedisGeo": { 19 | "commandName": "Project", 20 | "launchBrowser": true, 21 | "launchUrl": "http://localhost:5000", 22 | "environmentVariables": { 23 | "ASPNETCORE_ENVIRONMENT": "Development" 24 | } 25 | } 26 | } 27 | } -------------------------------------------------------------------------------- /src/FastNZB/Startup.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Threading.Tasks; 5 | using Microsoft.AspNetCore.Builder; 6 | using Microsoft.AspNetCore.Hosting; 7 | using Microsoft.AspNetCore.Http; 8 | using Microsoft.Extensions.DependencyInjection; 9 | using Microsoft.Extensions.Logging; 10 | using Microsoft.Extensions.Configuration; 11 | using ServiceStack; 12 | using ServiceStack.Configuration; 13 | 14 | namespace FastNZB 15 | { 16 | public class Startup 17 | { 18 | public IConfigurationRoot Configuration { get; set; } 19 | 20 | // This method gets called by the runtime. Use this method to add services to the container. 21 | // For more information on how to configure your application, visit https://go.microsoft.com/fwlink/?LinkID=398940 22 | public void ConfigureServices(IServiceCollection services) 23 | { 24 | 25 | } 26 | 27 | // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. 28 | public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory, IApplicationLifetime lifetime) 29 | { 30 | 31 | var builder = new ConfigurationBuilder() 32 | .SetBasePath(env.ContentRootPath) 33 | .AddEnvironmentVariables(); 34 | 35 | Configuration = builder.Build(); 36 | 37 | loggerFactory.AddConsole(); 38 | 39 | if (env.IsDevelopment()) 40 | { 41 | app.UseDeveloperExceptionPage(); 42 | } 43 | 44 | 45 | app.UseServiceStack(new AppHost()); 46 | } 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /src/FastNZB/appsettings.sample.txt: -------------------------------------------------------------------------------- 1 | #copy to appsettings.txt 2 | MySQL Server=127.0.0.1;Database=fastnzb;UID=root;Password=;SslMode=None 3 | MySQLRead Server=127.0.0.1;Database=fastnzb;UID=root;Password=;SslMode=None 4 | AWS_ACCESS_KEY 123 5 | AWS_SECRET_KEY 123 6 | S3BucketName fastnzb 7 | Redis 127.0.0.1 8 | BaseUrl https://localhost:5000 9 | FSPath / 10 | SMTPHost email-smtp.us-east-1.amazonaws.com 11 | SMTPUser 123 12 | SMTPPass 123 13 | EmailFromName fastNZB 14 | EmailFrom test@domain.local 15 | -------------------------------------------------------------------------------- /src/FastNZB/config/empty.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | NgProbeToken: {}, 3 | HmrState: function() {}, 4 | _createConditionalRootRenderer: function(rootRenderer, extraTokens, coreTokens) { 5 | return rootRenderer; 6 | }, 7 | __platform_browser_private__: {} 8 | }; 9 | -------------------------------------------------------------------------------- /src/FastNZB/config/github-deploy/index.js: -------------------------------------------------------------------------------- 1 | const execSync = require('child_process').execSync; 2 | /** 3 | * Used to merge webpack configs. 4 | */ 5 | const webpackMerge = require('webpack-merge'); // used to merge webpack configs 6 | const HtmlWebpackPlugin = require('html-webpack-plugin'); 7 | const helpers = require('../helpers'); 8 | 9 | const REPO_NAME_RE = /Push {2}URL: ((git@github\.com:)|(https:\/\/github\.com\/)).+\/(.+)\.git/; 10 | 11 | function getWebpackConfigModule(options) { 12 | if (options.githubDev) { 13 | return require('../webpack.dev.js'); 14 | } else if (options.githubProd) { 15 | return require('../webpack.prod.js'); 16 | } else { 17 | throw new Error('Invalid compile option.'); 18 | } 19 | } 20 | 21 | function getRepoName(remoteName) { 22 | remoteName = remoteName || 'origin'; 23 | 24 | var stdout = execSync('git remote show ' + remoteName), 25 | match = REPO_NAME_RE.exec(stdout); 26 | 27 | if (!match) { 28 | throw new Error('Could not find a repository on remote ' + remoteName); 29 | } else { 30 | return match[4]; 31 | } 32 | } 33 | 34 | function stripTrailing(str, char) { 35 | 36 | if (str[0] === char) { 37 | str = str.substr(1); 38 | } 39 | 40 | if (str.substr(-1) === char) { 41 | str = str.substr(0, str.length - 1); 42 | } 43 | 44 | return str; 45 | } 46 | 47 | /** 48 | * Given a string remove trailing slashes and adds 1 slash at the end of the string. 49 | * 50 | * Example: 51 | * safeUrl('/value/') 52 | * // 'value/' 53 | * 54 | * @param url 55 | * @returns {string} 56 | */ 57 | function safeUrl(url) { 58 | const stripped = stripTrailing(url || '', '/'); 59 | return stripped ? stripped + '/' : ''; 60 | } 61 | 62 | function replaceHtmlWebpackPlugin(plugins, ghRepoName) { 63 | for (var i=0; i tags for 'apple-touch-icon' (AKA Web Clips). 20 | */ 21 | /*{ rel: 'apple-touch-icon', sizes: '57x57', href: '/assets/icon/apple-icon-57x57.png' }, 22 | { rel: 'apple-touch-icon', sizes: '60x60', href: '/assets/icon/apple-icon-60x60.png' }, 23 | { rel: 'apple-touch-icon', sizes: '72x72', href: '/assets/icon/apple-icon-72x72.png' }, 24 | { rel: 'apple-touch-icon', sizes: '76x76', href: '/assets/icon/apple-icon-76x76.png' }, 25 | { rel: 'apple-touch-icon', sizes: '114x114', href: '/assets/icon/apple-icon-114x114.png' }, 26 | { rel: 'apple-touch-icon', sizes: '120x120', href: '/assets/icon/apple-icon-120x120.png' }, 27 | { rel: 'apple-touch-icon', sizes: '144x144', href: '/assets/icon/apple-icon-144x144.png' }, 28 | { rel: 'apple-touch-icon', sizes: '152x152', href: '/assets/icon/apple-icon-152x152.png' }, 29 | { rel: 'apple-touch-icon', sizes: '180x180', href: '/assets/icon/apple-icon-180x180.png' },*/ 30 | 31 | /** 32 | * tags for android web app icons 33 | */ 34 | /*{ rel: 'icon', type: 'image/png', sizes: '192x192', href: '/assets/icon/android-icon-192x192.png' },*/ 35 | 36 | /** 37 | * tags for favicons 38 | */ 39 | /*{ rel: 'icon', type: 'image/png', sizes: '32x32', href: '/assets/icon/favicon-32x32.png' }, 40 | { rel: 'icon', type: 'image/png', sizes: '96x96', href: '/assets/icon/favicon-96x96.png' }, 41 | { rel: 'icon', type: 'image/png', sizes: '16x16', href: '/assets/icon/favicon-16x16.png' },*/ 42 | 43 | /** 44 | * tags for a Web App Manifest 45 | */ 46 | /*{ rel: 'manifest', href: '/assets/manifest.json' }*/ 47 | // ], 48 | // meta: [ 49 | /*{ name: 'msapplication-TileColor', content: '#00bcd4' }, 50 | { name: 'msapplication-TileImage', content: '/assets/icon/ms-icon-144x144.png', '=content': true }, 51 | { name: 'theme-color', content: '#00bcd4' }*/ 52 | // ] 53 | }; 54 | -------------------------------------------------------------------------------- /src/FastNZB/config/helpers.js: -------------------------------------------------------------------------------- 1 | /** 2 | * @author: @AngularClass 3 | */ 4 | var path = require('path'); 5 | 6 | const EVENT = process.env.npm_lifecycle_event || ''; 7 | 8 | /** 9 | * Helper functions. 10 | */ 11 | var ROOT = path.resolve(__dirname, '..'); 12 | 13 | function hasProcessFlag(flag) { 14 | return process.argv.join('').indexOf(flag) > -1; 15 | } 16 | 17 | function hasNpmFlag(flag) { 18 | return EVENT.includes(flag); 19 | } 20 | 21 | function isWebpackDevServer() { 22 | return process.argv[1] && !! (/webpack-dev-server/.exec(process.argv[1])); 23 | } 24 | 25 | var root = path.join.bind(path, ROOT); 26 | 27 | exports.hasProcessFlag = hasProcessFlag; 28 | exports.hasNpmFlag = hasNpmFlag; 29 | exports.isWebpackDevServer = isWebpackDevServer; 30 | exports.root = root; 31 | -------------------------------------------------------------------------------- /src/FastNZB/config/html-elements-plugin/index.js: -------------------------------------------------------------------------------- 1 | function HtmlElementsPlugin(locations) { 2 | this.locations = locations; 3 | } 4 | 5 | HtmlElementsPlugin.prototype.apply = function(compiler) { 6 | var self = this; 7 | compiler.plugin('compilation', function(compilation) { 8 | compilation.options.htmlElements = compilation.options.htmlElements || {}; 9 | 10 | compilation.plugin('html-webpack-plugin-before-html-generation', function(htmlPluginData, callback) { 11 | const locations = self.locations; 12 | 13 | if (locations) { 14 | const publicPath = htmlPluginData.assets.publicPath; 15 | 16 | Object.getOwnPropertyNames(locations).forEach(function(loc) { 17 | compilation.options.htmlElements[loc] = getHtmlElementString(locations[loc], publicPath); 18 | }); 19 | } 20 | 21 | 22 | callback(null, htmlPluginData); 23 | }); 24 | }); 25 | 26 | }; 27 | 28 | const RE_ENDS_WITH_BS = /\/$/; 29 | 30 | /** 31 | * Create an HTML tag with attributes from a map. 32 | * 33 | * Example: 34 | * createTag('link', { rel: "manifest", href: "/assets/manifest.json" }) 35 | * // 36 | * @param tagName The name of the tag 37 | * @param attrMap A Map of attribute names (keys) and their values. 38 | * @param publicPath a path to add to eh start of static asset url 39 | * @returns {string} 40 | */ 41 | function createTag(tagName, attrMap, publicPath) { 42 | publicPath = publicPath || ''; 43 | 44 | /** 45 | * Add trailing slash if we have a publicPath and it doesn't have one. 46 | */ 47 | if (publicPath && !RE_ENDS_WITH_BS.test(publicPath)) { 48 | publicPath += '/'; 49 | } 50 | 51 | const attributes = Object.getOwnPropertyNames(attrMap) 52 | .filter(function(name) { return name[0] !== '='; } ) 53 | .map(function(name) { 54 | var value = attrMap[name]; 55 | 56 | if (publicPath) { 57 | /** 58 | * Check if we have explicit instruction, use it if so (e.g: =herf: false) 59 | * if no instruction, use public path if it's href attribute. 60 | */ 61 | const usePublicPath = attrMap.hasOwnProperty('=' + name) ? !!attrMap['=' + name] : name === 'href'; 62 | 63 | if (usePublicPath) { 64 | /** 65 | * Remove a starting trailing slash if the value has one so we wont have // 66 | */ 67 | value = publicPath + (value[0] === '/' ? value.substr(1) : value); 68 | } 69 | } 70 | 71 | return `${name}="${value}"`; 72 | }); 73 | 74 | const closingTag = tagName === 'script' ? '' : ''; 75 | 76 | return `<${tagName} ${attributes.join(' ')}>${closingTag}`; 77 | } 78 | 79 | /** 80 | * Returns a string representing all html elements defined in a data source. 81 | * 82 | * Example: 83 | * 84 | * const ds = { 85 | * link: [ 86 | * { rel: "apple-touch-icon", sizes: "57x57", href: "/assets/icon/apple-icon-57x57.png" } 87 | * ], 88 | * meta: [ 89 | * { name: "msapplication-TileColor", content: "#00bcd4" } 90 | * ] 91 | * } 92 | * 93 | * getHeadTags(ds); 94 | * // "" 95 | * "" 96 | * 97 | * @returns {string} 98 | */ 99 | function getHtmlElementString(dataSource, publicPath) { 100 | return Object.getOwnPropertyNames(dataSource) 101 | .map(function(name) { 102 | if (Array.isArray(dataSource[name])) { 103 | return dataSource[name].map(function(attrs) { return createTag(name, attrs, publicPath); } ); 104 | } else { 105 | return [ createTag(name, dataSource[name], publicPath) ]; 106 | } 107 | }) 108 | .reduce(function(arr, curr) { 109 | return arr.concat(curr); 110 | }, []) 111 | .join('\n\t'); 112 | } 113 | module.exports = HtmlElementsPlugin; 114 | -------------------------------------------------------------------------------- /src/FastNZB/config/karma.conf.js: -------------------------------------------------------------------------------- 1 | /** 2 | * @author: @AngularClass 3 | */ 4 | 5 | module.exports = function (config) { 6 | var testWebpackConfig = require('./webpack.test.js')({ env: 'test' }); 7 | 8 | var configuration = { 9 | 10 | /** 11 | * Base path that will be used to resolve all patterns (e.g. files, exclude). 12 | */ 13 | basePath: '', 14 | 15 | /** 16 | * Frameworks to use 17 | * 18 | * available frameworks: https://npmjs.org/browse/keyword/karma-adapter 19 | */ 20 | frameworks: ['jasmine'], 21 | 22 | /** 23 | * List of files to exclude. 24 | */ 25 | exclude: [], 26 | 27 | client: { 28 | captureConsole: false 29 | }, 30 | 31 | /** 32 | * List of files / patterns to load in the browser 33 | * 34 | * we are building the test environment in ./spec-bundle.js 35 | */ 36 | files: [ 37 | { pattern: './config/spec-bundle.js', watched: false }, 38 | { pattern: './src/assets/**/*', watched: false, included: false, served: true, nocache: false } 39 | ], 40 | 41 | /** 42 | * By default all assets are served at http://localhost:[PORT]/base/ 43 | */ 44 | proxies: { 45 | "/assets/": "/base/src/assets/" 46 | }, 47 | 48 | /** 49 | * Preprocess matching files before serving them to the browser 50 | * available preprocessors: https://npmjs.org/browse/keyword/karma-preprocessor 51 | */ 52 | preprocessors: { './config/spec-bundle.js': ['coverage', 'webpack', 'sourcemap'] }, 53 | 54 | /** 55 | * Webpack Config at ./webpack.test.js 56 | */ 57 | webpack: testWebpackConfig, 58 | 59 | coverageReporter: { 60 | type: 'in-memory' 61 | }, 62 | 63 | remapCoverageReporter: { 64 | 'text-summary': null, 65 | json: './coverage/coverage.json', 66 | html: './coverage/html' 67 | }, 68 | 69 | /** 70 | * Webpack please don't spam the console when running in karma! 71 | */ 72 | webpackMiddleware: { 73 | /** 74 | * webpack-dev-middleware configuration 75 | * i.e. 76 | */ 77 | noInfo: true, 78 | /** 79 | * and use stats to turn off verbose output 80 | */ 81 | stats: { 82 | /** 83 | * options i.e. 84 | */ 85 | chunks: false 86 | } 87 | }, 88 | 89 | /** 90 | * Test results reporter to use 91 | * 92 | * possible values: 'dots', 'progress' 93 | * available reporters: https://npmjs.org/browse/keyword/karma-reporter 94 | */ 95 | reporters: ['mocha', 'coverage', 'remap-coverage'], 96 | 97 | /** 98 | * Web server port. 99 | */ 100 | port: 9876, 101 | 102 | /** 103 | * enable / disable colors in the output (reporters and logs) 104 | */ 105 | colors: true, 106 | 107 | /** 108 | * Level of logging 109 | * possible values: config.LOG_DISABLE || config.LOG_ERROR || config.LOG_WARN || config.LOG_INFO || config.LOG_DEBUG 110 | */ 111 | logLevel: config.LOG_WARN, 112 | 113 | /** 114 | * enable / disable watching file and executing tests whenever any file changes 115 | */ 116 | autoWatch: false, 117 | 118 | /** 119 | * start these browsers 120 | * available browser launchers: https://npmjs.org/browse/keyword/karma-launcher 121 | */ 122 | browsers: [ 123 | 'Chrome' 124 | ], 125 | 126 | customLaunchers: { 127 | ChromeTravisCi: { 128 | base: 'Chrome', 129 | flags: ['--no-sandbox'] 130 | } 131 | }, 132 | 133 | /** 134 | * Continuous Integration mode 135 | * if true, Karma captures browsers, runs the tests and exits 136 | */ 137 | singleRun: true 138 | }; 139 | 140 | if (process.env.TRAVIS) { 141 | configuration.browsers = [ 142 | 'ChromeTravisCi' 143 | ]; 144 | } 145 | 146 | config.set(configuration); 147 | }; 148 | -------------------------------------------------------------------------------- /src/FastNZB/config/protractor.conf.js: -------------------------------------------------------------------------------- 1 | /** 2 | * @author: @AngularClass 3 | */ 4 | 5 | require('ts-node/register'); 6 | var helpers = require('./helpers'); 7 | 8 | exports.config = { 9 | baseUrl: 'http://localhost:3000/', 10 | 11 | /** 12 | * Use `npm run e2e` 13 | */ 14 | specs: [ 15 | helpers.root('src/**/**.e2e.ts'), 16 | helpers.root('src/**/*.e2e.ts') 17 | ], 18 | exclude: [], 19 | 20 | framework: 'jasmine2', 21 | 22 | allScriptsTimeout: 110000, 23 | 24 | jasmineNodeOpts: { 25 | showTiming: true, 26 | showColors: true, 27 | isVerbose: false, 28 | includeStackTrace: false, 29 | defaultTimeoutInterval: 400000 30 | }, 31 | directConnect: true, 32 | 33 | capabilities: { 34 | 'browserName': 'chrome', 35 | 'chromeOptions': { 36 | 'args': ['show-fps-counter=true'] 37 | } 38 | }, 39 | 40 | onPrepare: function() { 41 | browser.ignoreSynchronization = true; 42 | }, 43 | 44 | /** 45 | * Angular 2 configuration 46 | * 47 | * useAllAngular2AppRoots: tells Protractor to wait for any angular2 apps on the page instead of just the one matching 48 | * `rootEl` 49 | */ 50 | useAllAngular2AppRoots: true, 51 | 52 | SELENIUM_PROMISE_MANAGER: false, 53 | }; 54 | -------------------------------------------------------------------------------- /src/FastNZB/config/resource-override.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fastnzb/fastNZB/ff0592bab6d3ffefb9a6a5fed6d5221eaa86261a/src/FastNZB/config/resource-override.js -------------------------------------------------------------------------------- /src/FastNZB/config/spec-bundle.js: -------------------------------------------------------------------------------- 1 | /** 2 | * @author: @AngularClass 3 | */ 4 | 5 | /** 6 | * When testing with webpack and ES6, we have to do some extra 7 | * things to get testing to work right. Because we are gonna write tests 8 | * in ES6 too, we have to compile those as well. That's handled in 9 | * karma.conf.js with the karma-webpack plugin. This is the entry 10 | * file for webpack test. Just like webpack will create a bundle.js 11 | * file for our client, when we run test, it will compile and bundle them 12 | * all here! Crazy huh. So we need to do some setup 13 | */ 14 | Error.stackTraceLimit = Infinity; 15 | 16 | require('core-js/es6'); 17 | require('core-js/es7/reflect'); 18 | 19 | require('zone.js/dist/zone'); 20 | require('zone.js/dist/long-stack-trace-zone'); 21 | require('zone.js/dist/proxy'); // since zone.js 0.6.15 22 | require('zone.js/dist/sync-test'); 23 | require('zone.js/dist/jasmine-patch'); // put here since zone.js 0.6.14 24 | require('zone.js/dist/async-test'); 25 | require('zone.js/dist/fake-async-test'); 26 | 27 | /** 28 | * RxJS 29 | */ 30 | require('rxjs/Rx'); 31 | 32 | var testing = require('@angular/core/testing'); 33 | var browser = require('@angular/platform-browser-dynamic/testing'); 34 | 35 | testing.TestBed.initTestEnvironment( 36 | browser.BrowserDynamicTestingModule, 37 | browser.platformBrowserDynamicTesting() 38 | ); 39 | 40 | /** 41 | * Ok, this is kinda crazy. We can use the context method on 42 | * require that webpack created in order to tell webpack 43 | * what files we actually want to require or import. 44 | * Below, context will be a function/object with file names as keys. 45 | * Using that regex we are saying look in ../src then find 46 | * any file that ends with spec.ts and get its path. By passing in true 47 | * we say do this recursively 48 | */ 49 | var testContext = require.context('../src', true, /\.spec\.ts/); 50 | 51 | /** 52 | * Get all the files, for each file, call the context function 53 | * that will require the file and load it up here. Context will 54 | * loop and require those spec files here 55 | */ 56 | function requireAll(requireContext) { 57 | return requireContext.keys().map(requireContext); 58 | } 59 | 60 | /** 61 | * Requires and returns all modules that match 62 | */ 63 | var modules = requireAll(testContext); 64 | -------------------------------------------------------------------------------- /src/FastNZB/config/webpack.github-deploy.js: -------------------------------------------------------------------------------- 1 | /** 2 | * @author: @AngularClass 3 | */ 4 | const fs = require('fs'); 5 | const path = require('path'); 6 | const helpers = require('./helpers'); 7 | const ghDeploy = require('./github-deploy'); 8 | const webpackMerge = require('webpack-merge'); // used to merge webpack configs 9 | 10 | /** 11 | * Webpack Constants 12 | */ 13 | const GIT_REMOTE_NAME = 'origin'; 14 | const COMMIT_MESSAGE = 'Updates'; 15 | const GH_REPO_NAME = ghDeploy.getRepoName(GIT_REMOTE_NAME); 16 | 17 | module.exports = function (options) { 18 | const webpackConfigFactory = ghDeploy.getWebpackConfigModule(options); // the settings that are common to prod and dev 19 | const webpackConfig = webpackConfigFactory(options); 20 | 21 | /** 22 | * Replace the instance of HtmlWebpackPlugin with an updated one. 23 | */ 24 | ghDeploy.replaceHtmlWebpackPlugin(webpackConfig.plugins, GH_REPO_NAME); 25 | 26 | return webpackMerge(webpackConfig, { 27 | output: { 28 | /** 29 | * The public path is set to the REPO name. 30 | * 31 | * `HtmlElementsPlugin` will add it to all resources url's created by it. 32 | * `HtmlWebpackPlugin` will add it to all webpack bundels/chunks. 33 | * 34 | * In theory publicPath shouldn't be used since the browser should automatically prefix the 35 | * `baseUrl` into all URLs, however this is not the case when the URL is absolute (start with /) 36 | * 37 | * It's important to prefix & suffix the repo name with a slash (/). 38 | * Prefixing so every resource will be absolute (otherwise it will be url.com/repoName/repoName... 39 | * Suffixing since chunks will not do it automatically (testes against about page) 40 | */ 41 | publicPath: '/' + GH_REPO_NAME + '/' + ghDeploy.safeUrl(webpackConfig.output.publicPath) 42 | }, 43 | 44 | plugins: [ 45 | function() { 46 | this.plugin('done', function(stats) { 47 | console.log('Starting deployment to GitHub.'); 48 | 49 | const logger = function (msg) { 50 | console.log(msg); 51 | }; 52 | 53 | const options = { 54 | logger: logger, 55 | remote: GIT_REMOTE_NAME, 56 | message: COMMIT_MESSAGE, 57 | dotfiles: true // for .nojekyll 58 | }; 59 | /** 60 | * Since GitHub moved to Jekyll 3.3, their server ignores the "node_modules" and "vendors" folder by default. 61 | * but, as of now, it also ignores "vendors*" files. 62 | * This means vendor.bundle.js or vendor.[chunk].bundle.js will return 404. 63 | * this is the fix for now. 64 | */ 65 | fs.writeFileSync(path.join(webpackConfig.output.path, '.nojekyll'), ''); 66 | 67 | const ghpages = require('gh-pages'); 68 | ghpages.publish(webpackConfig.output.path, options, function(err) { 69 | if (err) { 70 | console.log('GitHub deployment done. STATUS: ERROR.'); 71 | throw err; 72 | } else { 73 | console.log('GitHub deployment done. STATUS: SUCCESS.'); 74 | } 75 | }); 76 | }); 77 | } 78 | ] 79 | }); 80 | }; 81 | -------------------------------------------------------------------------------- /src/FastNZB/firebase.json: -------------------------------------------------------------------------------- 1 | { 2 | "hosting": { 3 | "public": "dist", 4 | "rewrites": [ 5 | { 6 | "source": "**", 7 | "destination": "/index.html" 8 | } 9 | ], 10 | "ignore": [ 11 | "firebase.json", 12 | "**/.*", 13 | "**/node_modules/**" 14 | ] 15 | } 16 | } -------------------------------------------------------------------------------- /src/FastNZB/karma.conf.js: -------------------------------------------------------------------------------- 1 | /** 2 | * @author: @AngularClass 3 | */ 4 | 5 | /** 6 | * Look in ./config for karma.conf.js 7 | */ 8 | module.exports = require('./config/karma.conf.js'); 9 | -------------------------------------------------------------------------------- /src/FastNZB/netlify.toml: -------------------------------------------------------------------------------- 1 | [build] 2 | command = "npm run build:prod" 3 | publish = "dist" 4 | -------------------------------------------------------------------------------- /src/FastNZB/protractor.conf.js: -------------------------------------------------------------------------------- 1 | /** 2 | * @author: @AngularClass 3 | */ 4 | 5 | /** 6 | * look in ./config for protractor.conf.js 7 | */ 8 | exports.config = require('./config/protractor.conf.js').config; 9 | -------------------------------------------------------------------------------- /src/FastNZB/src/app/+detail/+child-detail/child-detail.component.ts: -------------------------------------------------------------------------------- 1 | import { 2 | Component, 3 | OnInit, 4 | } from '@angular/core'; 5 | /** 6 | * We're loading this component asynchronously 7 | * We are using some magic with es6-promise-loader that will wrap the module with a Promise 8 | * see https://github.com/gdi2290/es6-promise-loader for more info 9 | */ 10 | 11 | console.log('`ChildDetail` component loaded asynchronously'); 12 | 13 | @Component({ 14 | selector: 'child-detail', 15 | template: ` 16 | Hello from Child Detail 17 | `, 18 | }) 19 | export class ChildDetailComponent implements OnInit { 20 | 21 | public ngOnInit() { 22 | console.log('hello `ChildDetail` component'); 23 | } 24 | 25 | } 26 | -------------------------------------------------------------------------------- /src/FastNZB/src/app/+detail/+child-detail/child-detail.module.ts: -------------------------------------------------------------------------------- 1 | import { CommonModule } from '@angular/common'; 2 | import { FormsModule } from '@angular/forms'; 3 | import { NgModule } from '@angular/core'; 4 | import { RouterModule } from '@angular/router'; 5 | 6 | import { routes } from './child-detail.routes'; 7 | import { ChildDetailComponent } from './child-detail.component'; 8 | 9 | console.log('`ChildDetail` bundle loaded asynchronously'); 10 | 11 | @NgModule({ 12 | declarations: [ 13 | /** 14 | * Components / Directives/ Pipes 15 | */ 16 | ChildDetailComponent, 17 | ], 18 | imports: [ 19 | CommonModule, 20 | FormsModule, 21 | RouterModule.forChild(routes), 22 | ], 23 | }) 24 | export class ChildDetailModule { 25 | public static routes = routes; 26 | } 27 | -------------------------------------------------------------------------------- /src/FastNZB/src/app/+detail/+child-detail/child-detail.routes.ts: -------------------------------------------------------------------------------- 1 | import { ChildDetailComponent } from './child-detail.component'; 2 | 3 | export const routes = [ 4 | { path: '', component: ChildDetailComponent, pathMatch: 'full' }, 5 | ]; 6 | -------------------------------------------------------------------------------- /src/FastNZB/src/app/+detail/+child-detail/index.ts: -------------------------------------------------------------------------------- 1 | export { ChildDetailModule } from './child-detail.module'; 2 | -------------------------------------------------------------------------------- /src/FastNZB/src/app/+detail/detail.component.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | {{ nzb._Votes }} 6 | 7 | 8 | {{ nzb.name }} 9 | -------------------------------------------------------------------------------- /src/FastNZB/src/app/+detail/detail.component.ts: -------------------------------------------------------------------------------- 1 | import { 2 | Component, 3 | OnInit, 4 | } from '@angular/core'; 5 | import { Router, ActivatedRoute, ParamMap } from '@angular/router'; 6 | import { Observable } from 'rxjs/Observable'; 7 | 8 | import { NZB } from '../nzb.component'; 9 | import { ReleaseSearchService } from '../release-search.service'; 10 | /** 11 | * We're loading this component asynchronously 12 | * We are using some magic with es6-promise-loader that will wrap the module with a Promise 13 | * see https://github.com/gdi2290/es6-promise-loader for more info 14 | */ 15 | 16 | @Component({ 17 | selector: 'detail', 18 | templateUrl: 'detail.component.html', 19 | /*template: ` 20 | Hello from Detail 21 | 22 | 23 | Child Detail 24 | 25 | 26 | 27 | `,*/ 28 | providers: [ReleaseSearchService], 29 | }) 30 | export class DetailComponent implements OnInit { 31 | nzb: NZB; 32 | constructor( 33 | private route: ActivatedRoute, 34 | private router: Router, 35 | private releaseSearchService: ReleaseSearchService) { 36 | } 37 | 38 | public ngOnInit() { 39 | //console.log('hello `Detail` component'); 40 | this.nzb = new NZB(); 41 | this.route 42 | .params 43 | .subscribe(params => { 44 | this.releaseSearchService.getNZB(params['id']) 45 | .subscribe(data=> { this.nzb = data; }); 46 | }); 47 | 48 | } 49 | 50 | upVote(nzb: NZB): void { 51 | this.releaseSearchService.vote(nzb.id, 1).subscribe(function(result) { 52 | nzb._Votes = result; 53 | }); 54 | } 55 | 56 | downVote(nzb: NZB): void { 57 | this.releaseSearchService.vote(nzb.id, -1).subscribe(function(result) { 58 | nzb._Votes = result; 59 | }); 60 | } 61 | 62 | } 63 | -------------------------------------------------------------------------------- /src/FastNZB/src/app/+detail/detail.module.ts: -------------------------------------------------------------------------------- 1 | import { CommonModule } from '@angular/common'; 2 | import { FormsModule } from '@angular/forms'; 3 | import { NgModule } from '@angular/core'; 4 | import { RouterModule } from '@angular/router'; 5 | 6 | import { routes } from './detail.routes'; 7 | import { DetailComponent } from './detail.component'; 8 | 9 | console.log('`Detail` bundle loaded asynchronously'); 10 | 11 | @NgModule({ 12 | declarations: [ 13 | /** 14 | * Components / Directives/ Pipes 15 | */ 16 | DetailComponent, 17 | ], 18 | imports: [ 19 | CommonModule, 20 | FormsModule, 21 | RouterModule.forChild(routes), 22 | ], 23 | }) 24 | export class DetailModule { 25 | public static routes = routes; 26 | } 27 | -------------------------------------------------------------------------------- /src/FastNZB/src/app/+detail/detail.routes.ts: -------------------------------------------------------------------------------- 1 | import { DetailComponent } from './detail.component'; 2 | 3 | export const routes = [ 4 | { path: '', children: [ 5 | { path: '', component: DetailComponent }, 6 | { path: 'child-detail', loadChildren: './+child-detail#ChildDetailModule' } 7 | ]}, 8 | ]; 9 | -------------------------------------------------------------------------------- /src/FastNZB/src/app/+detail/index.ts: -------------------------------------------------------------------------------- 1 | export { DetailModule } from './detail.module'; 2 | -------------------------------------------------------------------------------- /src/FastNZB/src/app/+reset/index.ts: -------------------------------------------------------------------------------- 1 | export { ResetModule } from './reset.module'; 2 | -------------------------------------------------------------------------------- /src/FastNZB/src/app/+reset/reset.component.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | {{message}} 4 | 5 | User 6 | 7 | 8 | 9 | New Password 10 | 11 | 12 | Reset 13 | 14 | -------------------------------------------------------------------------------- /src/FastNZB/src/app/+reset/reset.component.ts: -------------------------------------------------------------------------------- 1 | import { 2 | Component, 3 | OnInit, 4 | } from '@angular/core'; 5 | import { Router, ActivatedRoute, ParamMap } from '@angular/router'; 6 | import { Observable } from 'rxjs/Observable'; 7 | 8 | import { UserService } from '../user.service'; 9 | /** 10 | * We're loading this component asynchronously 11 | * We are using some magic with es6-promise-loader that will wrap the module with a Promise 12 | * see https://github.com/gdi2290/es6-promise-loader for more info 13 | */ 14 | 15 | @Component({ 16 | templateUrl: 'reset.component.html', 17 | providers: [UserService], 18 | }) 19 | export class ResetComponent implements OnInit { 20 | id: string; 21 | password: string; 22 | message: string; 23 | email: string 24 | constructor( 25 | private route: ActivatedRoute, 26 | private router: Router, 27 | private userService: UserService) { 28 | } 29 | public ngOnInit() { 30 | this.route 31 | .params 32 | .subscribe(params => { 33 | this.id = params['id']; 34 | }); 35 | 36 | } 37 | 38 | public reset() { 39 | this.userService.resetPassword(this.id, this.email, this.password).subscribe(data => { 40 | if (data.json().valid == false) { 41 | this.message = "invalid info"; 42 | } else { 43 | this.message = 'password reset'; 44 | } 45 | }, error => { 46 | 47 | this.message = error.statusText; 48 | }); 49 | } 50 | 51 | } 52 | -------------------------------------------------------------------------------- /src/FastNZB/src/app/+reset/reset.module.ts: -------------------------------------------------------------------------------- 1 | import { CommonModule } from '@angular/common'; 2 | import { FormsModule } from '@angular/forms'; 3 | import { NgModule } from '@angular/core'; 4 | import { RouterModule } from '@angular/router'; 5 | import { AlertModule } from 'ngx-bootstrap/alert'; 6 | 7 | import { routes } from './reset.routes'; 8 | import { ResetComponent } from './reset.component'; 9 | 10 | @NgModule({ 11 | declarations: [ 12 | /** 13 | * Components / Directives/ Pipes 14 | */ 15 | ResetComponent, 16 | ], 17 | imports: [ 18 | CommonModule, 19 | FormsModule, 20 | RouterModule.forChild(routes), 21 | AlertModule.forRoot(), 22 | ], 23 | }) 24 | export class ResetModule { 25 | public static routes = routes; 26 | } 27 | -------------------------------------------------------------------------------- /src/FastNZB/src/app/+reset/reset.routes.ts: -------------------------------------------------------------------------------- 1 | import { ResetComponent } from './reset.component'; 2 | 3 | export const routes = [ 4 | { path: '', children: [ 5 | { path: '', component: ResetComponent }, 6 | ]}, 7 | ]; 8 | -------------------------------------------------------------------------------- /src/FastNZB/src/app/app.component.css: -------------------------------------------------------------------------------- 1 | html, body{ 2 | height: 100%; 3 | font-family: Arial, Helvetica, sans-serif 4 | } 5 | 6 | a.active { 7 | background-color: gray; 8 | } 9 | -------------------------------------------------------------------------------- /src/FastNZB/src/app/app.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { NO_ERRORS_SCHEMA } from '@angular/core'; 2 | import { 3 | inject, 4 | async, 5 | TestBed, 6 | ComponentFixture 7 | } from '@angular/core/testing'; 8 | 9 | /** 10 | * Load the implementations that should be tested 11 | */ 12 | import { AppComponent } from './app.component'; 13 | import { AppState } from './app.service'; 14 | 15 | describe(`App`, () => { 16 | let comp: AppComponent; 17 | let fixture: ComponentFixture; 18 | 19 | /** 20 | * async beforeEach 21 | */ 22 | beforeEach(async(() => { 23 | TestBed.configureTestingModule({ 24 | declarations: [ AppComponent ], 25 | schemas: [NO_ERRORS_SCHEMA], 26 | providers: [AppState] 27 | }) 28 | /** 29 | * Compile template and css 30 | */ 31 | .compileComponents(); 32 | })); 33 | 34 | /** 35 | * Synchronous beforeEach 36 | */ 37 | beforeEach(() => { 38 | fixture = TestBed.createComponent(AppComponent); 39 | comp = fixture.componentInstance; 40 | 41 | /** 42 | * Trigger initial data binding 43 | */ 44 | fixture.detectChanges(); 45 | }); 46 | 47 | it(`should be readly initialized`, () => { 48 | expect(fixture).toBeDefined(); 49 | expect(comp).toBeDefined(); 50 | }); 51 | 52 | it(`should be @AngularClass`, () => { 53 | expect(comp.url).toEqual('https://twitter.com/AngularClass'); 54 | //expect(comp.angularclassLogo).toEqual('assets/img/angularclass-avatar.png'); 55 | expect(comp.name).toEqual('Angular 2 Webpack Starter'); 56 | }); 57 | 58 | it('should log ngOnInit', () => { 59 | spyOn(console, 'log'); 60 | expect(console.log).not.toHaveBeenCalled(); 61 | 62 | comp.ngOnInit(); 63 | expect(console.log).toHaveBeenCalled(); 64 | }); 65 | 66 | }); 67 | -------------------------------------------------------------------------------- /src/FastNZB/src/app/app.component.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * Angular 2 decorators and services 3 | */ 4 | import { 5 | Component, 6 | OnInit, 7 | ViewEncapsulation 8 | } from '@angular/core'; 9 | import { AppState } from './app.service'; 10 | import { Angulartics2, Angulartics2Piwik } from 'angulartics2'; 11 | /** 12 | * App Component 13 | * Top Level Component 14 | */ 15 | @Component({ 16 | selector: 'app', 17 | encapsulation: ViewEncapsulation.None, 18 | styleUrls: [ 19 | './app.style.css', 20 | '../../node_modules/bootstrap/dist/css/bootstrap.min.css' 21 | ], 22 | template: '' 23 | }) 24 | export class AppComponent implements OnInit { 25 | //public angularclassLogo = 'assets/img/angularclass-avatar.png'; 26 | public name = 'FastNZB'; 27 | public url = 'https://fastnzb.com'; 28 | 29 | constructor( 30 | public appState: AppState, 31 | angulartics2Pwiik: Angulartics2Piwik 32 | ) {} 33 | 34 | public ngOnInit() { 35 | console.log('Initial App State', this.appState.state); 36 | } 37 | 38 | } 39 | 40 | /** 41 | * Please review the https://github.com/AngularClass/angular2-examples/ repo for 42 | * more angular app examples that you may copy/paste 43 | * (The examples may not be updated as quickly. Please open an issue on github for us to update it) 44 | * For help or questions please contact us at @AngularClass on twitter 45 | * or our chat on Slack at https://AngularClass.com/slack-join 46 | */ 47 | -------------------------------------------------------------------------------- /src/FastNZB/src/app/app.e2e.ts: -------------------------------------------------------------------------------- 1 | import { browser, by, element } from 'protractor'; 2 | import 'tslib'; 3 | 4 | describe('App', () => { 5 | 6 | beforeEach(async () => { 7 | await browser.get('/'); 8 | }); 9 | 10 | it('should have a title', async () => { 11 | let subject = await browser.getTitle(); 12 | let result = 'Angular2 Webpack Starter by @gdi2290 from @AngularClass'; 13 | expect(subject).toEqual(result); 14 | }); 15 | 16 | it('should have header', async () => { 17 | let subject = await element(by.css('h1')).isPresent(); 18 | let result = true; 19 | expect(subject).toEqual(result); 20 | }); 21 | 22 | it('should have ', async () => { 23 | let subject = await element(by.css('app home')).isPresent(); 24 | let result = true; 25 | expect(subject).toEqual(result); 26 | }); 27 | 28 | it('should have buttons', async () => { 29 | let subject = await element(by.css('button')).getText(); 30 | let result = 'Submit Value'; 31 | expect(subject).toEqual(result); 32 | }); 33 | 34 | }); 35 | -------------------------------------------------------------------------------- /src/FastNZB/src/app/app.module.ts: -------------------------------------------------------------------------------- 1 | import { BrowserModule } from '@angular/platform-browser'; 2 | import { FormsModule } from '@angular/forms'; 3 | import { HttpModule } from '@angular/http'; 4 | import { 5 | NgModule, 6 | ApplicationRef 7 | } from '@angular/core'; 8 | import { 9 | removeNgStyles, 10 | createNewHosts, 11 | createInputTransfer 12 | } from '@angularclass/hmr'; 13 | import { 14 | RouterModule, 15 | PreloadAllModules 16 | } from '@angular/router'; 17 | 18 | /* 19 | * Platform and Environment providers/directives/pipes 20 | */ 21 | import { ENV_PROVIDERS } from './environment'; 22 | import { ROUTES } from './app.routes'; 23 | // App is our top level component 24 | import { AppComponent } from './app.component'; 25 | import { APP_RESOLVER_PROVIDERS } from './app.resolver'; 26 | import { AppState, InternalStateType } from './app.service'; 27 | import { HomeComponent } from './home'; 28 | import { SearchComponent } from './search'; 29 | import { NoContentComponent } from './no-content'; 30 | import { XLargeDirective } from './home/x-large'; 31 | import { InfiniteScrollModule } from 'ngx-infinite-scroll'; 32 | import { ModalModule } from 'ngx-bootstrap/modal'; 33 | import { AlertModule } from 'ngx-bootstrap/alert'; 34 | 35 | import { Release } from './release.component'; 36 | import { ReleaseService } from './release.service'; 37 | import { ReleaseSearchComponent } from './release-search.component'; 38 | import { ReleaseSearchService } from './release-search.service'; 39 | import { NZB } from './nzb.component'; 40 | 41 | import { User } from './user.component'; 42 | import { UserService } from './user.service'; 43 | import { Angulartics2Module, Angulartics2Piwik } from 'angulartics2'; 44 | 45 | import { BytesPipe } from './bytes.pipe'; 46 | 47 | import '../styles/styles.scss'; 48 | import '../styles/headings.css'; 49 | 50 | // Application wide providers 51 | const APP_PROVIDERS = [ 52 | ...APP_RESOLVER_PROVIDERS, 53 | AppState, 54 | UserService 55 | ]; 56 | 57 | type StoreType = { 58 | state: InternalStateType, 59 | restoreInputValues: () => void, 60 | disposeOldHosts: () => void 61 | }; 62 | 63 | /** 64 | * `AppModule` is the main entry point into Angular2's bootstraping process 65 | */ 66 | @NgModule({ 67 | bootstrap: [ AppComponent ], 68 | declarations: [ 69 | AppComponent, 70 | SearchComponent, 71 | HomeComponent, 72 | NoContentComponent, 73 | XLargeDirective, 74 | ReleaseSearchComponent, 75 | BytesPipe, 76 | ], 77 | /** 78 | * Import Angular's modules. 79 | */ 80 | imports: [ 81 | BrowserModule, 82 | FormsModule, 83 | HttpModule, 84 | InfiniteScrollModule, 85 | ModalModule.forRoot(), 86 | AlertModule.forRoot(), 87 | Angulartics2Module.forRoot([Angulartics2Piwik]), 88 | RouterModule.forRoot(ROUTES, { useHash: false, preloadingStrategy: PreloadAllModules }) 89 | ], 90 | /** 91 | * Expose our Services and Providers into Angular's dependency injection. 92 | */ 93 | providers: [ 94 | ENV_PROVIDERS, 95 | APP_PROVIDERS 96 | ] 97 | }) 98 | export class AppModule { 99 | 100 | constructor( 101 | public appRef: ApplicationRef, 102 | public appState: AppState 103 | ) {} 104 | 105 | public hmrOnInit(store: StoreType) { 106 | if (!store || !store.state) { 107 | return; 108 | } 109 | console.log('HMR store', JSON.stringify(store, null, 2)); 110 | /** 111 | * Set state 112 | */ 113 | this.appState._state = store.state; 114 | /** 115 | * Set input values 116 | */ 117 | if ('restoreInputValues' in store) { 118 | let restoreInputValues = store.restoreInputValues; 119 | setTimeout(restoreInputValues); 120 | } 121 | 122 | this.appRef.tick(); 123 | delete store.state; 124 | delete store.restoreInputValues; 125 | } 126 | 127 | public hmrOnDestroy(store: StoreType) { 128 | const cmpLocation = this.appRef.components.map((cmp) => cmp.location.nativeElement); 129 | /** 130 | * Save state 131 | */ 132 | const state = this.appState._state; 133 | store.state = state; 134 | /** 135 | * Recreate root elements 136 | */ 137 | store.disposeOldHosts = createNewHosts(cmpLocation); 138 | /** 139 | * Save input values 140 | */ 141 | store.restoreInputValues = createInputTransfer(); 142 | /** 143 | * Remove styles 144 | */ 145 | removeNgStyles(); 146 | } 147 | 148 | public hmrAfterDestroy(store: StoreType) { 149 | /** 150 | * Display new elements 151 | */ 152 | store.disposeOldHosts(); 153 | delete store.disposeOldHosts; 154 | } 155 | 156 | } 157 | -------------------------------------------------------------------------------- /src/FastNZB/src/app/app.resolver.ts: -------------------------------------------------------------------------------- 1 | import { Resolve, ActivatedRouteSnapshot, RouterStateSnapshot } from '@angular/router'; 2 | import { Injectable } from '@angular/core'; 3 | import { Observable } from 'rxjs/Observable'; 4 | import 'rxjs/add/observable/of'; 5 | 6 | @Injectable() 7 | export class DataResolver implements Resolve { 8 | public resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) { 9 | return Observable.of({ res: 'I am data'}); 10 | } 11 | } 12 | 13 | /** 14 | * An array of services to resolve routes with data. 15 | */ 16 | export const APP_RESOLVER_PROVIDERS = [ 17 | DataResolver 18 | ]; 19 | -------------------------------------------------------------------------------- /src/FastNZB/src/app/app.routes.ts: -------------------------------------------------------------------------------- 1 | import { Routes, RouterModule } from '@angular/router'; 2 | import { HomeComponent } from './home'; 3 | import { SearchComponent } from './search'; 4 | import { NoContentComponent } from './no-content'; 5 | 6 | import { DataResolver } from './app.resolver'; 7 | 8 | export const ROUTES: Routes = [ 9 | { path: '', component: HomeComponent }, 10 | { path: 'home', component: HomeComponent }, 11 | { path: 'search', component: SearchComponent }, 12 | { path: 'search/:val', component: SearchComponent }, 13 | { path: 'details/:id', loadChildren: './+detail#DetailModule'}, 14 | { path: 'reset/:id', loadChildren: './+reset#ResetModule'}, 15 | { path: '**', component: NoContentComponent }, 16 | ]; 17 | -------------------------------------------------------------------------------- /src/FastNZB/src/app/app.service.ts: -------------------------------------------------------------------------------- 1 | import { Injectable } from '@angular/core'; 2 | 3 | export type InternalStateType = { 4 | [key: string]: any 5 | }; 6 | 7 | @Injectable() 8 | export class AppState { 9 | 10 | public _state: InternalStateType = { }; 11 | 12 | /** 13 | * Already return a clone of the current state. 14 | */ 15 | public get state() { 16 | return this._state = this._clone(this._state); 17 | } 18 | /** 19 | * Never allow mutation 20 | */ 21 | public set state(value) { 22 | throw new Error('do not mutate the `.state` directly'); 23 | } 24 | 25 | public get(prop?: any) { 26 | /** 27 | * Use our state getter for the clone. 28 | */ 29 | const state = this.state; 30 | return state.hasOwnProperty(prop) ? state[prop] : state; 31 | } 32 | 33 | public set(prop: string, value: any) { 34 | /** 35 | * Internally mutate our state. 36 | */ 37 | return this._state[prop] = value; 38 | } 39 | 40 | private _clone(object: InternalStateType) { 41 | /** 42 | * Simple object clone. 43 | */ 44 | return JSON.parse(JSON.stringify( object )); 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /src/FastNZB/src/app/app.spec.ts: -------------------------------------------------------------------------------- 1 | import { 2 | inject, 3 | TestBed 4 | } from '@angular/core/testing'; 5 | 6 | // Load the implementations that should be tested 7 | //import { App } from './app.component'; 8 | import { AppState } from './app.service'; 9 | 10 | describe('App', () => { 11 | // provide our implementations or mocks to the dependency injector 12 | beforeEach(() => TestBed.configureTestingModule({ 13 | providers: [ 14 | AppState, 15 | //App 16 | ]})); 17 | 18 | /*it('should have a url', inject([ App ], (app) => { 19 | expect(app.url).toEqual('https://twitter.com/AngularClass'); 20 | }));*/ 21 | 22 | }); 23 | -------------------------------------------------------------------------------- /src/FastNZB/src/app/app.style.css: -------------------------------------------------------------------------------- 1 | html, body{ 2 | height: 100%; 3 | font-family: Arial, Helvetica, sans-serif; 4 | background: #151617; 5 | width: 100%; 6 | } 7 | 8 | span.active { 9 | background-color: gray; 10 | } 11 | 12 | /*.table-rounded table { 13 | border-radius: 5px; 14 | } 15 | 16 | .table-rounded thead tr { 17 | border-top-left-radius: 5px; 18 | border-top-right-radius: 5px; 19 | }*/ 20 | 21 | .center-search { 22 | z-index: 15; 23 | width: 300px; 24 | height: 200px; 25 | position: absolute; 26 | top: 50%; 27 | left: 50%; 28 | margin: -100px 0 0 -150px; 29 | display: block; 30 | } 31 | 32 | .center-login { 33 | z-index: 15; 34 | width: 300px; 35 | height: 100px; 36 | position: absolute; 37 | top: 50%; 38 | left: 50%; 39 | margin: -100px 0 0 -150px; 40 | display: block; 41 | text-align: center !important; 42 | } 43 | 44 | .center-notice { 45 | z-index: 20; 46 | width: 300px; 47 | /* height: 200px; */ 48 | font-size: 12px; 49 | position: absolute; 50 | color: #999; 51 | top: 50%; 52 | left: 50%; 53 | margin: 50px 0 0 -150px; 54 | text-align: center; 55 | } 56 | 57 | .center-login .btn { 58 | margin: 5px; 59 | cursor: pointer; 60 | } 61 | 62 | .logout { 63 | position: absolute; 64 | right: 15px; 65 | top: 15px; 66 | z-index: 20; 67 | text-align: right; 68 | } 69 | 70 | .logout .btn { 71 | background-color: transparent; 72 | cursor: pointer; 73 | } 74 | 75 | .logo { 76 | width: 300px; 77 | height: 43px; 78 | margin-bottom: 15px; 79 | cursor: pointer; 80 | } 81 | 82 | .top-search .logo { 83 | margin: 5px 10px 10px 0; 84 | } 85 | 86 | .center-search .logo { 87 | /*margin-left: 15px;*/ 88 | } 89 | 90 | 91 | .btn-danger { 92 | background-color: #EC1E24 !important; 93 | } 94 | 95 | .btn-danger:hover { 96 | background-color: rgb(194, 27, 33) !important; 97 | 98 | } 99 | 100 | .top-search { 101 | background-color: #232527; 102 | border-bottom: #34383B 1px solid; 103 | width: 100%; 104 | margin-bottom: 15px; 105 | padding-top: 5px; 106 | } 107 | 108 | .top-search input { 109 | margin-top: -5px; 110 | } 111 | 112 | #search-box { 113 | background-color: #34383B; 114 | color: #fff; 115 | border-color: #666; 116 | } 117 | 118 | @media (max-width: 645px) { 119 | .form-inline { 120 | width: 100%; 121 | } 122 | #search-box { 123 | margin-bottom: 20px; 124 | width: 100% !important; 125 | margin: 10px 0 10px 0; 126 | } 127 | .top-search .logo { 128 | margin: 0 auto; 129 | margin-top: 65px; 130 | } 131 | .logout { 132 | text-align: right; 133 | } 134 | 135 | } 136 | 137 | .search-result { 138 | /*border: #34383B 1px solid;*/ 139 | /*border-radius: 4px;*/ 140 | /*width: 100%; */ 141 | /*padding: 5px;*/ 142 | /*display: flex;*/ 143 | /*align-items: center;*/ 144 | /*margin: 10px 0;*/ 145 | /*background-color: #18191B;*/ 146 | /*margin-top: 10px; 147 | margin-bottom: 10px; */ 148 | padding: 10px 0px 10px 0px; 149 | font-size: 1em; 150 | } 151 | 152 | .search-result:hover { 153 | background-color: #2D2D2D !important; 154 | cursor: pointer; 155 | } 156 | 157 | .search-result.open { 158 | padding-bottom: 0; 159 | } 160 | 161 | .search-result.open .title { 162 | padding-bottom: 10px; 163 | } 164 | 165 | .nzb:hover { 166 | cursor: default !important; 167 | background-color: #2D2D2D !important; 168 | } 169 | 170 | .search-result:nth-child(even) { 171 | background-color: #1E1E21; 172 | } 173 | 174 | .nzb { 175 | padding: 5px 15px 5px 15px; 176 | font-size: .8em; 177 | border-bottom: #34383B 1px solid; 178 | border-top: #34383B 1px solid; 179 | width: 100%; 180 | } 181 | 182 | .nzb:nth-child(even) { 183 | background-color: #1E1E21; 184 | } 185 | 186 | .nzb:nth-child(odd) { 187 | background-color: #151617; 188 | } 189 | 190 | .head { 191 | /*padding: 5px;*/ 192 | margin-bottom: 5px; 193 | font-weight: bold; 194 | } 195 | 196 | .title { 197 | padding: 2px; 198 | margin-left: 15px; 199 | } 200 | 201 | .title, .size, .download, .age, .vote { 202 | position:relative; 203 | top:50%; 204 | transform: translateY(-50%); 205 | -webkit-transform: translateY(-50%); 206 | -ms-transform: translateY(-50%); 207 | } 208 | 209 | .vote a { 210 | position: relative; 211 | top: 4px; 212 | margin: 0 4px; 213 | } 214 | 215 | .size, .age { 216 | color: #999; 217 | text-align: right; 218 | padding: 2px; 219 | } 220 | 221 | .download, vote { 222 | text-align: center; 223 | } 224 | 225 | .wrap { 226 | white-space: -moz-pre-wrap !important; /* Mozilla, since 1999 */ 227 | white-space: -webkit-pre-wrap; /*Chrome & Safari */ 228 | white-space: -pre-wrap; /* Opera 4-6 */ 229 | white-space: -o-pre-wrap; /* Opera 7 */ 230 | white-space: pre-wrap; /* css-3 */ 231 | word-wrap: break-word; /* Internet Explorer 5.5+ */ 232 | word-break: break-all; 233 | white-space: normal; 234 | } 235 | -------------------------------------------------------------------------------- /src/FastNZB/src/app/bytes.pipe.ts: -------------------------------------------------------------------------------- 1 | import { Pipe, PipeTransform } from '@angular/core'; 2 | 3 | @Pipe({name: 'bytes'}) 4 | export class BytesPipe implements PipeTransform { 5 | transform(bytes: number) : string { 6 | var decimals = 1; 7 | if(bytes == 0) return '0 Byte'; 8 | var k = 1000; // or 1024 for binary 9 | var dm = decimals + 1 || 3; 10 | var sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB']; 11 | var i = Math.floor(Math.log(bytes) / Math.log(k)); 12 | return parseFloat((bytes / Math.pow(k, i)).toFixed(dm)) + '' + sizes[i]; 13 | } 14 | } -------------------------------------------------------------------------------- /src/FastNZB/src/app/environment.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * Angular 2 3 | */ 4 | import { 5 | enableDebugTools, 6 | disableDebugTools 7 | } from '@angular/platform-browser'; 8 | import { 9 | ApplicationRef, 10 | enableProdMode 11 | } from '@angular/core'; 12 | /** 13 | * Environment Providers 14 | */ 15 | let PROVIDERS: any[] = [ 16 | /** 17 | * Common env directives 18 | */ 19 | ]; 20 | 21 | /** 22 | * Angular debug tools in the dev console 23 | * https://github.com/angular/angular/blob/86405345b781a9dc2438c0fbe3e9409245647019/TOOLS_JS.md 24 | */ 25 | let _decorateModuleRef = (value: T): T => { return value; }; 26 | 27 | if ('production' === ENV) { 28 | enableProdMode(); 29 | 30 | /** 31 | * Production 32 | */ 33 | _decorateModuleRef = (modRef: any) => { 34 | disableDebugTools(); 35 | 36 | return modRef; 37 | }; 38 | 39 | PROVIDERS = [ 40 | ...PROVIDERS, 41 | /** 42 | * Custom providers in production. 43 | */ 44 | ]; 45 | 46 | } else { 47 | 48 | _decorateModuleRef = (modRef: any) => { 49 | const appRef = modRef.injector.get(ApplicationRef); 50 | const cmpRef = appRef.components[0]; 51 | 52 | let _ng = ( window).ng; 53 | enableDebugTools(cmpRef); 54 | ( window).ng.probe = _ng.probe; 55 | ( window).ng.coreTokens = _ng.coreTokens; 56 | return modRef; 57 | }; 58 | 59 | /** 60 | * Development 61 | */ 62 | PROVIDERS = [ 63 | ...PROVIDERS, 64 | /** 65 | * Custom providers in development. 66 | */ 67 | ]; 68 | 69 | } 70 | 71 | export const decorateModuleRef = _decorateModuleRef; 72 | 73 | export const ENV_PROVIDERS = [ 74 | ...PROVIDERS 75 | ]; 76 | -------------------------------------------------------------------------------- /src/FastNZB/src/app/home/home.component.css: -------------------------------------------------------------------------------- 1 | /*styles for home content only*/ -------------------------------------------------------------------------------- /src/FastNZB/src/app/home/home.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { NO_ERRORS_SCHEMA } from '@angular/core'; 2 | import { 3 | inject, 4 | async, 5 | TestBed, 6 | ComponentFixture 7 | } from '@angular/core/testing'; 8 | import { Component } from '@angular/core'; 9 | import { 10 | BaseRequestOptions, 11 | ConnectionBackend, 12 | Http 13 | } from '@angular/http'; 14 | import { MockBackend } from '@angular/http/testing'; 15 | 16 | /** 17 | * Load the implementations that should be tested. 18 | */ 19 | import { AppState } from '../app.service'; 20 | import { HomeComponent } from './home.component'; 21 | import { Title } from './title'; 22 | 23 | describe(`Home`, () => { 24 | let comp: HomeComponent; 25 | let fixture: ComponentFixture; 26 | 27 | /** 28 | * async beforeEach. 29 | */ 30 | beforeEach(async(() => { 31 | TestBed.configureTestingModule({ 32 | declarations: [HomeComponent], 33 | schemas: [NO_ERRORS_SCHEMA], 34 | providers: [ 35 | BaseRequestOptions, 36 | MockBackend, 37 | { 38 | provide: Http, 39 | useFactory: (backend: ConnectionBackend, defaultOptions: BaseRequestOptions) => { 40 | return new Http(backend, defaultOptions); 41 | }, 42 | deps: [MockBackend, BaseRequestOptions] 43 | }, 44 | AppState, 45 | Title, 46 | ] 47 | }) 48 | /** 49 | * Compile template and css. 50 | */ 51 | .compileComponents(); 52 | })); 53 | 54 | /** 55 | * Synchronous beforeEach. 56 | */ 57 | beforeEach(() => { 58 | fixture = TestBed.createComponent(HomeComponent); 59 | comp = fixture.componentInstance; 60 | 61 | /** 62 | * Trigger initial data binding. 63 | */ 64 | fixture.detectChanges(); 65 | }); 66 | 67 | it('should have default data', () => { 68 | expect(comp.localState).toEqual({ value: '' }); 69 | }); 70 | 71 | it('should have a title', () => { 72 | expect(!!comp.title).toEqual(true); 73 | }); 74 | 75 | it('should log ngOnInit', () => { 76 | spyOn(console, 'log'); 77 | expect(console.log).not.toHaveBeenCalled(); 78 | 79 | comp.ngOnInit(); 80 | expect(console.log).toHaveBeenCalled(); 81 | }); 82 | 83 | }); 84 | -------------------------------------------------------------------------------- /src/FastNZB/src/app/home/home.component.ts: -------------------------------------------------------------------------------- 1 | import { 2 | Component, 3 | OnInit, 4 | OnDestroy 5 | } from '@angular/core'; 6 | 7 | import { AppState } from '../app.service'; 8 | import { Router, ActivatedRoute } from '@angular/router'; 9 | import { Title } from './title'; 10 | import { User } from '../user.component'; 11 | import { XLargeDirective } from './x-large'; 12 | import { UserService } from '../user.service'; 13 | import { Observable } from 'rxjs/Observable'; 14 | import { NgZone } from '@angular/core'; 15 | 16 | @Component({ 17 | /** 18 | * The selector is what angular internally uses 19 | * for `document.querySelectorAll(selector)` in our index.html 20 | * where, in this case, selector is the string 'home'. 21 | */ 22 | selector: 'home', // 23 | /** 24 | * We need to tell Angular's Dependency Injection which providers are in our app. 25 | */ 26 | providers: [ 27 | Title, 28 | UserService 29 | ], 30 | /** 31 | * Our list of styles in our component. We may add more to compose many styles together. 32 | */ 33 | styleUrls: [ './home.component.css' ], 34 | /** 35 | * Every Angular template is first compiled by the browser before Angular runs it's compiler. 36 | */ 37 | templateUrl: './home.component.html' 38 | }) 39 | export class HomeComponent implements OnInit { 40 | /** 41 | * Set our default values 42 | */ 43 | public localState = { value: '' }; 44 | model: any = {}; 45 | loading = false; 46 | currentUser: Observable = Observable.of(); 47 | loginError: string; 48 | registerMessage: string; 49 | donateMessage: string; 50 | /** 51 | * TypeScript public modifiers 52 | */ 53 | constructor( 54 | public appState: AppState, 55 | public title: Title, 56 | private router: Router, 57 | public authenticationService: UserService 58 | ) { 59 | 60 | } 61 | 62 | public ngOnInit() { 63 | 64 | this.authenticationService.session(); 65 | } 66 | 67 | login() { 68 | this.loading = true; 69 | this.authenticationService.login(this.model.UserName, this.model.Password) 70 | .subscribe( 71 | data => { 72 | //this.router.navigate([this.returnUrl]); 73 | window.location.reload(); 74 | }, 75 | error => { 76 | let message = JSON.parse(error._body).responseStatus.message; 77 | //this.alertService.error(error); 78 | console.log(error); 79 | this.loginError = message; 80 | this.loading = false; 81 | }); 82 | } 83 | 84 | 85 | register() { 86 | this.loading = true; 87 | this.authenticationService.create(this.model) 88 | .subscribe( 89 | data => { 90 | this.login(); 91 | }, 92 | error => { 93 | let message = JSON.parse(error._body).responseStatus.message; 94 | this.registerMessage = message; 95 | this.loading = false; 96 | }); 97 | } 98 | 99 | logout() { 100 | this.authenticationService.logout().subscribe(data=> { 101 | window.location.reload(); 102 | } 103 | ); 104 | } 105 | 106 | public reset() { 107 | this.authenticationService.reset(this.model.UserName).subscribe(data => { 108 | 109 | this.loginError = 'Check your Email'; 110 | 111 | }, error => { 112 | 113 | this.loginError = error.statusText; 114 | }); 115 | } 116 | } 117 | -------------------------------------------------------------------------------- /src/FastNZB/src/app/home/home.e2e.ts: -------------------------------------------------------------------------------- 1 | import { browser, by, element } from 'protractor'; 2 | import 'tslib'; 3 | 4 | describe('App', () => { 5 | 6 | beforeEach(async () => { 7 | /** 8 | * Change hash depending on router LocationStrategy. 9 | */ 10 | await browser.get('/#/home'); 11 | }); 12 | 13 | it('should have a title', async () => { 14 | let subject = await browser.getTitle(); 15 | let result = 'Angular2 Webpack Starter by @gdi2290 from @AngularClass'; 16 | expect(subject).toEqual(result); 17 | }); 18 | 19 | it('should have `your content here` x-large', async () => { 20 | let subject = await element(by.css('[x-large]')).getText(); 21 | let result = 'Your Content Here'; 22 | expect(subject).toEqual(result); 23 | }); 24 | 25 | }); 26 | -------------------------------------------------------------------------------- /src/FastNZB/src/app/home/index.ts: -------------------------------------------------------------------------------- 1 | export * from './home.component'; 2 | -------------------------------------------------------------------------------- /src/FastNZB/src/app/home/title/index.ts: -------------------------------------------------------------------------------- 1 | export * from './title.service'; 2 | -------------------------------------------------------------------------------- /src/FastNZB/src/app/home/title/title.service.spec.ts: -------------------------------------------------------------------------------- 1 | import { 2 | inject, 3 | TestBed 4 | } from '@angular/core/testing'; 5 | import { Component } from '@angular/core'; 6 | import { 7 | BaseRequestOptions, 8 | ConnectionBackend, 9 | Http 10 | } from '@angular/http'; 11 | import { MockBackend } from '@angular/http/testing'; 12 | import { Title } from './title.service'; 13 | 14 | describe('Title', () => { 15 | beforeEach(() => TestBed.configureTestingModule({ 16 | providers: [ 17 | BaseRequestOptions, 18 | MockBackend, 19 | { 20 | provide: Http, 21 | useFactory: (backend: ConnectionBackend, defaultOptions: BaseRequestOptions) => { 22 | return new Http(backend, defaultOptions); 23 | }, 24 | deps: [MockBackend, BaseRequestOptions] 25 | }, 26 | Title 27 | ]})); 28 | 29 | it('should have http', inject([ Title ], (title: Title) => { 30 | expect(!!title.http).toEqual(true); 31 | })); 32 | 33 | it('should get data from the server', inject([ Title ], (title: Title) => { 34 | spyOn(console, 'log'); 35 | expect(console.log).not.toHaveBeenCalled(); 36 | 37 | title.getData(); 38 | expect(console.log).toHaveBeenCalled(); 39 | expect(title.getData()).toEqual({ value: 'AngularClass' }); 40 | })); 41 | 42 | }); 43 | -------------------------------------------------------------------------------- /src/FastNZB/src/app/home/title/title.service.ts: -------------------------------------------------------------------------------- 1 | import { Injectable } from '@angular/core'; 2 | import { Http } from '@angular/http'; 3 | 4 | @Injectable() 5 | export class Title { 6 | 7 | public value = 'Angular 2'; 8 | 9 | constructor( 10 | public http: Http 11 | ) {} 12 | 13 | public getData() { 14 | console.log('Title#getData(): Get Data'); 15 | /** 16 | * return this.http.get('/assets/data.json') 17 | * .map(res => res.json()); 18 | */ 19 | return { 20 | value: 'AngularClass' 21 | }; 22 | } 23 | 24 | } 25 | -------------------------------------------------------------------------------- /src/FastNZB/src/app/home/x-large/index.ts: -------------------------------------------------------------------------------- 1 | export * from './x-large.directive'; 2 | -------------------------------------------------------------------------------- /src/FastNZB/src/app/home/x-large/x-large.directive.spec.ts: -------------------------------------------------------------------------------- 1 | import { 2 | fakeAsync, 3 | inject, 4 | tick, 5 | TestBed 6 | } from '@angular/core/testing'; 7 | import { Component } from '@angular/core'; 8 | import { BaseRequestOptions, Http } from '@angular/http'; 9 | import { By } from '@angular/platform-browser'; 10 | import { MockBackend } from '@angular/http/testing'; 11 | 12 | /** 13 | * Load the implementations that should be tested. 14 | */ 15 | import { XLargeDirective } from './x-large.directive'; 16 | 17 | describe('x-large directive', () => { 18 | /** 19 | * Create a test component to test directives. 20 | */ 21 | @Component({ 22 | template: 'Content' 23 | }) 24 | class TestComponent { } 25 | 26 | beforeEach(() => { 27 | TestBed.configureTestingModule({ 28 | declarations: [ 29 | XLargeDirective, 30 | TestComponent 31 | ] 32 | }); 33 | }); 34 | 35 | it('should sent font-size to x-large', fakeAsync(() => { 36 | TestBed.compileComponents().then(() => { 37 | 38 | const fixture = TestBed.createComponent(TestComponent); 39 | fixture.detectChanges(); 40 | tick(); 41 | const element = fixture.debugElement.query(By.css('div')); 42 | 43 | expect(element.nativeElement.style.fontSize).toBe('x-large'); 44 | 45 | }); 46 | })); 47 | 48 | }); 49 | -------------------------------------------------------------------------------- /src/FastNZB/src/app/home/x-large/x-large.directive.ts: -------------------------------------------------------------------------------- 1 | import { 2 | Component, 3 | Directive, 4 | ElementRef, 5 | Renderer 6 | } from '@angular/core'; 7 | /** 8 | * Directive 9 | * XLarge is a simple directive to show how one is made 10 | */ 11 | @Directive({ 12 | selector: '[x-large]' // using [ ] means selecting attributes 13 | }) 14 | export class XLargeDirective { 15 | constructor( 16 | public element: ElementRef, 17 | public renderer: Renderer 18 | ) { 19 | /** 20 | * Simple DOM manipulation to set font size to x-large 21 | * `nativeElement` is the direct reference to the DOM element 22 | * element.nativeElement.style.fontSize = 'x-large'; 23 | * 24 | * for server/webworker support use the renderer 25 | */ 26 | renderer.setElementStyle(element.nativeElement, 'fontSize', 'x-large'); 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /src/FastNZB/src/app/index.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * App 3 | */ 4 | export * from './app.module'; 5 | -------------------------------------------------------------------------------- /src/FastNZB/src/app/no-content/index.ts: -------------------------------------------------------------------------------- 1 | export * from './no-content.component'; 2 | -------------------------------------------------------------------------------- /src/FastNZB/src/app/no-content/no-content.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'no-content', 5 | template: ` 6 | 7 | 404: page missing 8 | 9 | ` 10 | }) 11 | export class NoContentComponent { 12 | 13 | } 14 | -------------------------------------------------------------------------------- /src/FastNZB/src/app/nzb.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'nzb', 5 | template: 'My First Angular 2 App' 6 | }) 7 | 8 | export class NZB { 9 | id: number; 10 | name: string; 11 | parts: number; 12 | size: number; 13 | guid: string; 14 | _Days: number; 15 | _Votes: number; 16 | } 17 | -------------------------------------------------------------------------------- /src/FastNZB/src/app/release-result.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core'; 2 | import { Release } from './release.component'; 3 | import { Observable } from 'rxjs/Observable'; 4 | import 'rxjs/Rx'; 5 | 6 | @Component({ 7 | selector: 'query', 8 | template: 'My First Angular 2 App' 9 | }) 10 | 11 | export class ReleaseResult { 12 | offset: number; 13 | total: number; 14 | results: Observable; 15 | } 16 | -------------------------------------------------------------------------------- /src/FastNZB/src/app/release-search.component.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /src/FastNZB/src/app/release-search.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit } from '@angular/core'; 2 | import { NgZone } from '@angular/core'; 3 | import { Router } from '@angular/router'; 4 | import { Observable } from 'rxjs/Observable'; 5 | import { BehaviorSubject } from 'rxjs/BehaviorSubject'; 6 | import { Subject } from 'rxjs/Subject'; 7 | import 'rxjs/Rx'; 8 | import { Angulartics2, Angulartics2Piwik } from 'angulartics2'; 9 | import { Location } from '@angular/common'; 10 | 11 | import { Release } from './release.component'; 12 | import { NZB } from './nzb.component'; 13 | import { ReleaseSearchService } from './release-search.service'; 14 | import { User } from './user.component'; 15 | import { UserService } from './user.service'; 16 | 17 | @Component({ 18 | selector: 'release-search', 19 | templateUrl: 'release-search.component.html', 20 | providers: [ReleaseSearchService, Angulartics2Piwik] 21 | }) 22 | 23 | export class ReleaseSearchComponent implements OnInit { 24 | showResults: boolean = false; 25 | loading: boolean = false; 26 | currentUser: User = null; 27 | nl: boolean = false; 28 | self: Object = this; 29 | searchTerm: string = ''; 30 | releaseList: Observable>; 31 | releases: Release[]; 32 | take: number = 50; 33 | offset: number = 0; 34 | private searchTerms = new Subject(); 35 | constructor(private router: Router) { 36 | } 37 | // Push a search term into the observable stream. 38 | search(term: string): void { 39 | if (term) { 40 | this.router.navigateByUrl('/search/' + term); 41 | } else { 42 | this.router.navigateByUrl('/search'); 43 | } 44 | } 45 | ngOnInit(): void { 46 | } 47 | } 48 | 49 | -------------------------------------------------------------------------------- /src/FastNZB/src/app/release-search.service.ts: -------------------------------------------------------------------------------- 1 | import { Injectable } from '@angular/core'; 2 | import { Http, Response } from '@angular/http'; 3 | import { Observable } from 'rxjs'; 4 | 5 | import { Release } from './release.component'; 6 | import { NZB } from './nzb.component'; 7 | 8 | //import 'rxjs/add/operator/toPromise'; 9 | 10 | @Injectable() 11 | export class ReleaseSearchService { 12 | private apiUrl = 'api.php?search='; // URL to web api 13 | 14 | constructor(private http: Http) {} 15 | 16 | 17 | search(term: string, take: number, offset: number): Observable { 18 | return this.http 19 | .get(`/api/query/titles?NameQuery=${term}&Take=${take}&Skip=${offset}&format=json`) 20 | .map((r: Response) => r.json().results as Release[]); 21 | } 22 | 23 | getNZBs(id: number): Observable { 24 | return this.http 25 | .get(`/api/title/${id}?format=json`) 26 | .map((r: Response) => r.json() as NZB[]); 27 | } 28 | 29 | 30 | getNZB(id: string): Observable { 31 | return this.http 32 | .get(`/api/nzb/detail/${id}?format=json`) 33 | .map((r: Response) => r.json() as NZB); 34 | } 35 | 36 | vote(id: number, val: number): Observable { 37 | return this.http 38 | .post(`/api/vote/${id}?format=json`, { val: val }) 39 | .map((r: Response) => r.json() as number);; 40 | } 41 | 42 | private handleError(error: any): Promise { 43 | //console.error('An error occurred', error); // for demo purposes only 44 | return Promise.reject(error.message || error); 45 | } 46 | 47 | } -------------------------------------------------------------------------------- /src/FastNZB/src/app/release.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core'; 2 | import { NZB } from './nzb.component'; 3 | import { Observable } from 'rxjs'; 4 | 5 | @Component({ 6 | selector: 'releases', 7 | template: 'My First Angular 2 App' 8 | }) 9 | 10 | export class Release { 11 | id: number; 12 | title: string; 13 | totalpart: number; 14 | group_id: number; 15 | size: number; 16 | guid: string; 17 | nzb_guid: string; 18 | nzbs: NZB[]; 19 | open: boolean; 20 | loading: boolean; 21 | } 22 | -------------------------------------------------------------------------------- /src/FastNZB/src/app/release.service.ts: -------------------------------------------------------------------------------- 1 | import { Injectable } from '@angular/core'; 2 | import { Http, Response } from '@angular/http'; 3 | import { Observable } from 'rxjs'; 4 | 5 | import { Release } from './release.component'; 6 | 7 | //import 'rxjs/add/operator/toPromise'; 8 | 9 | @Injectable() 10 | export class ReleaseService { 11 | 12 | constructor(private http: Http) {} 13 | 14 | search(term: string): Observable { 15 | return this.http 16 | .get(`/api/query/titles?NameContains=${term}&format=json&take=100`) 17 | .map((r: Response) => r.json() as Release[]); 18 | } 19 | 20 | private handleError(error: any): Promise { 21 | //console.error('An error occurred', error); // for demo purposes only 22 | return Promise.reject(error.message || error); 23 | } 24 | 25 | } -------------------------------------------------------------------------------- /src/FastNZB/src/app/search/index.ts: -------------------------------------------------------------------------------- 1 | export * from './search.component'; 2 | -------------------------------------------------------------------------------- /src/FastNZB/src/app/search/search.component.html: -------------------------------------------------------------------------------- 1 | 2 | apikey: {{ authenticationService.currentUser ? authenticationService.currentUser.apiKey : '' }} 3 | Logout 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | Name 30 | 31 | 32 | Size 33 | 34 | 35 | Age 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | {{release.name}} 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | {{nzb.name}} 54 | 55 | 56 | 57 | 58 | {{ nzb._Votes }} 59 | 60 | 61 | 62 | 63 | {{nzb.size | bytes}} 64 | 65 | 66 | {{nzb._Days}}d 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | -------------------------------------------------------------------------------- /src/FastNZB/src/app/search/search.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { ActivatedRoute, Data } from '@angular/router'; 2 | import { Component } from '@angular/core'; 3 | import { inject, TestBed } from '@angular/core/testing'; 4 | 5 | /** 6 | * Load the implementations that should be tested. 7 | */ 8 | import { AboutComponent } from './about.component'; 9 | 10 | describe('About', () => { 11 | /** 12 | * Provide our implementations or mocks to the dependency injector 13 | */ 14 | beforeEach(() => TestBed.configureTestingModule({ 15 | providers: [ 16 | /** 17 | * Provide a better mock. 18 | */ 19 | { 20 | provide: ActivatedRoute, 21 | useValue: { 22 | data: { 23 | subscribe: (fn: (value: Data) => void) => fn({ 24 | yourData: 'yolo' 25 | }) 26 | } 27 | } 28 | }, 29 | AboutComponent 30 | ] 31 | })); 32 | 33 | it('should log ngOnInit', inject([AboutComponent], (about: AboutComponent) => { 34 | spyOn(console, 'log'); 35 | expect(console.log).not.toHaveBeenCalled(); 36 | 37 | about.ngOnInit(); 38 | expect(console.log).toHaveBeenCalled(); 39 | })); 40 | 41 | }); 42 | -------------------------------------------------------------------------------- /src/FastNZB/src/app/search/search.component.ts: -------------------------------------------------------------------------------- 1 | import { 2 | Component, 3 | OnInit, 4 | OnDestroy 5 | } from '@angular/core'; 6 | import { ActivatedRoute } from '@angular/router'; 7 | import { NgZone } from '@angular/core'; 8 | import { Router } from '@angular/router'; 9 | import { Observable } from 'rxjs/Observable'; 10 | import { BehaviorSubject } from 'rxjs/BehaviorSubject'; 11 | import { Subject } from 'rxjs/Subject'; 12 | import 'rxjs/Rx'; 13 | import { Angulartics2, Angulartics2Piwik } from 'angulartics2'; 14 | 15 | import { Release } from '../release.component'; 16 | import { NZB } from '../nzb.component'; 17 | import { ReleaseSearchService } from '../release-search.service'; 18 | import { User } from '../user.component'; 19 | import { UserService } from '../user.service'; 20 | import { Location } from '@angular/common'; 21 | 22 | @Component({ 23 | selector: 'search', 24 | templateUrl: './search.component.html', 25 | providers: [ 26 | UserService, ReleaseSearchService, Angulartics2Piwik 27 | ] 28 | }) 29 | export class SearchComponent implements OnInit, OnDestroy { 30 | showResults: boolean = false; 31 | loading: boolean = false; 32 | currentUser: User = null; 33 | nl: boolean = false; 34 | self: Object = this; 35 | searchTerm: string = ''; 36 | releaseList: Observable>; 37 | releases: Release[]; 38 | take: number = 50; 39 | offset: number = 0; 40 | private searchTerms = new Subject(); 41 | donateMessage: String; 42 | constructor( 43 | public route: ActivatedRoute, 44 | public router: Router, 45 | public authenticationService: UserService, 46 | private releaseSearchService: ReleaseSearchService, private angulartics2: Angulartics2, private location: Location 47 | ) { 48 | } 49 | 50 | public ngOnInit() { 51 | this.authenticationService.session(); 52 | this.releaseList = this.searchTerms 53 | .debounceTime(300) // wait for 300ms pause in events 54 | //.distinctUntilChanged() // ignore if next search term is same as previous 55 | .switchMap(term => term // switch to new observable each time 56 | // return the http search observable 57 | ? this.releaseSearchService.search(term, this.take, this.offset).finally(function () { this.loading = false; }.bind(this)) 58 | // or the observable of empty heroes if no search term 59 | : Observable.of>([])) 60 | .catch(error => { 61 | // TODO: real error handling 62 | if (error.status == 401) 63 | this.router.navigateByUrl('/'); 64 | console.log(error); 65 | this.loading = false; 66 | return Observable.of>([]); 67 | }); 68 | 69 | this.releaseList.subscribe((releases) => { 70 | this.releases = new Array(); 71 | releases.forEach(element => { 72 | this.releases.push(element); 73 | }); 74 | 75 | }); 76 | 77 | this.currentUser = this.authenticationService.currentUser; 78 | this.route 79 | .params 80 | .subscribe(params => { 81 | if (params['val']) { 82 | this.search(params['val']); 83 | this.searchTerm = params['val']; 84 | } 85 | 86 | }); 87 | } 88 | 89 | // Push a search term into the observable stream. 90 | search(term: string): void { 91 | if (term) { 92 | this.angulartics2.eventTrack.next({ action: 'search', properties: {} }); 93 | this.router.navigateByUrl('/search/' + term); 94 | this.loading = true; 95 | } else { 96 | this.router.navigateByUrl('/search'); 97 | } 98 | this.offset = 0; 99 | this.releases = new Array(); 100 | this.searchTerms.next(term); 101 | this.showResults = true; 102 | this.searchTerm = term; 103 | } 104 | showNZBs(release: Release): void { 105 | if (release.open) { 106 | release.open = false; 107 | return; 108 | } else if (release.nzbs) { 109 | release.open = true; 110 | return; 111 | } 112 | release.loading = true; 113 | this.releaseSearchService.getNZBs(release.id).subscribe(function (nzbs) { release.nzbs = nzbs; release.open = true; release.loading = false; }); 114 | this.angulartics2.eventTrack.next({ action: 'title', properties: {} }); 115 | } 116 | onScroll(): void { 117 | this.offset = this.offset + this.take; 118 | this.releaseSearchService.search(this.searchTerm, this.take, this.offset).subscribe((releases) => { 119 | releases.forEach(element => { 120 | this.releases.push(element); 121 | }); 122 | }); 123 | } 124 | 125 | upVote(nzb: NZB): void { 126 | this.releaseSearchService.vote(nzb.id, 1).subscribe(function (result) { 127 | nzb._Votes = result; 128 | }); 129 | this.angulartics2.eventTrack.next({ action: 'vote', properties: {} }); 130 | } 131 | 132 | downVote(nzb: NZB): void { 133 | this.releaseSearchService.vote(nzb.id, -1).subscribe(function (result) { 134 | nzb._Votes = result; 135 | }); 136 | this.angulartics2.eventTrack.next({ action: 'vote', properties: {} }); 137 | } 138 | 139 | logout() { 140 | this.authenticationService.logout().subscribe(data=> { 141 | window.location.reload(); 142 | } 143 | ); 144 | } 145 | 146 | public ngOnDestroy() { 147 | window['angularComponent'] = null; 148 | } 149 | } 150 | -------------------------------------------------------------------------------- /src/FastNZB/src/app/user.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'user', 5 | template: 'My First Angular 2 App' 6 | }) 7 | 8 | export class User { 9 | sessionId: string; 10 | userId: string; 11 | userName: string; 12 | apiKey: string; 13 | nl: boolean; 14 | } 15 | -------------------------------------------------------------------------------- /src/FastNZB/src/app/user.service.ts: -------------------------------------------------------------------------------- 1 | import { Injectable, OnInit } from '@angular/core'; 2 | import { Http, Headers, Response } from '@angular/http'; 3 | import { Router, ActivatedRoute } from '@angular/router'; 4 | import { Location } from '@angular/common'; 5 | import { Observable } from 'rxjs/Observable'; 6 | import 'rxjs/add/operator/map' 7 | 8 | import { User } from './user.component'; 9 | 10 | @Injectable() 11 | export class UserService implements OnInit { 12 | currentUser: User = null; 13 | sessionChecked: boolean = false; 14 | mean: number = 0; 15 | message: string = ""; 16 | constructor(private http: Http, private location: Location, private router: Router) { } 17 | 18 | ngOnInit(): void { 19 | this.session(); 20 | } 21 | 22 | login(username: string, password: string) { 23 | return this.http.post('/auth/credentials?format=json', { UserName: username, Password: password}) 24 | .map((response: Response) => { 25 | // login successful if there's a jwt token in the response 26 | let user = response.json(); 27 | if (user.sessionId) { 28 | // store user details and jwt token in local storage to keep user logged in between page refreshes 29 | localStorage.setItem('currentUser', JSON.stringify(user)); 30 | 31 | } 32 | }); 33 | } 34 | 35 | create(user: any) { 36 | return this.http.post('/api/register?format=json', user).map((response: Response) => response.json()); 37 | } 38 | 39 | logout() { 40 | // remove user from local storage to log user out 41 | localStorage.removeItem('currentUser'); 42 | return this.http.get('/auth/logout?format=json'); 43 | } 44 | 45 | session(): void { 46 | if (!this.currentUser) { 47 | var request = this.http.get('/api/session-info?format=json') 48 | .map((r: Response) => r.json() as User); 49 | request.subscribe(q => { this.currentUser = q; this.sessionChecked = true; }, error => { 50 | this.sessionChecked = true; 51 | if (this.location.path() != '' && this.location.path()!='/') { 52 | this.router.navigateByUrl('/'); 53 | } 54 | 55 | }); 56 | } 57 | } 58 | 59 | reset(email: string) { 60 | return this.http.post('/api/users/passwordreset?format=json', { Email: email }); 61 | } 62 | 63 | resetPassword(id: string, email: string, password: string) { 64 | return this.http.put('/api/users/passwordreset/'+id+'?format=json', { Email: email, NewPassword: password }); 65 | } 66 | 67 | } -------------------------------------------------------------------------------- /src/FastNZB/src/assets/css/.gitkeep: -------------------------------------------------------------------------------- 1 | @AngularClass 2 | -------------------------------------------------------------------------------- /src/FastNZB/src/assets/data.json: -------------------------------------------------------------------------------- 1 | { 2 | "value": "AngularClass" 3 | } 4 | -------------------------------------------------------------------------------- /src/FastNZB/src/assets/humans.txt: -------------------------------------------------------------------------------- 1 | # humanstxt.org/ 2 | # The humans responsible & technology colophon 3 | 4 | # TEAM 5 | 6 | -- -- 7 | 8 | # THANKS 9 | 10 | 11 | PatrickJS -- @gdi2290 12 | AngularClass -- @AngularClass 13 | 14 | # TECHNOLOGY COLOPHON 15 | 16 | HTML5, CSS3 17 | Angular2, TypeScript, Webpack 18 | -------------------------------------------------------------------------------- /src/FastNZB/src/assets/icon/android-icon-144x144.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fastnzb/fastNZB/ff0592bab6d3ffefb9a6a5fed6d5221eaa86261a/src/FastNZB/src/assets/icon/android-icon-144x144.png -------------------------------------------------------------------------------- /src/FastNZB/src/assets/icon/android-icon-192x192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fastnzb/fastNZB/ff0592bab6d3ffefb9a6a5fed6d5221eaa86261a/src/FastNZB/src/assets/icon/android-icon-192x192.png -------------------------------------------------------------------------------- /src/FastNZB/src/assets/icon/android-icon-36x36.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fastnzb/fastNZB/ff0592bab6d3ffefb9a6a5fed6d5221eaa86261a/src/FastNZB/src/assets/icon/android-icon-36x36.png -------------------------------------------------------------------------------- /src/FastNZB/src/assets/icon/android-icon-48x48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fastnzb/fastNZB/ff0592bab6d3ffefb9a6a5fed6d5221eaa86261a/src/FastNZB/src/assets/icon/android-icon-48x48.png -------------------------------------------------------------------------------- /src/FastNZB/src/assets/icon/android-icon-72x72.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fastnzb/fastNZB/ff0592bab6d3ffefb9a6a5fed6d5221eaa86261a/src/FastNZB/src/assets/icon/android-icon-72x72.png -------------------------------------------------------------------------------- /src/FastNZB/src/assets/icon/android-icon-96x96.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fastnzb/fastNZB/ff0592bab6d3ffefb9a6a5fed6d5221eaa86261a/src/FastNZB/src/assets/icon/android-icon-96x96.png -------------------------------------------------------------------------------- /src/FastNZB/src/assets/icon/apple-icon-114x114.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fastnzb/fastNZB/ff0592bab6d3ffefb9a6a5fed6d5221eaa86261a/src/FastNZB/src/assets/icon/apple-icon-114x114.png -------------------------------------------------------------------------------- /src/FastNZB/src/assets/icon/apple-icon-120x120.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fastnzb/fastNZB/ff0592bab6d3ffefb9a6a5fed6d5221eaa86261a/src/FastNZB/src/assets/icon/apple-icon-120x120.png -------------------------------------------------------------------------------- /src/FastNZB/src/assets/icon/apple-icon-144x144.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fastnzb/fastNZB/ff0592bab6d3ffefb9a6a5fed6d5221eaa86261a/src/FastNZB/src/assets/icon/apple-icon-144x144.png -------------------------------------------------------------------------------- /src/FastNZB/src/assets/icon/apple-icon-152x152.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fastnzb/fastNZB/ff0592bab6d3ffefb9a6a5fed6d5221eaa86261a/src/FastNZB/src/assets/icon/apple-icon-152x152.png -------------------------------------------------------------------------------- /src/FastNZB/src/assets/icon/apple-icon-180x180.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fastnzb/fastNZB/ff0592bab6d3ffefb9a6a5fed6d5221eaa86261a/src/FastNZB/src/assets/icon/apple-icon-180x180.png -------------------------------------------------------------------------------- /src/FastNZB/src/assets/icon/apple-icon-57x57.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fastnzb/fastNZB/ff0592bab6d3ffefb9a6a5fed6d5221eaa86261a/src/FastNZB/src/assets/icon/apple-icon-57x57.png -------------------------------------------------------------------------------- /src/FastNZB/src/assets/icon/apple-icon-60x60.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fastnzb/fastNZB/ff0592bab6d3ffefb9a6a5fed6d5221eaa86261a/src/FastNZB/src/assets/icon/apple-icon-60x60.png -------------------------------------------------------------------------------- /src/FastNZB/src/assets/icon/apple-icon-72x72.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fastnzb/fastNZB/ff0592bab6d3ffefb9a6a5fed6d5221eaa86261a/src/FastNZB/src/assets/icon/apple-icon-72x72.png -------------------------------------------------------------------------------- /src/FastNZB/src/assets/icon/apple-icon-76x76.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fastnzb/fastNZB/ff0592bab6d3ffefb9a6a5fed6d5221eaa86261a/src/FastNZB/src/assets/icon/apple-icon-76x76.png -------------------------------------------------------------------------------- /src/FastNZB/src/assets/icon/apple-icon-precomposed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fastnzb/fastNZB/ff0592bab6d3ffefb9a6a5fed6d5221eaa86261a/src/FastNZB/src/assets/icon/apple-icon-precomposed.png -------------------------------------------------------------------------------- /src/FastNZB/src/assets/icon/apple-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fastnzb/fastNZB/ff0592bab6d3ffefb9a6a5fed6d5221eaa86261a/src/FastNZB/src/assets/icon/apple-icon.png -------------------------------------------------------------------------------- /src/FastNZB/src/assets/icon/browserconfig.xml: -------------------------------------------------------------------------------- 1 | 2 | #ffffff -------------------------------------------------------------------------------- /src/FastNZB/src/assets/icon/favicon-16x16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fastnzb/fastNZB/ff0592bab6d3ffefb9a6a5fed6d5221eaa86261a/src/FastNZB/src/assets/icon/favicon-16x16.png -------------------------------------------------------------------------------- /src/FastNZB/src/assets/icon/favicon-32x32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fastnzb/fastNZB/ff0592bab6d3ffefb9a6a5fed6d5221eaa86261a/src/FastNZB/src/assets/icon/favicon-32x32.png -------------------------------------------------------------------------------- /src/FastNZB/src/assets/icon/favicon-96x96.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fastnzb/fastNZB/ff0592bab6d3ffefb9a6a5fed6d5221eaa86261a/src/FastNZB/src/assets/icon/favicon-96x96.png -------------------------------------------------------------------------------- /src/FastNZB/src/assets/icon/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fastnzb/fastNZB/ff0592bab6d3ffefb9a6a5fed6d5221eaa86261a/src/FastNZB/src/assets/icon/favicon.ico -------------------------------------------------------------------------------- /src/FastNZB/src/assets/icon/ms-icon-144x144.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fastnzb/fastNZB/ff0592bab6d3ffefb9a6a5fed6d5221eaa86261a/src/FastNZB/src/assets/icon/ms-icon-144x144.png -------------------------------------------------------------------------------- /src/FastNZB/src/assets/icon/ms-icon-150x150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fastnzb/fastNZB/ff0592bab6d3ffefb9a6a5fed6d5221eaa86261a/src/FastNZB/src/assets/icon/ms-icon-150x150.png -------------------------------------------------------------------------------- /src/FastNZB/src/assets/icon/ms-icon-310x310.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fastnzb/fastNZB/ff0592bab6d3ffefb9a6a5fed6d5221eaa86261a/src/FastNZB/src/assets/icon/ms-icon-310x310.png -------------------------------------------------------------------------------- /src/FastNZB/src/assets/icon/ms-icon-70x70.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fastnzb/fastNZB/ff0592bab6d3ffefb9a6a5fed6d5221eaa86261a/src/FastNZB/src/assets/icon/ms-icon-70x70.png -------------------------------------------------------------------------------- /src/FastNZB/src/assets/img/angular-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fastnzb/fastNZB/ff0592bab6d3ffefb9a6a5fed6d5221eaa86261a/src/FastNZB/src/assets/img/angular-logo.png -------------------------------------------------------------------------------- /src/FastNZB/src/assets/img/angularclass-avatar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fastnzb/fastNZB/ff0592bab6d3ffefb9a6a5fed6d5221eaa86261a/src/FastNZB/src/assets/img/angularclass-avatar.png -------------------------------------------------------------------------------- /src/FastNZB/src/assets/img/angularclass-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fastnzb/fastNZB/ff0592bab6d3ffefb9a6a5fed6d5221eaa86261a/src/FastNZB/src/assets/img/angularclass-logo.png -------------------------------------------------------------------------------- /src/FastNZB/src/assets/img/btc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fastnzb/fastNZB/ff0592bab6d3ffefb9a6a5fed6d5221eaa86261a/src/FastNZB/src/assets/img/btc.png -------------------------------------------------------------------------------- /src/FastNZB/src/assets/img/nzb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fastnzb/fastNZB/ff0592bab6d3ffefb9a6a5fed6d5221eaa86261a/src/FastNZB/src/assets/img/nzb.png -------------------------------------------------------------------------------- /src/FastNZB/src/assets/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "App", 3 | "icons": [ 4 | { 5 | "src": "/assets/icon/android-icon-36x36.png", 6 | "sizes": "36x36", 7 | "type": "image/png" 8 | }, 9 | { 10 | "src": "/assets/icon/android-icon-48x48.png", 11 | "sizes": "48x48", 12 | "type": "image/png" 13 | }, 14 | { 15 | "src": "/assets/icon/android-icon-72x72.png", 16 | "sizes": "72x72", 17 | "type": "image/png" 18 | }, 19 | { 20 | "src": "/assets/icon/android-icon-96x96.png", 21 | "sizes": "96x96", 22 | "type": "image/png" 23 | }, 24 | { 25 | "src": "/assets/icon/android-icon-144x144.png", 26 | "sizes": "144x144", 27 | "type": "image/png" 28 | }, 29 | { 30 | "src": "/assets/icon/android-icon-192x192.png", 31 | "sizes": "192x192", 32 | "type": "image/png" 33 | } 34 | ] 35 | } 36 | -------------------------------------------------------------------------------- /src/FastNZB/src/assets/mock-data/mock-data.json: -------------------------------------------------------------------------------- 1 | [ 2 | {"res": "data"} 3 | ] 4 | -------------------------------------------------------------------------------- /src/FastNZB/src/assets/robots.txt: -------------------------------------------------------------------------------- 1 | # robotstxt.org 2 | 3 | User-agent: * 4 | -------------------------------------------------------------------------------- /src/FastNZB/src/assets/service-worker.js: -------------------------------------------------------------------------------- 1 | // This file is intentionally without code. 2 | -------------------------------------------------------------------------------- /src/FastNZB/src/custom-typings.d.ts: -------------------------------------------------------------------------------- 1 | /* 2 | * Custom Type Definitions 3 | * When including 3rd party modules you also need to include the type definition for the module 4 | * if they don't provide one within the module. You can try to install it with @types 5 | 6 | npm install @types/node 7 | npm install @types/lodash 8 | 9 | * If you can't find the type definition in the registry we can make an ambient/global definition in 10 | * this file for now. For example 11 | 12 | declare module 'my-module' { 13 | export function doesSomething(value: string): string; 14 | } 15 | 16 | * If you are using a CommonJS module that is using module.exports then you will have to write your 17 | * types using export = yourObjectOrFunction with a namespace above it 18 | * notice how we have to create a namespace that is equal to the function we're 19 | * assigning the export to 20 | 21 | declare module 'jwt-decode' { 22 | function jwtDecode(token: string): any; 23 | namespace jwtDecode {} 24 | export = jwtDecode; 25 | } 26 | 27 | * 28 | * If you're prototying and you will fix the types later you can also declare it as type any 29 | * 30 | 31 | declare var assert: any; 32 | declare var _: any; 33 | declare var $: any; 34 | 35 | * 36 | * If you're importing a module that uses Node.js modules which are CommonJS you need to import as 37 | * in the files such as main.browser.ts or any file within app/ 38 | * 39 | 40 | import * as _ from 'lodash' 41 | 42 | * You can include your type definitions in this file until you create one for the @types 43 | * 44 | */ 45 | 46 | // support NodeJS modules without type definitions 47 | declare module '*'; 48 | 49 | /* 50 | // for legacy tslint etc to understand rename 'modern-lru' with your package 51 | // then comment out `declare module '*';`. For each new module copy/paste 52 | // this method of creating an `any` module type definition 53 | declare module 'modern-lru' { 54 | let x: any; 55 | export = x; 56 | } 57 | */ 58 | 59 | // Extra variables that live on Global that will be replaced by webpack DefinePlugin 60 | declare var ENV: string; 61 | declare var HMR: boolean; 62 | declare var System: SystemJS; 63 | 64 | interface SystemJS { 65 | import: (path?: string) => Promise; 66 | } 67 | 68 | interface GlobalEnvironment { 69 | ENV: string; 70 | HMR: boolean; 71 | SystemJS: SystemJS; 72 | System: SystemJS; 73 | } 74 | 75 | interface Es6PromiseLoader { 76 | (id: string): (exportName?: string) => Promise; 77 | } 78 | 79 | type FactoryEs6PromiseLoader = () => Es6PromiseLoader; 80 | type FactoryPromise = () => Promise; 81 | 82 | type AsyncRoutes = { 83 | [component: string]: Es6PromiseLoader | 84 | Function | 85 | FactoryEs6PromiseLoader | 86 | FactoryPromise ; 87 | }; 88 | 89 | type IdleCallbacks = Es6PromiseLoader | 90 | Function | 91 | FactoryEs6PromiseLoader | 92 | FactoryPromise ; 93 | 94 | interface WebpackModule { 95 | hot: { 96 | data?: any, 97 | idle: any, 98 | accept(dependencies?: string | string[], callback?: (updatedDependencies?: any) => void): void; 99 | decline(deps?: any | string | string[]): void; 100 | dispose(callback?: (data?: any) => void): void; 101 | addDisposeHandler(callback?: (data?: any) => void): void; 102 | removeDisposeHandler(callback?: (data?: any) => void): void; 103 | check(autoApply?: any, callback?: (err?: Error, outdatedModules?: any[]) => void): void; 104 | apply(options?: any, callback?: (err?: Error, outdatedModules?: any[]) => void): void; 105 | status(callback?: (status?: string) => void): void | string; 106 | removeStatusHandler(callback?: (status?: string) => void): void; 107 | }; 108 | } 109 | 110 | interface WebpackRequire { 111 | (id: string): any; 112 | (paths: string[], callback: (...modules: any[]) => void): void; 113 | ensure(ids: string[], callback: (req: WebpackRequire) => void, chunkName?: string): void; 114 | context(directory: string, useSubDirectories?: boolean, regExp?: RegExp): WebpackContext; 115 | } 116 | 117 | interface WebpackContext extends WebpackRequire { 118 | keys(): string[]; 119 | } 120 | 121 | interface ErrorStackTraceLimit { 122 | stackTraceLimit: number; 123 | } 124 | 125 | // Extend typings 126 | interface NodeRequire extends WebpackRequire {} 127 | interface ErrorConstructor extends ErrorStackTraceLimit {} 128 | interface NodeRequireFunction extends Es6PromiseLoader {} 129 | interface NodeModule extends WebpackModule {} 130 | interface Global extends GlobalEnvironment {} 131 | -------------------------------------------------------------------------------- /src/FastNZB/src/fonts/FontAwesome.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fastnzb/fastNZB/ff0592bab6d3ffefb9a6a5fed6d5221eaa86261a/src/FastNZB/src/fonts/FontAwesome.otf -------------------------------------------------------------------------------- /src/FastNZB/src/fonts/fontawesome-webfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fastnzb/fastNZB/ff0592bab6d3ffefb9a6a5fed6d5221eaa86261a/src/FastNZB/src/fonts/fontawesome-webfont.eot -------------------------------------------------------------------------------- /src/FastNZB/src/fonts/fontawesome-webfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fastnzb/fastNZB/ff0592bab6d3ffefb9a6a5fed6d5221eaa86261a/src/FastNZB/src/fonts/fontawesome-webfont.ttf -------------------------------------------------------------------------------- /src/FastNZB/src/fonts/fontawesome-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fastnzb/fastNZB/ff0592bab6d3ffefb9a6a5fed6d5221eaa86261a/src/FastNZB/src/fonts/fontawesome-webfont.woff -------------------------------------------------------------------------------- /src/FastNZB/src/fonts/fontawesome-webfont.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fastnzb/fastNZB/ff0592bab6d3ffefb9a6a5fed6d5221eaa86261a/src/FastNZB/src/fonts/fontawesome-webfont.woff2 -------------------------------------------------------------------------------- /src/FastNZB/src/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | fastNZB 8 | 9 | 10 | 11 | 12 | 13 | 14 | 48 | <% if (webpackConfig.htmlElements.headTags) { %> 49 | 50 | <%= webpackConfig.htmlElements.headTags %> 51 | <% } %> 52 | 53 | 54 | <%= htmlWebpackPlugin.files.webpackManifest %> 55 | 56 | <% if (htmlWebpackPlugin.options.metadata.isDevServer && htmlWebpackPlugin.options.metadata.HMR !== true) { %> 57 | 58 | 59 | <% } %> 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | -------------------------------------------------------------------------------- /src/FastNZB/src/main.browser.aot.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * Angular bootstrapping 3 | */ 4 | import { platformBrowser } from '@angular/platform-browser'; 5 | import { decorateModuleRef } from './app/environment'; 6 | /** 7 | * App Module 8 | * our top level module that holds all of our components. 9 | */ 10 | import { AppModuleNgFactory } from '../compiled/src/app/app.module.ngfactory'; 11 | /** 12 | * Bootstrap our Angular app with a top level NgModule. 13 | */ 14 | export function main(): Promise { 15 | return platformBrowser() 16 | .bootstrapModuleFactory(AppModuleNgFactory) 17 | .then(decorateModuleRef) 18 | .catch((err) => console.error(err)); 19 | } 20 | 21 | switch (document.readyState) { 22 | case 'loading': 23 | document.addEventListener('DOMContentLoaded', _domReadyHandler, false); 24 | break; 25 | case 'interactive': 26 | case 'complete': 27 | default: 28 | main(); 29 | } 30 | 31 | function _domReadyHandler() { 32 | document.removeEventListener('DOMContentLoaded', _domReadyHandler, false); 33 | main(); 34 | } 35 | -------------------------------------------------------------------------------- /src/FastNZB/src/main.browser.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * Angular bootstrapping 3 | */ 4 | import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; 5 | import { decorateModuleRef } from './app/environment'; 6 | 7 | /** 8 | * App Module 9 | * our top level module that holds all of our components 10 | */ 11 | import { AppModule } from './app'; 12 | 13 | /** 14 | * Bootstrap our Angular app with a top level NgModule 15 | */ 16 | export function main(): Promise { 17 | return platformBrowserDynamic() 18 | .bootstrapModule(AppModule) 19 | .then(decorateModuleRef) 20 | .catch((err) => console.error(err)); 21 | } 22 | 23 | /** 24 | * Needed for hmr 25 | * in prod this is replace for document ready 26 | */ 27 | switch (document.readyState) { 28 | case 'loading': 29 | document.addEventListener('DOMContentLoaded', _domReadyHandler, false); 30 | break; 31 | case 'interactive': 32 | case 'complete': 33 | default: 34 | main(); 35 | } 36 | 37 | function _domReadyHandler() { 38 | document.removeEventListener('DOMContentLoaded', _domReadyHandler, false); 39 | main(); 40 | } 41 | -------------------------------------------------------------------------------- /src/FastNZB/src/meta/humans.txt: -------------------------------------------------------------------------------- 1 | # humanstxt.org/ 2 | # The humans responsible & technology colophon 3 | 4 | # TEAM 5 | 6 | -- -- 7 | 8 | # THANKS 9 | 10 | 11 | PatrickJS -- @gdi2290 12 | AngularClass -- @AngularClass 13 | 14 | # TECHNOLOGY COLOPHON 15 | 16 | HTML5, CSS3 17 | Angular2, TypeScript, Webpack 18 | -------------------------------------------------------------------------------- /src/FastNZB/src/meta/robots.txt: -------------------------------------------------------------------------------- 1 | # robotstxt.org 2 | 3 | User-agent: * 4 | -------------------------------------------------------------------------------- /src/FastNZB/src/polyfills.browser.ts: -------------------------------------------------------------------------------- 1 | // TODO(gdi2290): switch to DLLs 2 | 3 | /** 4 | * Polyfills 5 | */ 6 | 7 | /* import 'ie-shim'; *//* Internet Explorer 9 support */ 8 | 9 | /* import 'core-js/es6'; */ 10 | 11 | /** 12 | * Added parts of es6 which are necessary for your project or your browser support requirements. 13 | */ 14 | import 'core-js/es6/symbol'; 15 | import 'core-js/es6/object'; 16 | import 'core-js/es6/function'; 17 | import 'core-js/es6/parse-int'; 18 | import 'core-js/es6/parse-float'; 19 | import 'core-js/es6/number'; 20 | import 'core-js/es6/math'; 21 | import 'core-js/es6/string'; 22 | import 'core-js/es6/date'; 23 | import 'core-js/es6/array'; 24 | import 'core-js/es6/regexp'; 25 | import 'core-js/es6/map'; 26 | import 'core-js/es6/set'; 27 | import 'core-js/es6/weak-map'; 28 | import 'core-js/es6/weak-set'; 29 | import 'core-js/es6/typed'; 30 | import 'core-js/es6/reflect'; 31 | /** 32 | * See issue https://github.com/AngularClass/angular2-webpack-starter/issues/709 33 | */ 34 | /* import 'core-js/es6/promise'; */ 35 | 36 | import 'core-js/es7/reflect'; 37 | import 'zone.js/dist/zone'; 38 | //import 'reflect-metadata'; 39 | 40 | 41 | import { library, dom } from '@fortawesome/fontawesome-svg-core' 42 | import { fas } from '@fortawesome/free-solid-svg-icons' 43 | import { fab } from '@fortawesome/free-brands-svg-icons' 44 | 45 | library.add(fas, fab) 46 | dom.watch() 47 | 48 | if ('production' === ENV) { 49 | // Production 50 | 51 | } else { 52 | 53 | // Development 54 | Error.stackTraceLimit = Infinity; 55 | 56 | /* tslint:disable no-var-requires */ 57 | require('zone.js/dist/long-stack-trace-zone'); 58 | 59 | } 60 | -------------------------------------------------------------------------------- /src/FastNZB/src/styles/_variables.scss: -------------------------------------------------------------------------------- 1 | $nav-button-color: #00838F; -------------------------------------------------------------------------------- /src/FastNZB/src/styles/headings.css: -------------------------------------------------------------------------------- 1 | h1 { 2 | color: #00BCD4; 3 | } -------------------------------------------------------------------------------- /src/FastNZB/src/vendor.browser.ts: -------------------------------------------------------------------------------- 1 | // For vendors for example jQuery, Lodash, angular2-jwt just import them here unless you plan on 2 | // chunking vendors files for async loading. You would need to import the async loaded vendors 3 | // at the entry point of the async loaded file. Also see custom-typings.d.ts as you also need to 4 | // run `typings install x` where `x` is your module 5 | 6 | // TODO(gdi2290): switch to DLLs 7 | 8 | // Angular 2 9 | import '@angular/platform-browser'; 10 | import '@angular/platform-browser-dynamic'; 11 | import '@angular/core'; 12 | import '@angular/common'; 13 | import '@angular/forms'; 14 | import '@angular/http'; 15 | import '@angular/router'; 16 | 17 | // AngularClass 18 | import '@angularclass/hmr'; 19 | 20 | // RxJS 21 | import 'rxjs/add/operator/map'; 22 | import 'rxjs/add/operator/mergeMap'; 23 | 24 | import 'jquery'; 25 | 26 | if ('production' === ENV) { 27 | // Production 28 | 29 | 30 | } else { 31 | // Development 32 | 33 | } 34 | -------------------------------------------------------------------------------- /src/FastNZB/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "es5", 4 | "module": "commonjs", 5 | "moduleResolution": "node", 6 | "emitDecoratorMetadata": true, 7 | "experimentalDecorators": true, 8 | "allowSyntheticDefaultImports": true, 9 | "sourceMap": true, 10 | "noEmit": true, 11 | "noEmitHelpers": true, 12 | "importHelpers": true, 13 | "strictNullChecks": false, 14 | "lib": [ 15 | "dom", 16 | "es6" 17 | ], 18 | "typeRoots": [ 19 | "node_modules/@types" 20 | ], 21 | "types": [ 22 | "hammerjs", 23 | "jasmine", 24 | "node", 25 | "source-map", 26 | "uglify-js", 27 | "webpack" 28 | ] 29 | }, 30 | "exclude": [ 31 | "node_modules", 32 | "dist" 33 | ], 34 | "awesomeTypescriptLoaderOptions": { 35 | "forkChecker": true, 36 | "useWebpackText": true 37 | }, 38 | "compileOnSave": false, 39 | "buildOnSave": false, 40 | "atom": { 41 | "rewriteTsconfig": false 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /src/FastNZB/tsconfig.webpack.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "es5", 4 | "module": "es2015", 5 | "moduleResolution": "node", 6 | "emitDecoratorMetadata": true, 7 | "experimentalDecorators": true, 8 | "allowSyntheticDefaultImports": true, 9 | "sourceMap": true, 10 | "noEmit": true, 11 | "noEmitHelpers": true, 12 | "importHelpers": true, 13 | "strictNullChecks": false, 14 | "lib": [ 15 | "es2015", 16 | "dom" 17 | ], 18 | "typeRoots": [ 19 | "node_modules/@types" 20 | ], 21 | "types": [ 22 | "hammerjs", 23 | "node" 24 | ] 25 | }, 26 | "exclude": [ 27 | "node_modules", 28 | "dist", 29 | "src/**/*.spec.ts", 30 | "src/**/*.e2e.ts" 31 | ], 32 | "awesomeTypescriptLoaderOptions": { 33 | "forkChecker": true, 34 | "useWebpackText": true 35 | }, 36 | "angularCompilerOptions": { 37 | "genDir": "./compiled", 38 | "skipMetadataEmit": true 39 | }, 40 | "compileOnSave": false, 41 | "buildOnSave": false, 42 | "atom": { 43 | "rewriteTsconfig": false 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /src/FastNZB/tslint.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": [ 3 | "tslint:recommended" 4 | ], 5 | "rulesDirectory": [ 6 | "node_modules/codelyzer" 7 | ], 8 | "rules": { 9 | // Custom 10 | "trailing-comma": [false, {"multiline": "always", "singleline": "never"}], 11 | "interface-name": [false, "always-prefix"], 12 | // Angular 2 13 | "component-class-suffix": true, 14 | // "component-selector": [true, "element", "my", "kebab-case"], 15 | "directive-class-suffix": true, 16 | // "directive-selector": [true, "attribute", "my", "camelCase"], 17 | "import-destructuring-spacing": true, 18 | "invoke-injectable": true, 19 | "no-access-missing-member": true, 20 | "no-attribute-parameter-decorator": true, 21 | "no-forward-ref": true, 22 | "no-input-rename": true, 23 | "no-output-rename": true, 24 | "pipe-naming": [true, "camelCase", "my"], 25 | "templates-use-public": true, 26 | "use-host-property-decorator": true, 27 | "use-input-property-decorator": true, 28 | "use-life-cycle-interface": true, 29 | "use-output-property-decorator": true, 30 | "use-pipe-transform-interface": true, 31 | // General 32 | "no-console": [true, 33 | "time", 34 | "timeEnd", 35 | "trace" 36 | ], 37 | "max-line-length": [ 38 | true, 39 | 100 40 | ], 41 | "no-string-literal": false, 42 | "no-use-before-declare": true, 43 | "object-literal-sort-keys": false, 44 | "ordered-imports": false, 45 | "quotemark": [ 46 | true, 47 | "single", 48 | "avoid-escape" 49 | ], 50 | "variable-name": [ 51 | true, 52 | "allow-leading-underscore", 53 | "allow-pascal-case", 54 | "ban-keywords", 55 | "check-format" 56 | ] 57 | } 58 | } -------------------------------------------------------------------------------- /src/FastNZB/typedoc.json: -------------------------------------------------------------------------------- 1 | { 2 | "mode": "modules", 3 | "out": "doc", 4 | "theme": "default", 5 | "ignoreCompilerErrors": "true", 6 | "experimentalDecorators": "true", 7 | "emitDecoratorMetadata": "true", 8 | "target": "ES5", 9 | "moduleResolution": "node", 10 | "preserveConstEnums": "true", 11 | "stripInternal": "true", 12 | "suppressExcessPropertyErrors": "true", 13 | "suppressImplicitAnyIndexErrors": "true", 14 | "module": "commonjs" 15 | } 16 | -------------------------------------------------------------------------------- /src/FastNZB/typings.json: -------------------------------------------------------------------------------- 1 | { 2 | "globalDependencies": { 3 | "jquery": "registry:dt/jquery#1.10.0+20170310222111" 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /src/FastNZB/typings/globals/jquery/typings.json: -------------------------------------------------------------------------------- 1 | { 2 | "resolution": "main", 3 | "tree": { 4 | "src": "https://raw.githubusercontent.com/DefinitelyTyped/DefinitelyTyped/f4fdcaca9c94f90442dcedb0c8a84399c47e731f/jquery/index.d.ts", 5 | "raw": "registry:dt/jquery#1.10.0+20170310222111", 6 | "typings": "https://raw.githubusercontent.com/DefinitelyTyped/DefinitelyTyped/f4fdcaca9c94f90442dcedb0c8a84399c47e731f/jquery/index.d.ts" 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /src/FastNZB/typings/index.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | -------------------------------------------------------------------------------- /src/FastNZB/web.config: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /src/FastNZB/webpack.config.js: -------------------------------------------------------------------------------- 1 | /** 2 | * @author: @AngularClass 3 | */ 4 | 5 | /** 6 | * Look in ./config folder for webpack.dev.js 7 | */ 8 | switch (process.env.NODE_ENV) { 9 | case 'prod': 10 | case 'production': 11 | module.exports = require('./config/webpack.prod')({env: 'production'}); 12 | break; 13 | case 'test': 14 | case 'testing': 15 | module.exports = require('./config/webpack.test')({env: 'test'}); 16 | break; 17 | case 'dev': 18 | case 'development': 19 | default: 20 | module.exports = require('./config/webpack.dev')({env: 'development'}); 21 | } 22 | -------------------------------------------------------------------------------- /src/FastNZB/wwwroot/0.fb795abddb64fb794e68.chunk.js: -------------------------------------------------------------------------------- 1 | webpackJsonp([0],{"21Y7":function(t,e,n){"use strict";n.d(e,"a",(function(){return i}));var o=n("OAmG"),i=[{path:"",children:[{path:"",component:o.a},{path:"child-detail",loadChildren:function(){return n.e(2).then(n.bind(null,"02s1")).then((function(t){return t.ChildDetailModule}))}}]}]},KQdG:function(t,e){t.exports='\n \n \n \n {{ nzb._Votes }}\n \n \n {{ nzb.name }}\n'},OAmG:function(t,e,n){"use strict";n.d(e,"a",(function(){return c}));var o=n("TToO"),i=n("3j3K"),r=n("5oXY"),a=n("upUk"),s=n("dJwF"),c=(function(){function t(t,e,n){this.route=t,this.router=e,this.releaseSearchService=n}return t.prototype.ngOnInit=function(){var t=this;this.nzb=new a.a,this.route.params.subscribe((function(e){t.releaseSearchService.getNZB(e.id).subscribe((function(e){t.nzb=e}))}))},t.prototype.upVote=function(t){this.releaseSearchService.vote(t.id,1).subscribe((function(e){t._Votes=e}))},t.prototype.downVote=function(t){this.releaseSearchService.vote(t.id,-1).subscribe((function(e){t._Votes=e}))},t=o.a([i.Component({selector:"detail",template:n("KQdG"),providers:[s.a]}),o.c("design:paramtypes",[r.ActivatedRoute,r.Router,s.a])],t)})()},icz3:function(t,e,n){"use strict";n.d(e,"a",(function(){return l}));var o=n("TToO"),i=n("2Je8"),r=n("NVOs"),a=n("3j3K"),s=n("5oXY"),c=n("21Y7"),u=n("OAmG");console.log("`Detail` bundle loaded asynchronously");var l=(function(){function t(){}return t.routes=c.a,t=o.a([a.NgModule({declarations:[u.a],imports:[i.CommonModule,r.a,s.RouterModule.forChild(c.a)]})],t)})()},"m/F8":function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var o=n("icz3");n.d(e,"DetailModule",(function(){return o.a}))},upUk:function(t,e,n){"use strict";n.d(e,"a",(function(){return r}));var o=n("TToO"),i=n("3j3K"),r=(function(){function t(){}return t=o.a([i.Component({selector:"nzb",template:"My First Angular 2 App"})],t)})()}}); -------------------------------------------------------------------------------- /src/FastNZB/wwwroot/1.a85d2a7f3e86deb8bacf.chunk.js: -------------------------------------------------------------------------------- 1 | webpackJsonp([1],{"/CUC":function(t,e,n){"use strict";n.d(e,"a",(function(){return a}));var s=n("TToO"),o=n("3j3K"),r=n("5oXY"),i=n("1bCh"),a=(function(){function t(t,e,n){this.route=t,this.router=e,this.userService=n}return t.prototype.ngOnInit=function(){var t=this;this.route.params.subscribe((function(e){t.id=e.id}))},t.prototype.reset=function(){var t=this;this.userService.resetPassword(this.id,this.email,this.password).subscribe((function(e){0==e.json().valid?t.message="invalid info":t.message="password reset"}),(function(e){t.message=e.statusText}))},t=s.a([o.Component({template:n("2Vwy"),providers:[i.a]}),s.c("design:paramtypes",[r.ActivatedRoute,r.Router,i.a])],t)})()},"2Vwy":function(t,e){t.exports='\n \n {{message}}\n \n User\n \n \n \n New Password\n \n \n Reset\n \n'},Jh1I:function(t,e,n){"use strict";n.d(e,"a",(function(){return d}));var s=n("TToO"),o=n("2Je8"),r=n("NVOs"),i=n("3j3K"),a=n("5oXY"),u=n("Ozut"),c=n("loEe"),l=n("/CUC"),d=(function(){function t(){}return t.routes=c.a,t=s.a([i.NgModule({declarations:[l.a],imports:[o.CommonModule,r.a,a.RouterModule.forChild(c.a),u.a.forRoot()]})],t)})()},TGuV:function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var s=n("Jh1I");n.d(e,"ResetModule",(function(){return s.a}))},loEe:function(t,e,n){"use strict";n.d(e,"a",(function(){return o}));var s=n("/CUC"),o=[{path:"",children:[{path:"",component:s.a}]}]}}); -------------------------------------------------------------------------------- /src/FastNZB/wwwroot/2.ab3d001619a899ed5bb8.chunk.js: -------------------------------------------------------------------------------- 1 | webpackJsonp([2],{"02s1":function(o,n,t){"use strict";Object.defineProperty(n,"__esModule",{value:!0});var e=t("JbPC");t.d(n,"ChildDetailModule",(function(){return e.a}))},JbPC:function(o,n,t){"use strict";t.d(n,"a",(function(){return d}));var e=t("TToO"),l=t("2Je8"),a=t("NVOs"),u=t("3j3K"),i=t("5oXY"),r=t("o5Qd"),c=t("Xb4m");console.log("`ChildDetail` bundle loaded asynchronously");var d=(function(){function o(){}return o.routes=r.a,o=e.a([u.NgModule({declarations:[c.a],imports:[l.CommonModule,a.a,i.RouterModule.forChild(r.a)]})],o)})()},Xb4m:function(o,n,t){"use strict";t.d(n,"a",(function(){return a}));var e=t("TToO"),l=t("3j3K");console.log("`ChildDetail` component loaded asynchronously");var a=(function(){function o(){}return o.prototype.ngOnInit=function(){console.log("hello `ChildDetail` component")},o=e.a([l.Component({selector:"child-detail",template:"\n Hello from Child Detail \n "})],o)})()},o5Qd:function(o,n,t){"use strict";t.d(n,"a",(function(){return l}));var e=t("Xb4m"),l=[{path:"",component:e.a,pathMatch:"full"}]}}); -------------------------------------------------------------------------------- /src/FastNZB/wwwroot/assets/css/.gitkeep: -------------------------------------------------------------------------------- 1 | @AngularClass 2 | -------------------------------------------------------------------------------- /src/FastNZB/wwwroot/assets/data.json: -------------------------------------------------------------------------------- 1 | { 2 | "value": "AngularClass" 3 | } 4 | -------------------------------------------------------------------------------- /src/FastNZB/wwwroot/assets/humans.txt: -------------------------------------------------------------------------------- 1 | # humanstxt.org/ 2 | # The humans responsible & technology colophon 3 | 4 | # TEAM 5 | 6 | -- -- 7 | 8 | # THANKS 9 | 10 | 11 | PatrickJS -- @gdi2290 12 | AngularClass -- @AngularClass 13 | 14 | # TECHNOLOGY COLOPHON 15 | 16 | HTML5, CSS3 17 | Angular2, TypeScript, Webpack 18 | -------------------------------------------------------------------------------- /src/FastNZB/wwwroot/assets/icon/android-icon-144x144.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fastnzb/fastNZB/ff0592bab6d3ffefb9a6a5fed6d5221eaa86261a/src/FastNZB/wwwroot/assets/icon/android-icon-144x144.png -------------------------------------------------------------------------------- /src/FastNZB/wwwroot/assets/icon/android-icon-192x192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fastnzb/fastNZB/ff0592bab6d3ffefb9a6a5fed6d5221eaa86261a/src/FastNZB/wwwroot/assets/icon/android-icon-192x192.png -------------------------------------------------------------------------------- /src/FastNZB/wwwroot/assets/icon/android-icon-36x36.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fastnzb/fastNZB/ff0592bab6d3ffefb9a6a5fed6d5221eaa86261a/src/FastNZB/wwwroot/assets/icon/android-icon-36x36.png -------------------------------------------------------------------------------- /src/FastNZB/wwwroot/assets/icon/android-icon-48x48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fastnzb/fastNZB/ff0592bab6d3ffefb9a6a5fed6d5221eaa86261a/src/FastNZB/wwwroot/assets/icon/android-icon-48x48.png -------------------------------------------------------------------------------- /src/FastNZB/wwwroot/assets/icon/android-icon-72x72.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fastnzb/fastNZB/ff0592bab6d3ffefb9a6a5fed6d5221eaa86261a/src/FastNZB/wwwroot/assets/icon/android-icon-72x72.png -------------------------------------------------------------------------------- /src/FastNZB/wwwroot/assets/icon/android-icon-96x96.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fastnzb/fastNZB/ff0592bab6d3ffefb9a6a5fed6d5221eaa86261a/src/FastNZB/wwwroot/assets/icon/android-icon-96x96.png -------------------------------------------------------------------------------- /src/FastNZB/wwwroot/assets/icon/apple-icon-114x114.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fastnzb/fastNZB/ff0592bab6d3ffefb9a6a5fed6d5221eaa86261a/src/FastNZB/wwwroot/assets/icon/apple-icon-114x114.png -------------------------------------------------------------------------------- /src/FastNZB/wwwroot/assets/icon/apple-icon-120x120.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fastnzb/fastNZB/ff0592bab6d3ffefb9a6a5fed6d5221eaa86261a/src/FastNZB/wwwroot/assets/icon/apple-icon-120x120.png -------------------------------------------------------------------------------- /src/FastNZB/wwwroot/assets/icon/apple-icon-144x144.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fastnzb/fastNZB/ff0592bab6d3ffefb9a6a5fed6d5221eaa86261a/src/FastNZB/wwwroot/assets/icon/apple-icon-144x144.png -------------------------------------------------------------------------------- /src/FastNZB/wwwroot/assets/icon/apple-icon-152x152.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fastnzb/fastNZB/ff0592bab6d3ffefb9a6a5fed6d5221eaa86261a/src/FastNZB/wwwroot/assets/icon/apple-icon-152x152.png -------------------------------------------------------------------------------- /src/FastNZB/wwwroot/assets/icon/apple-icon-180x180.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fastnzb/fastNZB/ff0592bab6d3ffefb9a6a5fed6d5221eaa86261a/src/FastNZB/wwwroot/assets/icon/apple-icon-180x180.png -------------------------------------------------------------------------------- /src/FastNZB/wwwroot/assets/icon/apple-icon-57x57.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fastnzb/fastNZB/ff0592bab6d3ffefb9a6a5fed6d5221eaa86261a/src/FastNZB/wwwroot/assets/icon/apple-icon-57x57.png -------------------------------------------------------------------------------- /src/FastNZB/wwwroot/assets/icon/apple-icon-60x60.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fastnzb/fastNZB/ff0592bab6d3ffefb9a6a5fed6d5221eaa86261a/src/FastNZB/wwwroot/assets/icon/apple-icon-60x60.png -------------------------------------------------------------------------------- /src/FastNZB/wwwroot/assets/icon/apple-icon-72x72.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fastnzb/fastNZB/ff0592bab6d3ffefb9a6a5fed6d5221eaa86261a/src/FastNZB/wwwroot/assets/icon/apple-icon-72x72.png -------------------------------------------------------------------------------- /src/FastNZB/wwwroot/assets/icon/apple-icon-76x76.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fastnzb/fastNZB/ff0592bab6d3ffefb9a6a5fed6d5221eaa86261a/src/FastNZB/wwwroot/assets/icon/apple-icon-76x76.png -------------------------------------------------------------------------------- /src/FastNZB/wwwroot/assets/icon/apple-icon-precomposed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fastnzb/fastNZB/ff0592bab6d3ffefb9a6a5fed6d5221eaa86261a/src/FastNZB/wwwroot/assets/icon/apple-icon-precomposed.png -------------------------------------------------------------------------------- /src/FastNZB/wwwroot/assets/icon/apple-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fastnzb/fastNZB/ff0592bab6d3ffefb9a6a5fed6d5221eaa86261a/src/FastNZB/wwwroot/assets/icon/apple-icon.png -------------------------------------------------------------------------------- /src/FastNZB/wwwroot/assets/icon/browserconfig.xml: -------------------------------------------------------------------------------- 1 | 2 | #ffffff -------------------------------------------------------------------------------- /src/FastNZB/wwwroot/assets/icon/favicon-16x16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fastnzb/fastNZB/ff0592bab6d3ffefb9a6a5fed6d5221eaa86261a/src/FastNZB/wwwroot/assets/icon/favicon-16x16.png -------------------------------------------------------------------------------- /src/FastNZB/wwwroot/assets/icon/favicon-32x32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fastnzb/fastNZB/ff0592bab6d3ffefb9a6a5fed6d5221eaa86261a/src/FastNZB/wwwroot/assets/icon/favicon-32x32.png -------------------------------------------------------------------------------- /src/FastNZB/wwwroot/assets/icon/favicon-96x96.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fastnzb/fastNZB/ff0592bab6d3ffefb9a6a5fed6d5221eaa86261a/src/FastNZB/wwwroot/assets/icon/favicon-96x96.png -------------------------------------------------------------------------------- /src/FastNZB/wwwroot/assets/icon/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fastnzb/fastNZB/ff0592bab6d3ffefb9a6a5fed6d5221eaa86261a/src/FastNZB/wwwroot/assets/icon/favicon.ico -------------------------------------------------------------------------------- /src/FastNZB/wwwroot/assets/icon/ms-icon-144x144.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fastnzb/fastNZB/ff0592bab6d3ffefb9a6a5fed6d5221eaa86261a/src/FastNZB/wwwroot/assets/icon/ms-icon-144x144.png -------------------------------------------------------------------------------- /src/FastNZB/wwwroot/assets/icon/ms-icon-150x150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fastnzb/fastNZB/ff0592bab6d3ffefb9a6a5fed6d5221eaa86261a/src/FastNZB/wwwroot/assets/icon/ms-icon-150x150.png -------------------------------------------------------------------------------- /src/FastNZB/wwwroot/assets/icon/ms-icon-310x310.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fastnzb/fastNZB/ff0592bab6d3ffefb9a6a5fed6d5221eaa86261a/src/FastNZB/wwwroot/assets/icon/ms-icon-310x310.png -------------------------------------------------------------------------------- /src/FastNZB/wwwroot/assets/icon/ms-icon-70x70.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fastnzb/fastNZB/ff0592bab6d3ffefb9a6a5fed6d5221eaa86261a/src/FastNZB/wwwroot/assets/icon/ms-icon-70x70.png -------------------------------------------------------------------------------- /src/FastNZB/wwwroot/assets/img/angular-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fastnzb/fastNZB/ff0592bab6d3ffefb9a6a5fed6d5221eaa86261a/src/FastNZB/wwwroot/assets/img/angular-logo.png -------------------------------------------------------------------------------- /src/FastNZB/wwwroot/assets/img/angularclass-avatar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fastnzb/fastNZB/ff0592bab6d3ffefb9a6a5fed6d5221eaa86261a/src/FastNZB/wwwroot/assets/img/angularclass-avatar.png -------------------------------------------------------------------------------- /src/FastNZB/wwwroot/assets/img/angularclass-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fastnzb/fastNZB/ff0592bab6d3ffefb9a6a5fed6d5221eaa86261a/src/FastNZB/wwwroot/assets/img/angularclass-logo.png -------------------------------------------------------------------------------- /src/FastNZB/wwwroot/assets/img/btc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fastnzb/fastNZB/ff0592bab6d3ffefb9a6a5fed6d5221eaa86261a/src/FastNZB/wwwroot/assets/img/btc.png -------------------------------------------------------------------------------- /src/FastNZB/wwwroot/assets/img/nzb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fastnzb/fastNZB/ff0592bab6d3ffefb9a6a5fed6d5221eaa86261a/src/FastNZB/wwwroot/assets/img/nzb.png -------------------------------------------------------------------------------- /src/FastNZB/wwwroot/assets/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "App", 3 | "icons": [ 4 | { 5 | "src": "/assets/icon/android-icon-36x36.png", 6 | "sizes": "36x36", 7 | "type": "image/png" 8 | }, 9 | { 10 | "src": "/assets/icon/android-icon-48x48.png", 11 | "sizes": "48x48", 12 | "type": "image/png" 13 | }, 14 | { 15 | "src": "/assets/icon/android-icon-72x72.png", 16 | "sizes": "72x72", 17 | "type": "image/png" 18 | }, 19 | { 20 | "src": "/assets/icon/android-icon-96x96.png", 21 | "sizes": "96x96", 22 | "type": "image/png" 23 | }, 24 | { 25 | "src": "/assets/icon/android-icon-144x144.png", 26 | "sizes": "144x144", 27 | "type": "image/png" 28 | }, 29 | { 30 | "src": "/assets/icon/android-icon-192x192.png", 31 | "sizes": "192x192", 32 | "type": "image/png" 33 | } 34 | ] 35 | } 36 | -------------------------------------------------------------------------------- /src/FastNZB/wwwroot/assets/robots.txt: -------------------------------------------------------------------------------- 1 | # robotstxt.org 2 | 3 | User-agent: * 4 | -------------------------------------------------------------------------------- /src/FastNZB/wwwroot/assets/service-worker.js: -------------------------------------------------------------------------------- 1 | // This file is intentionally without code. 2 | -------------------------------------------------------------------------------- /src/FastNZB/wwwroot/humans.txt: -------------------------------------------------------------------------------- 1 | # humanstxt.org/ 2 | # The humans responsible & technology colophon 3 | 4 | # TEAM 5 | 6 | -- -- 7 | 8 | # THANKS 9 | 10 | 11 | PatrickJS -- @gdi2290 12 | AngularClass -- @AngularClass 13 | 14 | # TECHNOLOGY COLOPHON 15 | 16 | HTML5, CSS3 17 | Angular2, TypeScript, Webpack 18 | -------------------------------------------------------------------------------- /src/FastNZB/wwwroot/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | fastNZB 8 | 9 | 10 | 11 | 12 | 13 | 14 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 64 | 65 | 66 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | -------------------------------------------------------------------------------- /src/FastNZB/wwwroot/main.903320ae724f7b4fce31fd535d77a96d.css.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sources":[],"names":[],"mappings":"","file":"main.903320ae724f7b4fce31fd535d77a96d.css","sourceRoot":""} -------------------------------------------------------------------------------- /src/FastNZB/wwwroot/robots.txt: -------------------------------------------------------------------------------- 1 | # robotstxt.org 2 | 3 | User-agent: * 4 | -------------------------------------------------------------------------------- /src/lib/ServiceStack.Admin.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fastnzb/fastNZB/ff0592bab6d3ffefb9a6a5fed6d5221eaa86261a/src/lib/ServiceStack.Admin.dll -------------------------------------------------------------------------------- /src/lib/ServiceStack.Admin.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | ServiceStack.Admin 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /src/lib/ServiceStack.Aws.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fastnzb/fastNZB/ff0592bab6d3ffefb9a6a5fed6d5221eaa86261a/src/lib/ServiceStack.Aws.dll -------------------------------------------------------------------------------- /src/lib/ServiceStack.Client.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fastnzb/fastNZB/ff0592bab6d3ffefb9a6a5fed6d5221eaa86261a/src/lib/ServiceStack.Client.dll -------------------------------------------------------------------------------- /src/lib/ServiceStack.Common.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fastnzb/fastNZB/ff0592bab6d3ffefb9a6a5fed6d5221eaa86261a/src/lib/ServiceStack.Common.dll -------------------------------------------------------------------------------- /src/lib/ServiceStack.Interfaces.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fastnzb/fastNZB/ff0592bab6d3ffefb9a6a5fed6d5221eaa86261a/src/lib/ServiceStack.Interfaces.dll -------------------------------------------------------------------------------- /src/lib/ServiceStack.Mvc.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fastnzb/fastNZB/ff0592bab6d3ffefb9a6a5fed6d5221eaa86261a/src/lib/ServiceStack.Mvc.dll -------------------------------------------------------------------------------- /src/lib/ServiceStack.OrmLite.MySql.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fastnzb/fastNZB/ff0592bab6d3ffefb9a6a5fed6d5221eaa86261a/src/lib/ServiceStack.OrmLite.MySql.dll -------------------------------------------------------------------------------- /src/lib/ServiceStack.OrmLite.MySql.dll.config: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /src/lib/ServiceStack.OrmLite.MySql.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | ServiceStack.OrmLite.MySql 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /src/lib/ServiceStack.OrmLite.PostgreSQL.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fastnzb/fastNZB/ff0592bab6d3ffefb9a6a5fed6d5221eaa86261a/src/lib/ServiceStack.OrmLite.PostgreSQL.dll -------------------------------------------------------------------------------- /src/lib/ServiceStack.OrmLite.PostgreSQL.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | ServiceStack.OrmLite.PostgreSQL 5 | 6 | 7 | 8 | 9 | based on Npgsql2's source: Npgsql2\src\NpgsqlTypes\NpgsqlTypeConverters.cs 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /src/lib/ServiceStack.OrmLite.SqlServer.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fastnzb/fastNZB/ff0592bab6d3ffefb9a6a5fed6d5221eaa86261a/src/lib/ServiceStack.OrmLite.SqlServer.dll -------------------------------------------------------------------------------- /src/lib/ServiceStack.OrmLite.SqlServer.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | ServiceStack.OrmLite.SqlServer 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /src/lib/ServiceStack.OrmLite.Sqlite.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fastnzb/fastNZB/ff0592bab6d3ffefb9a6a5fed6d5221eaa86261a/src/lib/ServiceStack.OrmLite.Sqlite.dll -------------------------------------------------------------------------------- /src/lib/ServiceStack.OrmLite.Sqlite.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | ServiceStack.OrmLite.Sqlite 5 | 6 | 7 | 8 | 9 | New behavior from using System.Data.SQLite.Core 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /src/lib/ServiceStack.OrmLite.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fastnzb/fastNZB/ff0592bab6d3ffefb9a6a5fed6d5221eaa86261a/src/lib/ServiceStack.OrmLite.dll -------------------------------------------------------------------------------- /src/lib/ServiceStack.Redis.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fastnzb/fastNZB/ff0592bab6d3ffefb9a6a5fed6d5221eaa86261a/src/lib/ServiceStack.Redis.dll -------------------------------------------------------------------------------- /src/lib/ServiceStack.Server.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fastnzb/fastNZB/ff0592bab6d3ffefb9a6a5fed6d5221eaa86261a/src/lib/ServiceStack.Server.dll -------------------------------------------------------------------------------- /src/lib/ServiceStack.Text.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fastnzb/fastNZB/ff0592bab6d3ffefb9a6a5fed6d5221eaa86261a/src/lib/ServiceStack.Text.dll -------------------------------------------------------------------------------- /src/lib/ServiceStack.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fastnzb/fastNZB/ff0592bab6d3ffefb9a6a5fed6d5221eaa86261a/src/lib/ServiceStack.dll --------------------------------------------------------------------------------