From 861e677151ab5804c3c0f9029a590e9012c2aac1 Mon Sep 17 00:00:00 2001 From: Kenton Royal Date: Tue, 21 Aug 2018 22:54:08 +0100 Subject: [PATCH 01/45] Add methods to interface and add model class --- .../Engine/Interfaces/IMovieRequestEngine.cs | 2 -- src/Ombi.Core/Engine/Interfaces/IRequestEngine.cs | 2 ++ src/Ombi.Core/Engine/MovieRequestEngine.cs | 9 +++++++++ src/Ombi.Core/Engine/TvRequestEngine.cs | 9 +++++++++ src/Ombi.Core/Models/RequestQuotaCountModel.cs | 11 +++++++++++ src/Ombi/Controllers/SearchController.cs | 13 +++++++++++++ 6 files changed, 44 insertions(+), 2 deletions(-) create mode 100644 src/Ombi.Core/Models/RequestQuotaCountModel.cs diff --git a/src/Ombi.Core/Engine/Interfaces/IMovieRequestEngine.cs b/src/Ombi.Core/Engine/Interfaces/IMovieRequestEngine.cs index 91cbb9e72..152a1d923 100644 --- a/src/Ombi.Core/Engine/Interfaces/IMovieRequestEngine.cs +++ b/src/Ombi.Core/Engine/Interfaces/IMovieRequestEngine.cs @@ -17,7 +17,5 @@ namespace Ombi.Core.Engine.Interfaces Task ApproveMovie(MovieRequests request); Task ApproveMovieById(int requestId); Task DenyMovieById(int modelId); - - } } \ No newline at end of file diff --git a/src/Ombi.Core/Engine/Interfaces/IRequestEngine.cs b/src/Ombi.Core/Engine/Interfaces/IRequestEngine.cs index 740428ec7..53111fd95 100644 --- a/src/Ombi.Core/Engine/Interfaces/IRequestEngine.cs +++ b/src/Ombi.Core/Engine/Interfaces/IRequestEngine.cs @@ -1,5 +1,6 @@ using System.Collections.Generic; using System.Threading.Tasks; +using Ombi.Core.Models; using Ombi.Core.Models.Requests; using Ombi.Core.Models.UI; using Ombi.Store.Entities; @@ -22,5 +23,6 @@ namespace Ombi.Core.Engine.Interfaces Task GetTotal(); Task UnSubscribeRequest(int requestId, RequestType type); Task SubscribeToRequest(int requestId, RequestType type); + Task GetRemainingRequests(); } } \ No newline at end of file diff --git a/src/Ombi.Core/Engine/MovieRequestEngine.cs b/src/Ombi.Core/Engine/MovieRequestEngine.cs index f73c6fda1..7e0b61bd8 100644 --- a/src/Ombi.Core/Engine/MovieRequestEngine.cs +++ b/src/Ombi.Core/Engine/MovieRequestEngine.cs @@ -19,6 +19,7 @@ using Ombi.Core.Settings; using Ombi.Settings.Settings.Models; using Ombi.Store.Entities.Requests; using Ombi.Store.Repository; +using Ombi.Core.Models; namespace Ombi.Core.Engine { @@ -483,5 +484,13 @@ namespace Ombi.Core.Engine return new RequestEngineResult {Result = true, Message = $"{movieName} has been successfully added!"}; } + + public async Task GetRemainingRequests() + { + return new RequestQuotaCountModel() + { + HasLimit = false, + }; + } } } \ No newline at end of file diff --git a/src/Ombi.Core/Engine/TvRequestEngine.cs b/src/Ombi.Core/Engine/TvRequestEngine.cs index 90760f759..78a26f82a 100644 --- a/src/Ombi.Core/Engine/TvRequestEngine.cs +++ b/src/Ombi.Core/Engine/TvRequestEngine.cs @@ -23,6 +23,7 @@ using Ombi.Core.Settings; using Ombi.Settings.Settings.Models; using Ombi.Store.Entities.Requests; using Ombi.Store.Repository; +using Ombi.Core.Models; namespace Ombi.Core.Engine { @@ -612,5 +613,13 @@ namespace Ombi.Core.Engine return new RequestEngineResult { Result = true }; } + + public async Task GetRemainingRequests() + { + return new RequestQuotaCountModel() + { + HasLimit = false, + }; + } } } \ No newline at end of file diff --git a/src/Ombi.Core/Models/RequestQuotaCountModel.cs b/src/Ombi.Core/Models/RequestQuotaCountModel.cs new file mode 100644 index 000000000..23a692f41 --- /dev/null +++ b/src/Ombi.Core/Models/RequestQuotaCountModel.cs @@ -0,0 +1,11 @@ +namespace Ombi.Core.Models +{ + public class RequestQuotaCountModel + { + public bool HasLimit { get; set; } + + public int Limit { get; set; } + + public int Remaining { get; set; } + } +} \ No newline at end of file diff --git a/src/Ombi/Controllers/SearchController.cs b/src/Ombi/Controllers/SearchController.cs index fe5399d78..65e9f930b 100644 --- a/src/Ombi/Controllers/SearchController.cs +++ b/src/Ombi/Controllers/SearchController.cs @@ -8,6 +8,7 @@ using Microsoft.Extensions.Logging; using Ombi.Core; using Ombi.Core.Engine; using Ombi.Core.Engine.Interfaces; +using Ombi.Core.Models; using Ombi.Core.Models.Search; using StackExchange.Profiling; @@ -182,5 +183,17 @@ namespace Ombi.Controllers { return await TvEngine.Trending(); } + + [HttpGet("movie/requestCount")] + public async Task RemainingMovieRequests() + { + return null; + } + + [HttpGet("tv/requestCount")] + public async Task RemainingTvRequests() + { + return null; + } } } From 1bfbfdbe0033afa5ce25faa1b58878a317c46364 Mon Sep 17 00:00:00 2001 From: Kenton Royal Date: Tue, 21 Aug 2018 22:54:55 +0100 Subject: [PATCH 02/45] Fix scss import for unix systems --- src/Ombi/ClientApp/styles/_imports.scss | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Ombi/ClientApp/styles/_imports.scss b/src/Ombi/ClientApp/styles/_imports.scss index 09da286f8..5b22e1ac4 100644 --- a/src/Ombi/ClientApp/styles/_imports.scss +++ b/src/Ombi/ClientApp/styles/_imports.scss @@ -1,2 +1,2 @@ -@import './styles.scss'; -@import './scrollbar.scss'; \ No newline at end of file +@import './Styles.scss'; +@import './scrollbar.scss'; From 7ef2a1679da4ce126c593999018bdf6c33ce6d26 Mon Sep 17 00:00:00 2001 From: Kenton Royal Date: Sat, 25 Aug 2018 01:20:36 +0100 Subject: [PATCH 03/45] Add dummy for request counter --- src/Ombi.Core/Engine/MovieRequestEngine.cs | 4 +++- .../app/interfaces/IRemainingRequests.ts | 5 +++++ .../app/requests/movierequests.component.ts | 4 ++++ .../app/search/moviesearch.component.html | 11 +++++++++-- .../app/search/moviesearch.component.ts | 16 ++++++++++++++-- .../ClientApp/app/services/request.service.ts | 5 +++++ src/Ombi/Controllers/RequestController.cs | 10 ++++++++++ 7 files changed, 50 insertions(+), 5 deletions(-) create mode 100644 src/Ombi/ClientApp/app/interfaces/IRemainingRequests.ts diff --git a/src/Ombi.Core/Engine/MovieRequestEngine.cs b/src/Ombi.Core/Engine/MovieRequestEngine.cs index 7e0b61bd8..a1c0b16cf 100644 --- a/src/Ombi.Core/Engine/MovieRequestEngine.cs +++ b/src/Ombi.Core/Engine/MovieRequestEngine.cs @@ -489,7 +489,9 @@ namespace Ombi.Core.Engine { return new RequestQuotaCountModel() { - HasLimit = false, + HasLimit = true, + Limit = 5, + Remaining = 4, }; } } diff --git a/src/Ombi/ClientApp/app/interfaces/IRemainingRequests.ts b/src/Ombi/ClientApp/app/interfaces/IRemainingRequests.ts new file mode 100644 index 000000000..774f3c5e6 --- /dev/null +++ b/src/Ombi/ClientApp/app/interfaces/IRemainingRequests.ts @@ -0,0 +1,5 @@ +export interface IRemainingRequests { + hasLimit: boolean; + limit: number; + remaining: number; +} \ No newline at end of file diff --git a/src/Ombi/ClientApp/app/requests/movierequests.component.ts b/src/Ombi/ClientApp/app/requests/movierequests.component.ts index db7b400db..9495f0790 100644 --- a/src/Ombi/ClientApp/app/requests/movierequests.component.ts +++ b/src/Ombi/ClientApp/app/requests/movierequests.component.ts @@ -7,6 +7,7 @@ import { debounceTime, distinctUntilChanged } from "rxjs/operators"; import { AuthService } from "../auth/auth.service"; import { FilterType, IFilter, IIssueCategory, IMovieRequests, IPagenator, IRadarrProfile, IRadarrRootFolder, OrderType } from "../interfaces"; import { NotificationService, RadarrService, RequestService } from "../services"; +import { IRemainingRequests } from "../interfaces/IRemainingRequests"; @Component({ selector: "movie-requests", @@ -38,6 +39,8 @@ export class MovieRequestsComponent implements OnInit { public orderType: OrderType = OrderType.RequestedDateDesc; public OrderType = OrderType; + public remaining: IRemainingRequests; + public totalMovies: number = 100; private currentlyLoaded: number; private amountToLoad: number; @@ -80,6 +83,7 @@ export class MovieRequestsComponent implements OnInit { }; this.loadInit(); this.isAdmin = this.auth.hasRole("admin") || this.auth.hasRole("poweruser"); + } public paginate(event: IPagenator) { diff --git a/src/Ombi/ClientApp/app/search/moviesearch.component.html b/src/Ombi/ClientApp/app/search/moviesearch.component.html index 44dc345bc..2e6458eb5 100644 --- a/src/Ombi/ClientApp/app/search/moviesearch.component.html +++ b/src/Ombi/ClientApp/app/search/moviesearch.component.html @@ -1,5 +1,6 @@ 
+
@@ -18,8 +19,14 @@
-
-
+ +

+ {{remaining.remaining}}/{{remaining.limit}} requests remaining. +

+ +
+
+
diff --git a/src/Ombi/ClientApp/app/search/moviesearch.component.ts b/src/Ombi/ClientApp/app/search/moviesearch.component.ts index 824308b21..dd2621ae1 100644 --- a/src/Ombi/ClientApp/app/search/moviesearch.component.ts +++ b/src/Ombi/ClientApp/app/search/moviesearch.component.ts @@ -8,6 +8,7 @@ import { debounceTime, distinctUntilChanged } from "rxjs/operators"; import { AuthService } from "../auth/auth.service"; import { IIssueCategory, IRequestEngineResult, ISearchMovieResult } from "../interfaces"; import { NotificationService, RequestService, SearchService } from "../services"; +import { IRemainingRequests } from "../interfaces/IRemainingRequests"; @Component({ selector: "movie-search", @@ -19,6 +20,7 @@ export class MovieSearchComponent implements OnInit { public searchChanged: Subject = new Subject(); public movieResults: ISearchMovieResult[]; public result: IRequestEngineResult; + public remaining: IRemainingRequests; public searchApplied = false; @Input() public issueCategories: IIssueCategory[]; @@ -35,7 +37,6 @@ export class MovieSearchComponent implements OnInit { private notificationService: NotificationService, private authService: AuthService, private readonly translate: TranslateService, private sanitizer: DomSanitizer, private readonly platformLocation: PlatformLocation) { - this.searchChanged.pipe( debounceTime(600), // Wait Xms after the last event before emitting last event distinctUntilChanged(), // only emit if value is different from previous value @@ -69,10 +70,21 @@ export class MovieSearchComponent implements OnInit { result: false, errorMessage: "", }; + this.remaining = { + hasLimit: false, + limit: 0, + remaining: 0, + }; + this.popularMovies(); - } + this.requestService.getRemainingMovieRequests().subscribe(remaining => { + this.remaining = remaining; + }); + + } public search(text: any) { + this.searchChanged.next(text.target.value); } diff --git a/src/Ombi/ClientApp/app/services/request.service.ts b/src/Ombi/ClientApp/app/services/request.service.ts index 48fa5622d..5345369e7 100644 --- a/src/Ombi/ClientApp/app/services/request.service.ts +++ b/src/Ombi/ClientApp/app/services/request.service.ts @@ -8,6 +8,7 @@ import { TreeNode } from "primeng/primeng"; import { FilterType, IChildRequests, IFilter, IMovieRequestModel, IMovieRequests, IMovieUpdateModel, IRequestEngineResult, IRequestsViewModel, ITvRequests, ITvUpdateModel, OrderType } from "../interfaces"; import { ITvRequestViewModel } from "../interfaces"; import { ServiceHelpers } from "./service.helpers"; +import { IRemainingRequests } from "../interfaces/IRemainingRequests"; @Injectable() export class RequestService extends ServiceHelpers { @@ -15,6 +16,10 @@ export class RequestService extends ServiceHelpers { super(http, "/api/v1/Request/", platformLocation); } + public getRemainingMovieRequests(): Observable { + return this.http.get(`${this.url}movie/remaining`, {headers: this.headers}); + } + public requestMovie(movie: IMovieRequestModel): Observable { return this.http.post(`${this.url}Movie/`, JSON.stringify(movie), {headers: this.headers}); } diff --git a/src/Ombi/Controllers/RequestController.cs b/src/Ombi/Controllers/RequestController.cs index d794f6001..71d09b2ef 100644 --- a/src/Ombi/Controllers/RequestController.cs +++ b/src/Ombi/Controllers/RequestController.cs @@ -12,6 +12,7 @@ using Ombi.Attributes; using Ombi.Core.Models.UI; using Ombi.Models; using Ombi.Store.Entities; +using Ombi.Core.Models; namespace Ombi.Controllers { @@ -464,5 +465,14 @@ namespace Ombi.Controllers await TvRequestEngine.UnSubscribeRequest(requestId, RequestType.TvShow); return true; } + + /// + /// Gets model containing remaining number of requests. + /// + [HttpGet("movie/remaining")] + public async Task GetRemainingRequests() + { + return await MovieRequestEngine.GetRemainingRequests(); + } } } \ No newline at end of file From 3959a79ea8702ceb4776290587e7ec8472f768c2 Mon Sep 17 00:00:00 2001 From: Kenton Royal Date: Sun, 26 Aug 2018 00:04:40 +0100 Subject: [PATCH 04/45] Move to seperate component and display for both TV and movies --- .vscode/launch.json | 46 ++++++++++++++++ .vscode/tasks.json | 15 +++++ src/Ombi.Core/Engine/MovieRequestEngine.cs | 3 +- src/Ombi.Core/Engine/TvRequestEngine.cs | 5 +- .../Models/RequestQuotaCountModel.cs | 4 ++ .../app/interfaces/IRemainingRequests.ts | 1 + .../requests/remainingrequests.component.html | 18 ++++++ .../requests/remainingrequests.component.ts | 55 +++++++++++++++++++ .../app/requests/remainingrequests.module.ts | 32 +++++++++++ .../app/search/moviesearch.component.html | 7 +-- .../app/search/moviesearch.component.ts | 13 +---- .../ClientApp/app/search/search.module.ts | 2 + .../app/search/tvsearch.component.html | 8 +-- .../ClientApp/app/services/request.service.ts | 4 ++ src/Ombi/Controllers/RequestController.cs | 11 +++- 15 files changed, 198 insertions(+), 26 deletions(-) create mode 100644 .vscode/launch.json create mode 100644 .vscode/tasks.json create mode 100644 src/Ombi/ClientApp/app/requests/remainingrequests.component.html create mode 100644 src/Ombi/ClientApp/app/requests/remainingrequests.component.ts create mode 100644 src/Ombi/ClientApp/app/requests/remainingrequests.module.ts diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 000000000..3e98c769e --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,46 @@ +{ + // Use IntelliSense to find out which attributes exist for C# debugging + // Use hover for the description of the existing attributes + // For further information visit https://github.com/OmniSharp/omnisharp-vscode/blob/master/debugger-launchjson.md + "version": "0.2.0", + "configurations": [ + { + "name": ".NET Core Launch (web)", + "type": "coreclr", + "request": "launch", + "preLaunchTask": "build", + // If you have changed target frameworks, make sure to update the program path. + "program": "${workspaceFolder}/src/Ombi/bin/Debug/netcoreapp2.1/Ombi.dll", + "args": [], + "cwd": "${workspaceFolder}/src/Ombi", + "stopAtEntry": false, + "internalConsoleOptions": "openOnSessionStart", + "launchBrowser": { + "enabled": false, + "args": "${auto-detect-url}", + "windows": { + "command": "cmd.exe", + "args": "/C start ${auto-detect-url}" + }, + "osx": { + "command": "open" + }, + "linux": { + "command": "xdg-open" + } + }, + "env": { + "ASPNETCORE_ENVIRONMENT": "Development" + }, + "sourceFileMap": { + "/Views": "${workspaceFolder}/Views" + } + }, + { + "name": ".NET Core Attach", + "type": "coreclr", + "request": "attach", + "processId": "${command:pickProcess}" + } + ,] +} \ No newline at end of file diff --git a/.vscode/tasks.json b/.vscode/tasks.json new file mode 100644 index 000000000..af3542206 --- /dev/null +++ b/.vscode/tasks.json @@ -0,0 +1,15 @@ +{ + "version": "2.0.0", + "tasks": [ + { + "label": "build", + "command": "dotnet", + "type": "process", + "args": [ + "build", + "${workspaceFolder}/src/Ombi/Ombi.csproj" + ], + "problemMatcher": "$msCompile" + } + ] +} \ No newline at end of file diff --git a/src/Ombi.Core/Engine/MovieRequestEngine.cs b/src/Ombi.Core/Engine/MovieRequestEngine.cs index a1c0b16cf..d40c3e7b8 100644 --- a/src/Ombi.Core/Engine/MovieRequestEngine.cs +++ b/src/Ombi.Core/Engine/MovieRequestEngine.cs @@ -489,9 +489,10 @@ namespace Ombi.Core.Engine { return new RequestQuotaCountModel() { - HasLimit = true, + HasLimit = false, Limit = 5, Remaining = 4, + NextRequest = DateTime.Parse("2018-08-27T00:00:00+01"), }; } } diff --git a/src/Ombi.Core/Engine/TvRequestEngine.cs b/src/Ombi.Core/Engine/TvRequestEngine.cs index 78a26f82a..80e627ade 100644 --- a/src/Ombi.Core/Engine/TvRequestEngine.cs +++ b/src/Ombi.Core/Engine/TvRequestEngine.cs @@ -618,7 +618,10 @@ namespace Ombi.Core.Engine { return new RequestQuotaCountModel() { - HasLimit = false, + HasLimit = true, + Limit = 5, + Remaining = 4, + NextRequest = DateTime.Parse("2018-08-30T00:00:00+01"), }; } } diff --git a/src/Ombi.Core/Models/RequestQuotaCountModel.cs b/src/Ombi.Core/Models/RequestQuotaCountModel.cs index 23a692f41..1af9ad819 100644 --- a/src/Ombi.Core/Models/RequestQuotaCountModel.cs +++ b/src/Ombi.Core/Models/RequestQuotaCountModel.cs @@ -1,3 +1,5 @@ +using System; + namespace Ombi.Core.Models { public class RequestQuotaCountModel @@ -7,5 +9,7 @@ namespace Ombi.Core.Models public int Limit { get; set; } public int Remaining { get; set; } + + public DateTime NextRequest { get; set; } } } \ No newline at end of file diff --git a/src/Ombi/ClientApp/app/interfaces/IRemainingRequests.ts b/src/Ombi/ClientApp/app/interfaces/IRemainingRequests.ts index 774f3c5e6..ce1b37427 100644 --- a/src/Ombi/ClientApp/app/interfaces/IRemainingRequests.ts +++ b/src/Ombi/ClientApp/app/interfaces/IRemainingRequests.ts @@ -2,4 +2,5 @@ export interface IRemainingRequests { hasLimit: boolean; limit: number; remaining: number; + nextRequest: Date; } \ No newline at end of file diff --git a/src/Ombi/ClientApp/app/requests/remainingrequests.component.html b/src/Ombi/ClientApp/app/requests/remainingrequests.component.html new file mode 100644 index 000000000..769cd79c2 --- /dev/null +++ b/src/Ombi/ClientApp/app/requests/remainingrequests.component.html @@ -0,0 +1,18 @@ +
+

+ {{remaining.remaining}}/{{remaining.limit}} requests remaining +

+

+ Another request will be added in {{daysUntil}} {{daysUntil == 1 ? "day" : "days"}} +

+

+ Another request will be added in {{hoursUntil}} {{hoursUntil == 1 ? "hour" : "hours"}} +

+

+ Another request will be added in {{minutesUntil}} {{minutesUntil == 1 ? "minute" : "minutes"}} +

+
+ +
+
+ diff --git a/src/Ombi/ClientApp/app/requests/remainingrequests.component.ts b/src/Ombi/ClientApp/app/requests/remainingrequests.component.ts new file mode 100644 index 000000000..1279a60e9 --- /dev/null +++ b/src/Ombi/ClientApp/app/requests/remainingrequests.component.ts @@ -0,0 +1,55 @@ +import { Component, OnInit, Input } from "@angular/core"; +import { RequestService } from "../services"; +import { IRemainingRequests } from "../interfaces/IRemainingRequests"; + +@Component({ + selector: "remaining-requests", + templateUrl: "./remainingrequests.component.html", +}) + +export class RemainingRequestsComponent implements OnInit { + public remaining: IRemainingRequests; + @Input() public movie: boolean; + public daysUntil: number; + public hoursUntil: number; + public minutesUntil: number; + + constructor(private requestService: RequestService) + { + } + + ngOnInit(): void { + var self = this; + this.update(); + setInterval(function(){ + self.update() + }, 10000) + } + + update(): void { + var callback = (remaining => { + this.remaining = remaining; + this.daysUntil = Math.ceil(this.daysUntilNextRequest()); + this.hoursUntil = Math.ceil(this.hoursUntilNextRequest()); + this.minutesUntil = Math.ceil(this.minutesUntilNextRequest()) + }); + + if (this.movie) { + this.requestService.getRemainingMovieRequests().subscribe(callback); + } else { + this.requestService.getRemainingTvRequests().subscribe(callback); + } + } + + daysUntilNextRequest(): number { + return (new Date(this.remaining.nextRequest).getTime() - new Date().getTime()) / 1000 / 60 / 60 / 24; + } + + hoursUntilNextRequest(): number { + return (new Date(this.remaining.nextRequest).getTime() - new Date().getTime()) / 1000 / 60 / 60; + } + + minutesUntilNextRequest(): number { + return (new Date(this.remaining.nextRequest).getTime() - new Date().getTime()) / 1000 / 60; + } +} \ No newline at end of file diff --git a/src/Ombi/ClientApp/app/requests/remainingrequests.module.ts b/src/Ombi/ClientApp/app/requests/remainingrequests.module.ts new file mode 100644 index 000000000..acbbed256 --- /dev/null +++ b/src/Ombi/ClientApp/app/requests/remainingrequests.module.ts @@ -0,0 +1,32 @@ +import { CommonModule } from "@angular/common"; +import { NgModule } from "@angular/core"; +import { FormsModule } from "@angular/forms"; +import { RouterModule } from "@angular/router"; + +import { NgbModule } from "@ng-bootstrap/ng-bootstrap"; + +import { SidebarModule, TooltipModule, TreeTableModule } from "primeng/primeng"; +import { RequestService } from "../services"; + +import { SharedModule } from "../shared/shared.module"; + +@NgModule({ + imports: [ + CommonModule, + FormsModule, + NgbModule.forRoot(), + TreeTableModule, + SharedModule, + SidebarModule, + TooltipModule, + ], + declarations: [ + ], + exports: [ + RouterModule, + ], + providers: [ + RequestService, + ], +}) +export class SearchModule { } diff --git a/src/Ombi/ClientApp/app/search/moviesearch.component.html b/src/Ombi/ClientApp/app/search/moviesearch.component.html index 2e6458eb5..2e5a17559 100644 --- a/src/Ombi/ClientApp/app/search/moviesearch.component.html +++ b/src/Ombi/ClientApp/app/search/moviesearch.component.html @@ -20,12 +20,7 @@
-

- {{remaining.remaining}}/{{remaining.limit}} requests remaining. -

- -
-
+
diff --git a/src/Ombi/ClientApp/app/search/moviesearch.component.ts b/src/Ombi/ClientApp/app/search/moviesearch.component.ts index dd2621ae1..afd217089 100644 --- a/src/Ombi/ClientApp/app/search/moviesearch.component.ts +++ b/src/Ombi/ClientApp/app/search/moviesearch.component.ts @@ -8,7 +8,6 @@ import { debounceTime, distinctUntilChanged } from "rxjs/operators"; import { AuthService } from "../auth/auth.service"; import { IIssueCategory, IRequestEngineResult, ISearchMovieResult } from "../interfaces"; import { NotificationService, RequestService, SearchService } from "../services"; -import { IRemainingRequests } from "../interfaces/IRemainingRequests"; @Component({ selector: "movie-search", @@ -20,7 +19,7 @@ export class MovieSearchComponent implements OnInit { public searchChanged: Subject = new Subject(); public movieResults: ISearchMovieResult[]; public result: IRequestEngineResult; - public remaining: IRemainingRequests; + public searchApplied = false; @Input() public issueCategories: IIssueCategory[]; @@ -70,18 +69,8 @@ export class MovieSearchComponent implements OnInit { result: false, errorMessage: "", }; - this.remaining = { - hasLimit: false, - limit: 0, - remaining: 0, - }; this.popularMovies(); - - this.requestService.getRemainingMovieRequests().subscribe(remaining => { - this.remaining = remaining; - }); - } public search(text: any) { diff --git a/src/Ombi/ClientApp/app/search/search.module.ts b/src/Ombi/ClientApp/app/search/search.module.ts index 855207616..c2a309819 100644 --- a/src/Ombi/ClientApp/app/search/search.module.ts +++ b/src/Ombi/ClientApp/app/search/search.module.ts @@ -19,6 +19,7 @@ import { SearchService } from "../services"; import { AuthGuard } from "../auth/auth.guard"; import { SharedModule } from "../shared/shared.module"; +import { RemainingRequestsComponent } from "../requests/remainingrequests.component"; const routes: Routes = [ { path: "", component: SearchComponent, canActivate: [AuthGuard] }, @@ -41,6 +42,7 @@ const routes: Routes = [ TvSearchComponent, SeriesInformationComponent, MovieSearchGridComponent, + RemainingRequestsComponent, ], exports: [ RouterModule, diff --git a/src/Ombi/ClientApp/app/search/tvsearch.component.html b/src/Ombi/ClientApp/app/search/tvsearch.component.html index 48e83578d..37453c97d 100644 --- a/src/Ombi/ClientApp/app/search/tvsearch.component.html +++ b/src/Ombi/ClientApp/app/search/tvsearch.component.html @@ -26,15 +26,13 @@
-
-
+ + +
- -
-
diff --git a/src/Ombi/ClientApp/app/services/request.service.ts b/src/Ombi/ClientApp/app/services/request.service.ts index 5345369e7..4434b7839 100644 --- a/src/Ombi/ClientApp/app/services/request.service.ts +++ b/src/Ombi/ClientApp/app/services/request.service.ts @@ -20,6 +20,10 @@ export class RequestService extends ServiceHelpers { return this.http.get(`${this.url}movie/remaining`, {headers: this.headers}); } + public getRemainingTvRequests(): Observable { + return this.http.get(`${this.url}tv/remaining`, {headers: this.headers}); + } + public requestMovie(movie: IMovieRequestModel): Observable { return this.http.post(`${this.url}Movie/`, JSON.stringify(movie), {headers: this.headers}); } diff --git a/src/Ombi/Controllers/RequestController.cs b/src/Ombi/Controllers/RequestController.cs index 71d09b2ef..f2412727f 100644 --- a/src/Ombi/Controllers/RequestController.cs +++ b/src/Ombi/Controllers/RequestController.cs @@ -470,9 +470,18 @@ namespace Ombi.Controllers /// Gets model containing remaining number of requests. /// [HttpGet("movie/remaining")] - public async Task GetRemainingRequests() + public async Task GetRemainingMovieRequests() { return await MovieRequestEngine.GetRemainingRequests(); } + + /// + /// Gets model containing remaining number of requests. + /// + [HttpGet("tv/remaining")] + public async Task GetRemainingTvRequests() + { + return await TvRequestEngine.GetRemainingRequests(); + } } } \ No newline at end of file From 6ebe2deb52c12e16e33ccec1102a46b2ebc0738b Mon Sep 17 00:00:00 2001 From: Kenton Royal Date: Sun, 26 Aug 2018 00:43:18 +0100 Subject: [PATCH 05/45] Add logic for retriving request information --- src/Ombi.Core/Engine/TvRequestEngine.cs | 29 ++++++++++++++++++++++--- 1 file changed, 26 insertions(+), 3 deletions(-) diff --git a/src/Ombi.Core/Engine/TvRequestEngine.cs b/src/Ombi.Core/Engine/TvRequestEngine.cs index 80e627ade..da61b018a 100644 --- a/src/Ombi.Core/Engine/TvRequestEngine.cs +++ b/src/Ombi.Core/Engine/TvRequestEngine.cs @@ -616,12 +616,35 @@ namespace Ombi.Core.Engine public async Task GetRemainingRequests() { + OmbiUser user = await GetUser(); + int limit = user.EpisodeRequestLimit ?? 0; + + if (limit <= 0) + { + return new RequestQuotaCountModel() + { + HasLimit = false, + Limit = 0, + Remaining = 0, + NextRequest = DateTime.Now, + }; + } + + IQueryable log = _requestLog.GetAll().Where(x => x.UserId == user.Id && x.RequestType == RequestType.TvShow); + + int count = limit - await log.CountAsync(x => x.RequestDate >= DateTime.UtcNow.AddDays(-7)); + + DateTime oldestRequestedAt = await log.Where(x => x.RequestDate >= DateTime.UtcNow.AddDays(-7)) + .OrderBy(x => x.RequestDate) + .Select(x => x.RequestDate) + .FirstOrDefaultAsync(); + return new RequestQuotaCountModel() { HasLimit = true, - Limit = 5, - Remaining = 4, - NextRequest = DateTime.Parse("2018-08-30T00:00:00+01"), + Limit = limit, + Remaining = count, + NextRequest = oldestRequestedAt.AddDays(7), }; } } From 0e46e66a6d50400e03c409d292de2ba8027923b6 Mon Sep 17 00:00:00 2001 From: Kenton Royal Date: Sun, 26 Aug 2018 00:50:05 +0100 Subject: [PATCH 06/45] Add logic for movie request count --- src/Ombi.Core/Engine/MovieRequestEngine.cs | 31 +++++++++++++++++++--- 1 file changed, 27 insertions(+), 4 deletions(-) diff --git a/src/Ombi.Core/Engine/MovieRequestEngine.cs b/src/Ombi.Core/Engine/MovieRequestEngine.cs index d40c3e7b8..5cea34627 100644 --- a/src/Ombi.Core/Engine/MovieRequestEngine.cs +++ b/src/Ombi.Core/Engine/MovieRequestEngine.cs @@ -487,12 +487,35 @@ namespace Ombi.Core.Engine public async Task GetRemainingRequests() { + OmbiUser user = await GetUser(); + int limit = user.MovieRequestLimit ?? 0; + + if (limit <= 0) + { + return new RequestQuotaCountModel() + { + HasLimit = false, + Limit = 0, + Remaining = 0, + NextRequest = DateTime.Now, + }; + } + + IQueryable log = _requestLog.GetAll().Where(x => x.UserId == user.Id && x.RequestType == RequestType.Movie); + + int count = limit - await log.CountAsync(x => x.RequestDate >= DateTime.UtcNow.AddDays(-7)); + + DateTime oldestRequestedAt = await log.Where(x => x.RequestDate >= DateTime.UtcNow.AddDays(-7)) + .OrderBy(x => x.RequestDate) + .Select(x => x.RequestDate) + .FirstOrDefaultAsync(); + return new RequestQuotaCountModel() { - HasLimit = false, - Limit = 5, - Remaining = 4, - NextRequest = DateTime.Parse("2018-08-27T00:00:00+01"), + HasLimit = true, + Limit = limit, + Remaining = count, + NextRequest = oldestRequestedAt.AddDays(7), }; } } From b30a2c09501b05c198221768291961649a8a6777 Mon Sep 17 00:00:00 2001 From: Kenton Royal Date: Sun, 26 Aug 2018 01:34:44 +0100 Subject: [PATCH 07/45] Trigger update of request limit on new request --- .../app/requests/remainingrequests.component.ts | 17 +++++++++++++---- .../app/search/moviesearch.component.html | 2 +- .../app/search/moviesearch.component.ts | 6 ++++-- .../app/search/seriesinformation.component.ts | 3 ++- .../app/search/tvsearch.component.html | 2 +- .../ClientApp/app/search/tvsearch.component.ts | 5 ++++- 6 files changed, 25 insertions(+), 10 deletions(-) diff --git a/src/Ombi/ClientApp/app/requests/remainingrequests.component.ts b/src/Ombi/ClientApp/app/requests/remainingrequests.component.ts index 1279a60e9..39f6ca200 100644 --- a/src/Ombi/ClientApp/app/requests/remainingrequests.component.ts +++ b/src/Ombi/ClientApp/app/requests/remainingrequests.component.ts @@ -21,17 +21,20 @@ export class RemainingRequestsComponent implements OnInit { ngOnInit(): void { var self = this; this.update(); + setInterval(function(){ - self.update() + self.calculateTime(); }, 10000) + + setInterval(function(){ + self.update() + }, 60000) } update(): void { var callback = (remaining => { this.remaining = remaining; - this.daysUntil = Math.ceil(this.daysUntilNextRequest()); - this.hoursUntil = Math.ceil(this.hoursUntilNextRequest()); - this.minutesUntil = Math.ceil(this.minutesUntilNextRequest()) + this.calculateTime(); }); if (this.movie) { @@ -41,6 +44,12 @@ export class RemainingRequestsComponent implements OnInit { } } + calculateTime(): void { + this.daysUntil = Math.ceil(this.daysUntilNextRequest()); + this.hoursUntil = Math.ceil(this.hoursUntilNextRequest()); + this.minutesUntil = Math.ceil(this.minutesUntilNextRequest()) + } + daysUntilNextRequest(): number { return (new Date(this.remaining.nextRequest).getTime() - new Date().getTime()) / 1000 / 60 / 60 / 24; } diff --git a/src/Ombi/ClientApp/app/search/moviesearch.component.html b/src/Ombi/ClientApp/app/search/moviesearch.component.html index 2e5a17559..6d8c040ac 100644 --- a/src/Ombi/ClientApp/app/search/moviesearch.component.html +++ b/src/Ombi/ClientApp/app/search/moviesearch.component.html @@ -20,7 +20,7 @@
- +
diff --git a/src/Ombi/ClientApp/app/search/moviesearch.component.ts b/src/Ombi/ClientApp/app/search/moviesearch.component.ts index afd217089..a6a009962 100644 --- a/src/Ombi/ClientApp/app/search/moviesearch.component.ts +++ b/src/Ombi/ClientApp/app/search/moviesearch.component.ts @@ -1,5 +1,5 @@ import { PlatformLocation } from "@angular/common"; -import { Component, Input, OnInit } from "@angular/core"; +import { Component, Input, OnInit, ViewChild } from "@angular/core"; import { DomSanitizer } from "@angular/platform-browser"; import { TranslateService } from "@ngx-translate/core"; import { Subject } from "rxjs"; @@ -8,6 +8,7 @@ import { debounceTime, distinctUntilChanged } from "rxjs/operators"; import { AuthService } from "../auth/auth.service"; import { IIssueCategory, IRequestEngineResult, ISearchMovieResult } from "../interfaces"; import { NotificationService, RequestService, SearchService } from "../services"; +import { RemainingRequestsComponent } from "../requests/remainingrequests.component"; @Component({ selector: "movie-search", @@ -24,6 +25,7 @@ export class MovieSearchComponent implements OnInit { @Input() public issueCategories: IIssueCategory[]; @Input() public issuesEnabled: boolean; + @ViewChild('remainingFilms') public remainingRequestsComponent: RemainingRequestsComponent; public issuesBarVisible = false; public issueRequestTitle: string; public issueRequestId: number; @@ -89,7 +91,7 @@ export class MovieSearchComponent implements OnInit { this.requestService.requestMovie({ theMovieDbId: searchResult.id }) .subscribe(x => { this.result = x; - + this.remainingRequestsComponent.update(); if (this.result.result) { this.translate.get("Search.RequestAdded", { title: searchResult.title }).subscribe(x => { this.notificationService.success(x); diff --git a/src/Ombi/ClientApp/app/search/seriesinformation.component.ts b/src/Ombi/ClientApp/app/search/seriesinformation.component.ts index cc8701a5b..27cdaf684 100644 --- a/src/Ombi/ClientApp/app/search/seriesinformation.component.ts +++ b/src/Ombi/ClientApp/app/search/seriesinformation.component.ts @@ -1,4 +1,4 @@ -import { Component, Input, OnInit} from "@angular/core"; +import { Component, Input, OnInit, ViewChild} from "@angular/core"; import { NotificationService } from "../services"; import { RequestService } from "../services"; @@ -7,6 +7,7 @@ import { SearchService } from "../services"; import { INewSeasonRequests, IRequestEngineResult, ISeasonsViewModel, ITvRequestViewModel } from "../interfaces"; import { IEpisodesRequests } from "../interfaces"; import { ISearchTvResult } from "../interfaces"; +import { RemainingRequestsComponent } from "../requests/remainingrequests.component"; @Component({ selector: "seriesinformation", diff --git a/src/Ombi/ClientApp/app/search/tvsearch.component.html b/src/Ombi/ClientApp/app/search/tvsearch.component.html index 37453c97d..5f4938cf1 100644 --- a/src/Ombi/ClientApp/app/search/tvsearch.component.html +++ b/src/Ombi/ClientApp/app/search/tvsearch.component.html @@ -27,7 +27,7 @@
- +
diff --git a/src/Ombi/ClientApp/app/search/tvsearch.component.ts b/src/Ombi/ClientApp/app/search/tvsearch.component.ts index a41f34586..b18b1343a 100644 --- a/src/Ombi/ClientApp/app/search/tvsearch.component.ts +++ b/src/Ombi/ClientApp/app/search/tvsearch.component.ts @@ -1,5 +1,5 @@ import { PlatformLocation } from "@angular/common"; -import { Component, Input, OnInit } from "@angular/core"; +import { Component, Input, OnInit, ViewChild } from "@angular/core"; import { DomSanitizer } from "@angular/platform-browser"; import { Subject } from "rxjs"; import { debounceTime, distinctUntilChanged } from "rxjs/operators"; @@ -7,6 +7,7 @@ import { debounceTime, distinctUntilChanged } from "rxjs/operators"; import { AuthService } from "../auth/auth.service"; import { IIssueCategory, IRequestEngineResult, ISearchTvResult, ISeasonsViewModel, ITvRequestViewModel } from "../interfaces"; import { ImageService, NotificationService, RequestService, SearchService } from "../services"; +import { RemainingRequestsComponent } from "../requests/remainingrequests.component"; @Component({ selector: "tv-search", @@ -24,6 +25,7 @@ export class TvSearchComponent implements OnInit { @Input() public issueCategories: IIssueCategory[]; @Input() public issuesEnabled: boolean; + @ViewChild('remainingTvShows') public remainingRequestsComponent: RemainingRequestsComponent; public issuesBarVisible = false; public issueRequestTitle: string; public issueRequestId: number; @@ -162,6 +164,7 @@ export class TvSearchComponent implements OnInit { this.requestService.requestTv(viewModel) .subscribe(x => { this.result = x; + this.remainingRequestsComponent.update(); if (this.result.result) { this.notificationService.success( `Request for ${searchResult.title} has been added successfully`); From c5e396a9e846c71fbf1b4dd5dd77b44bcf27f54b Mon Sep 17 00:00:00 2001 From: Kenton Royal Date: Sun, 26 Aug 2018 14:19:37 +0100 Subject: [PATCH 08/45] Fix issues with remaining count updating --- .../requests/remainingrequests.component.ts | 4 +++ .../app/search/moviesearch.component.ts | 5 +--- .../app/search/seriesinformation.component.ts | 3 +-- .../app/search/tvsearch.component.ts | 5 +--- .../ClientApp/app/services/request.service.ts | 25 ++++++++++++++++--- 5 files changed, 29 insertions(+), 13 deletions(-) diff --git a/src/Ombi/ClientApp/app/requests/remainingrequests.component.ts b/src/Ombi/ClientApp/app/requests/remainingrequests.component.ts index 39f6ca200..9e64b0013 100644 --- a/src/Ombi/ClientApp/app/requests/remainingrequests.component.ts +++ b/src/Ombi/ClientApp/app/requests/remainingrequests.component.ts @@ -22,6 +22,10 @@ export class RemainingRequestsComponent implements OnInit { var self = this; this.update(); + this.requestService.onRequested().subscribe(m => { + this.update(); + }); + setInterval(function(){ self.calculateTime(); }, 10000) diff --git a/src/Ombi/ClientApp/app/search/moviesearch.component.ts b/src/Ombi/ClientApp/app/search/moviesearch.component.ts index a6a009962..965837bae 100644 --- a/src/Ombi/ClientApp/app/search/moviesearch.component.ts +++ b/src/Ombi/ClientApp/app/search/moviesearch.component.ts @@ -1,5 +1,5 @@ import { PlatformLocation } from "@angular/common"; -import { Component, Input, OnInit, ViewChild } from "@angular/core"; +import { Component, Input, OnInit } from "@angular/core"; import { DomSanitizer } from "@angular/platform-browser"; import { TranslateService } from "@ngx-translate/core"; import { Subject } from "rxjs"; @@ -8,7 +8,6 @@ import { debounceTime, distinctUntilChanged } from "rxjs/operators"; import { AuthService } from "../auth/auth.service"; import { IIssueCategory, IRequestEngineResult, ISearchMovieResult } from "../interfaces"; import { NotificationService, RequestService, SearchService } from "../services"; -import { RemainingRequestsComponent } from "../requests/remainingrequests.component"; @Component({ selector: "movie-search", @@ -25,7 +24,6 @@ export class MovieSearchComponent implements OnInit { @Input() public issueCategories: IIssueCategory[]; @Input() public issuesEnabled: boolean; - @ViewChild('remainingFilms') public remainingRequestsComponent: RemainingRequestsComponent; public issuesBarVisible = false; public issueRequestTitle: string; public issueRequestId: number; @@ -91,7 +89,6 @@ export class MovieSearchComponent implements OnInit { this.requestService.requestMovie({ theMovieDbId: searchResult.id }) .subscribe(x => { this.result = x; - this.remainingRequestsComponent.update(); if (this.result.result) { this.translate.get("Search.RequestAdded", { title: searchResult.title }).subscribe(x => { this.notificationService.success(x); diff --git a/src/Ombi/ClientApp/app/search/seriesinformation.component.ts b/src/Ombi/ClientApp/app/search/seriesinformation.component.ts index 27cdaf684..5c0088268 100644 --- a/src/Ombi/ClientApp/app/search/seriesinformation.component.ts +++ b/src/Ombi/ClientApp/app/search/seriesinformation.component.ts @@ -1,4 +1,4 @@ -import { Component, Input, OnInit, ViewChild} from "@angular/core"; +import { Component, Input, OnInit } from "@angular/core"; import { NotificationService } from "../services"; import { RequestService } from "../services"; @@ -7,7 +7,6 @@ import { SearchService } from "../services"; import { INewSeasonRequests, IRequestEngineResult, ISeasonsViewModel, ITvRequestViewModel } from "../interfaces"; import { IEpisodesRequests } from "../interfaces"; import { ISearchTvResult } from "../interfaces"; -import { RemainingRequestsComponent } from "../requests/remainingrequests.component"; @Component({ selector: "seriesinformation", diff --git a/src/Ombi/ClientApp/app/search/tvsearch.component.ts b/src/Ombi/ClientApp/app/search/tvsearch.component.ts index b18b1343a..a41f34586 100644 --- a/src/Ombi/ClientApp/app/search/tvsearch.component.ts +++ b/src/Ombi/ClientApp/app/search/tvsearch.component.ts @@ -1,5 +1,5 @@ import { PlatformLocation } from "@angular/common"; -import { Component, Input, OnInit, ViewChild } from "@angular/core"; +import { Component, Input, OnInit } from "@angular/core"; import { DomSanitizer } from "@angular/platform-browser"; import { Subject } from "rxjs"; import { debounceTime, distinctUntilChanged } from "rxjs/operators"; @@ -7,7 +7,6 @@ import { debounceTime, distinctUntilChanged } from "rxjs/operators"; import { AuthService } from "../auth/auth.service"; import { IIssueCategory, IRequestEngineResult, ISearchTvResult, ISeasonsViewModel, ITvRequestViewModel } from "../interfaces"; import { ImageService, NotificationService, RequestService, SearchService } from "../services"; -import { RemainingRequestsComponent } from "../requests/remainingrequests.component"; @Component({ selector: "tv-search", @@ -25,7 +24,6 @@ export class TvSearchComponent implements OnInit { @Input() public issueCategories: IIssueCategory[]; @Input() public issuesEnabled: boolean; - @ViewChild('remainingTvShows') public remainingRequestsComponent: RemainingRequestsComponent; public issuesBarVisible = false; public issueRequestTitle: string; public issueRequestId: number; @@ -164,7 +162,6 @@ export class TvSearchComponent implements OnInit { this.requestService.requestTv(viewModel) .subscribe(x => { this.result = x; - this.remainingRequestsComponent.update(); if (this.result.result) { this.notificationService.success( `Request for ${searchResult.title} has been added successfully`); diff --git a/src/Ombi/ClientApp/app/services/request.service.ts b/src/Ombi/ClientApp/app/services/request.service.ts index 4434b7839..7940c43d6 100644 --- a/src/Ombi/ClientApp/app/services/request.service.ts +++ b/src/Ombi/ClientApp/app/services/request.service.ts @@ -2,7 +2,7 @@ import { PlatformLocation } from "@angular/common"; import { Injectable } from "@angular/core"; import { HttpClient } from "@angular/common/http"; -import { Observable } from "rxjs"; +import { Observable, ReplaySubject } from "rxjs"; import { TreeNode } from "primeng/primeng"; import { FilterType, IChildRequests, IFilter, IMovieRequestModel, IMovieRequests, IMovieUpdateModel, IRequestEngineResult, IRequestsViewModel, ITvRequests, ITvUpdateModel, OrderType } from "../interfaces"; @@ -12,10 +12,15 @@ import { IRemainingRequests } from "../interfaces/IRemainingRequests"; @Injectable() export class RequestService extends ServiceHelpers { + private requestEvents = new ReplaySubject(); constructor(http: HttpClient, public platformLocation: PlatformLocation) { super(http, "/api/v1/Request/", platformLocation); } + public onRequested(): Observable { + return this.requestEvents.asObservable(); + } + public getRemainingMovieRequests(): Observable { return this.http.get(`${this.url}movie/remaining`, {headers: this.headers}); } @@ -25,7 +30,14 @@ export class RequestService extends ServiceHelpers { } public requestMovie(movie: IMovieRequestModel): Observable { - return this.http.post(`${this.url}Movie/`, JSON.stringify(movie), {headers: this.headers}); + var observer = Observable.create(observer => { + this.http.post(`${this.url}Movie/`, JSON.stringify(movie), {headers: this.headers}).subscribe(m => { + observer.next(m); + this.requestEvents.next(m); + }); + }); + + return observer; } public getTotalMovies(): Observable { @@ -37,7 +49,14 @@ export class RequestService extends ServiceHelpers { } public requestTv(tv: ITvRequestViewModel): Observable { - return this.http.post(`${this.url}TV/`, JSON.stringify(tv), {headers: this.headers}); + var observer = Observable.create(observer => { + return this.http.post(`${this.url}TV/`, JSON.stringify(tv), { headers: this.headers }).subscribe(m => { + observer.next(m); + this.requestEvents.next(m); + }); + }); + + return observer; } public approveMovie(movie: IMovieUpdateModel): Observable { From b7e5e3dfb4b1fc1d727a16b06565e3138b2ca44c Mon Sep 17 00:00:00 2001 From: Kenton Royal Date: Sun, 26 Aug 2018 17:34:00 +0100 Subject: [PATCH 09/45] Fix bug with TV requests in which requesting a seasion would treat request as single episode --- src/Ombi.Core/Engine/TvRequestEngine.cs | 8 +++++++- src/Ombi.Core/Rule/Rules/Request/RequestLimitRule.cs | 9 +++++++-- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/src/Ombi.Core/Engine/TvRequestEngine.cs b/src/Ombi.Core/Engine/TvRequestEngine.cs index da61b018a..939b0fe3e 100644 --- a/src/Ombi.Core/Engine/TvRequestEngine.cs +++ b/src/Ombi.Core/Engine/TvRequestEngine.cs @@ -609,6 +609,7 @@ namespace Ombi.Core.Engine RequestDate = DateTime.UtcNow, RequestId = model.Id, RequestType = RequestType.TvShow, + EpisodeCount = model.SeasonRequests.Select(m => m.Episodes.Count).Sum(), }); return new RequestEngineResult { Result = true }; @@ -632,7 +633,12 @@ namespace Ombi.Core.Engine IQueryable log = _requestLog.GetAll().Where(x => x.UserId == user.Id && x.RequestType == RequestType.TvShow); - int count = limit - await log.CountAsync(x => x.RequestDate >= DateTime.UtcNow.AddDays(-7)); + // Needed, due to a bug which would cause all episode counts to be 0 + int zeroEpisodeCount = await log.Where(x => x.EpisodeCount == 0).Select(x => x.EpisodeCount).CountAsync(); + + int episodeCount = await log.Where(x => x.EpisodeCount != 0).Select(x => x.EpisodeCount).SumAsync(); + + int count = limit - (zeroEpisodeCount + episodeCount); DateTime oldestRequestedAt = await log.Where(x => x.RequestDate >= DateTime.UtcNow.AddDays(-7)) .OrderBy(x => x.RequestDate) diff --git a/src/Ombi.Core/Rule/Rules/Request/RequestLimitRule.cs b/src/Ombi.Core/Rule/Rules/Request/RequestLimitRule.cs index a19ac1df8..4d5fcf8e2 100644 --- a/src/Ombi.Core/Rule/Rules/Request/RequestLimitRule.cs +++ b/src/Ombi.Core/Rule/Rules/Request/RequestLimitRule.cs @@ -88,8 +88,13 @@ namespace Ombi.Core.Rule.Rules.Request // Count how many requests in the past 7 days var tv = tvLogs.Where(x => x.RequestDate >= DateTime.UtcNow.AddDays(-7)); - var count = await tv.Select(x => x.EpisodeCount).CountAsync(); - count += requestCount; // Add the amount of requests in + + // Needed, due to a bug which would cause all episode counts to be 0 + var zeroEpisodeCount = await tv.Where(x => x.EpisodeCount == 0).Select(x => x.EpisodeCount).CountAsync(); + + var episodeCount = await tv.Where(x => x.EpisodeCount != 0).Select(x => x.EpisodeCount).SumAsync(); + + var count = requestCount + episodeCount + zeroEpisodeCount; // Add the amount of requests in if (count > episodeLimit) { return Fail("You have exceeded your Episode request quota!"); From 0b620e9ad4000db5d903544248dad05944f8a12c Mon Sep 17 00:00:00 2001 From: Kenton Royal Date: Sun, 26 Aug 2018 17:42:28 +0100 Subject: [PATCH 10/45] Fix bug when submitting requests for multiple episodes accross multiple seasons --- src/Ombi.Core/Rule/Rules/Request/RequestLimitRule.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Ombi.Core/Rule/Rules/Request/RequestLimitRule.cs b/src/Ombi.Core/Rule/Rules/Request/RequestLimitRule.cs index 4d5fcf8e2..64cd6c076 100644 --- a/src/Ombi.Core/Rule/Rules/Request/RequestLimitRule.cs +++ b/src/Ombi.Core/Rule/Rules/Request/RequestLimitRule.cs @@ -81,7 +81,7 @@ namespace Ombi.Core.Rule.Rules.Request // Get the count of requests to be made foreach (var s in child.SeasonRequests) { - requestCount = s.Episodes.Count; + requestCount += s.Episodes.Count; } var tvLogs = requestLog.Where(x => x.RequestType == RequestType.TvShow); From 62416e3538b7f170a3a491bc78283c2c00fbdd57 Mon Sep 17 00:00:00 2001 From: Kenton Royal Date: Sun, 26 Aug 2018 18:49:33 +0100 Subject: [PATCH 11/45] Remove local vscode files --- .vscode/launch.json | 46 --------------------------------------------- .vscode/tasks.json | 15 --------------- 2 files changed, 61 deletions(-) delete mode 100644 .vscode/launch.json delete mode 100644 .vscode/tasks.json diff --git a/.vscode/launch.json b/.vscode/launch.json deleted file mode 100644 index 3e98c769e..000000000 --- a/.vscode/launch.json +++ /dev/null @@ -1,46 +0,0 @@ -{ - // Use IntelliSense to find out which attributes exist for C# debugging - // Use hover for the description of the existing attributes - // For further information visit https://github.com/OmniSharp/omnisharp-vscode/blob/master/debugger-launchjson.md - "version": "0.2.0", - "configurations": [ - { - "name": ".NET Core Launch (web)", - "type": "coreclr", - "request": "launch", - "preLaunchTask": "build", - // If you have changed target frameworks, make sure to update the program path. - "program": "${workspaceFolder}/src/Ombi/bin/Debug/netcoreapp2.1/Ombi.dll", - "args": [], - "cwd": "${workspaceFolder}/src/Ombi", - "stopAtEntry": false, - "internalConsoleOptions": "openOnSessionStart", - "launchBrowser": { - "enabled": false, - "args": "${auto-detect-url}", - "windows": { - "command": "cmd.exe", - "args": "/C start ${auto-detect-url}" - }, - "osx": { - "command": "open" - }, - "linux": { - "command": "xdg-open" - } - }, - "env": { - "ASPNETCORE_ENVIRONMENT": "Development" - }, - "sourceFileMap": { - "/Views": "${workspaceFolder}/Views" - } - }, - { - "name": ".NET Core Attach", - "type": "coreclr", - "request": "attach", - "processId": "${command:pickProcess}" - } - ,] -} \ No newline at end of file diff --git a/.vscode/tasks.json b/.vscode/tasks.json deleted file mode 100644 index af3542206..000000000 --- a/.vscode/tasks.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "version": "2.0.0", - "tasks": [ - { - "label": "build", - "command": "dotnet", - "type": "process", - "args": [ - "build", - "${workspaceFolder}/src/Ombi/Ombi.csproj" - ], - "problemMatcher": "$msCompile" - } - ] -} \ No newline at end of file From d12e46b45103991370a46decd80796e0a59bc7ac Mon Sep 17 00:00:00 2001 From: Kenton Royal Date: Sun, 26 Aug 2018 18:53:08 +0100 Subject: [PATCH 12/45] Remove unused methods from SearchController --- src/Ombi/Controllers/SearchController.cs | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/src/Ombi/Controllers/SearchController.cs b/src/Ombi/Controllers/SearchController.cs index 65e9f930b..0c3c33244 100644 --- a/src/Ombi/Controllers/SearchController.cs +++ b/src/Ombi/Controllers/SearchController.cs @@ -183,17 +183,5 @@ namespace Ombi.Controllers { return await TvEngine.Trending(); } - - [HttpGet("movie/requestCount")] - public async Task RemainingMovieRequests() - { - return null; - } - - [HttpGet("tv/requestCount")] - public async Task RemainingTvRequests() - { - return null; - } } } From e770d321eb2b319f2e93215e2d04c98e18ab47a4 Mon Sep 17 00:00:00 2001 From: Kenton Royal Date: Sun, 26 Aug 2018 21:02:23 +0100 Subject: [PATCH 13/45] Fix lint errors --- .../app/interfaces/IRemainingRequests.ts | 2 +- .../app/requests/movierequests.component.ts | 2 +- .../requests/remainingrequests.component.ts | 39 ++++++++++--------- .../ClientApp/app/search/search.module.ts | 2 +- .../ClientApp/app/services/request.service.ts | 5 ++- 5 files changed, 26 insertions(+), 24 deletions(-) diff --git a/src/Ombi/ClientApp/app/interfaces/IRemainingRequests.ts b/src/Ombi/ClientApp/app/interfaces/IRemainingRequests.ts index ce1b37427..a6ff1a66c 100644 --- a/src/Ombi/ClientApp/app/interfaces/IRemainingRequests.ts +++ b/src/Ombi/ClientApp/app/interfaces/IRemainingRequests.ts @@ -3,4 +3,4 @@ export interface IRemainingRequests { limit: number; remaining: number; nextRequest: Date; -} \ No newline at end of file +} diff --git a/src/Ombi/ClientApp/app/requests/movierequests.component.ts b/src/Ombi/ClientApp/app/requests/movierequests.component.ts index 9495f0790..651637308 100644 --- a/src/Ombi/ClientApp/app/requests/movierequests.component.ts +++ b/src/Ombi/ClientApp/app/requests/movierequests.component.ts @@ -6,8 +6,8 @@ import { debounceTime, distinctUntilChanged } from "rxjs/operators"; import { AuthService } from "../auth/auth.service"; import { FilterType, IFilter, IIssueCategory, IMovieRequests, IPagenator, IRadarrProfile, IRadarrRootFolder, OrderType } from "../interfaces"; -import { NotificationService, RadarrService, RequestService } from "../services"; import { IRemainingRequests } from "../interfaces/IRemainingRequests"; +import { NotificationService, RadarrService, RequestService } from "../services"; @Component({ selector: "movie-requests", diff --git a/src/Ombi/ClientApp/app/requests/remainingrequests.component.ts b/src/Ombi/ClientApp/app/requests/remainingrequests.component.ts index 9e64b0013..4f4439c13 100644 --- a/src/Ombi/ClientApp/app/requests/remainingrequests.component.ts +++ b/src/Ombi/ClientApp/app/requests/remainingrequests.component.ts @@ -1,6 +1,7 @@ -import { Component, OnInit, Input } from "@angular/core"; +import { IRemainingRequests } from "../interfaces/IRemainingRequests"; import { RequestService } from "../services"; -import { IRemainingRequests } from "../interfaces/IRemainingRequests"; + +import { Component, Input, OnInit } from "@angular/core"; @Component({ selector: "remaining-requests", @@ -14,29 +15,29 @@ export class RemainingRequestsComponent implements OnInit { public hoursUntil: number; public minutesUntil: number; - constructor(private requestService: RequestService) - { + constructor(private requestService: RequestService) { } - ngOnInit(): void { - var self = this; + public ngOnInit() { + const self = this; + this.update(); this.requestService.onRequested().subscribe(m => { this.update(); }); - setInterval(function(){ + setInterval(() => { self.calculateTime(); - }, 10000) + }, 10000); - setInterval(function(){ - self.update() - }, 60000) + setInterval(() => { + self.update(); + }, 60000); } - update(): void { - var callback = (remaining => { + public update(): void { + const callback = (remaining => { this.remaining = remaining; this.calculateTime(); }); @@ -48,21 +49,21 @@ export class RemainingRequestsComponent implements OnInit { } } - calculateTime(): void { + private calculateTime(): void { this.daysUntil = Math.ceil(this.daysUntilNextRequest()); this.hoursUntil = Math.ceil(this.hoursUntilNextRequest()); - this.minutesUntil = Math.ceil(this.minutesUntilNextRequest()) + this.minutesUntil = Math.ceil(this.minutesUntilNextRequest()); } - daysUntilNextRequest(): number { + private daysUntilNextRequest(): number { return (new Date(this.remaining.nextRequest).getTime() - new Date().getTime()) / 1000 / 60 / 60 / 24; } - hoursUntilNextRequest(): number { + private hoursUntilNextRequest(): number { return (new Date(this.remaining.nextRequest).getTime() - new Date().getTime()) / 1000 / 60 / 60; } - minutesUntilNextRequest(): number { + private minutesUntilNextRequest(): number { return (new Date(this.remaining.nextRequest).getTime() - new Date().getTime()) / 1000 / 60; } -} \ No newline at end of file +} diff --git a/src/Ombi/ClientApp/app/search/search.module.ts b/src/Ombi/ClientApp/app/search/search.module.ts index c2a309819..75c2de5d9 100644 --- a/src/Ombi/ClientApp/app/search/search.module.ts +++ b/src/Ombi/ClientApp/app/search/search.module.ts @@ -18,8 +18,8 @@ import { SearchService } from "../services"; import { AuthGuard } from "../auth/auth.guard"; -import { SharedModule } from "../shared/shared.module"; import { RemainingRequestsComponent } from "../requests/remainingrequests.component"; +import { SharedModule } from "../shared/shared.module"; const routes: Routes = [ { path: "", component: SearchComponent, canActivate: [AuthGuard] }, diff --git a/src/Ombi/ClientApp/app/services/request.service.ts b/src/Ombi/ClientApp/app/services/request.service.ts index 7940c43d6..a7fbc76bf 100644 --- a/src/Ombi/ClientApp/app/services/request.service.ts +++ b/src/Ombi/ClientApp/app/services/request.service.ts @@ -8,6 +8,7 @@ import { TreeNode } from "primeng/primeng"; import { FilterType, IChildRequests, IFilter, IMovieRequestModel, IMovieRequests, IMovieUpdateModel, IRequestEngineResult, IRequestsViewModel, ITvRequests, ITvUpdateModel, OrderType } from "../interfaces"; import { ITvRequestViewModel } from "../interfaces"; import { ServiceHelpers } from "./service.helpers"; + import { IRemainingRequests } from "../interfaces/IRemainingRequests"; @Injectable() @@ -30,7 +31,7 @@ export class RequestService extends ServiceHelpers { } public requestMovie(movie: IMovieRequestModel): Observable { - var observer = Observable.create(observer => { + const observer = Observable.create(observer => { this.http.post(`${this.url}Movie/`, JSON.stringify(movie), {headers: this.headers}).subscribe(m => { observer.next(m); this.requestEvents.next(m); @@ -49,7 +50,7 @@ export class RequestService extends ServiceHelpers { } public requestTv(tv: ITvRequestViewModel): Observable { - var observer = Observable.create(observer => { + const observer = Observable.create(observer => { return this.http.post(`${this.url}TV/`, JSON.stringify(tv), { headers: this.headers }).subscribe(m => { observer.next(m); this.requestEvents.next(m); From 91a04f6ca707700c955a9513a04696ba3fd2ad1f Mon Sep 17 00:00:00 2001 From: Kenton Royal Date: Mon, 27 Aug 2018 12:30:53 +0100 Subject: [PATCH 14/45] Add vscode to gitignore --- .gitignore | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.gitignore b/.gitignore index 771a7bacd..587f09568 100644 --- a/.gitignore +++ b/.gitignore @@ -243,3 +243,6 @@ _Pvt_Extensions # CAKE - C# Make /Tools/* *.db-journal + +# Ignore local vscode config +*.vscode From 71009f4942bb5451b5aaf024fd6d5d537e94e829 Mon Sep 17 00:00:00 2001 From: Kenton Royal Date: Mon, 27 Aug 2018 15:05:49 +0100 Subject: [PATCH 15/45] Fix query for fetching requested tv shows --- src/Ombi.Core/Engine/TvRequestEngine.cs | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/Ombi.Core/Engine/TvRequestEngine.cs b/src/Ombi.Core/Engine/TvRequestEngine.cs index 939b0fe3e..2d937a377 100644 --- a/src/Ombi.Core/Engine/TvRequestEngine.cs +++ b/src/Ombi.Core/Engine/TvRequestEngine.cs @@ -631,7 +631,10 @@ namespace Ombi.Core.Engine }; } - IQueryable log = _requestLog.GetAll().Where(x => x.UserId == user.Id && x.RequestType == RequestType.TvShow); + IQueryable log = _requestLog.GetAll() + .Where(x => x.UserId == user.Id + && x.RequestType == RequestType.TvShow + && x.RequestDate >= DateTime.UtcNow.AddDays(-7)); // Needed, due to a bug which would cause all episode counts to be 0 int zeroEpisodeCount = await log.Where(x => x.EpisodeCount == 0).Select(x => x.EpisodeCount).CountAsync(); @@ -640,8 +643,7 @@ namespace Ombi.Core.Engine int count = limit - (zeroEpisodeCount + episodeCount); - DateTime oldestRequestedAt = await log.Where(x => x.RequestDate >= DateTime.UtcNow.AddDays(-7)) - .OrderBy(x => x.RequestDate) + DateTime oldestRequestedAt = await log.OrderBy(x => x.RequestDate) .Select(x => x.RequestDate) .FirstOrDefaultAsync(); From c12cb10972276d521944dd287e6781b09d0352bf Mon Sep 17 00:00:00 2001 From: Kenton Royal Date: Mon, 27 Aug 2018 15:40:00 +0100 Subject: [PATCH 16/45] Add text to translation file --- .../app/requests/remainingrequests.component.html | 8 ++++---- src/Ombi/wwwroot/translations/en.json | 11 ++++++++++- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/src/Ombi/ClientApp/app/requests/remainingrequests.component.html b/src/Ombi/ClientApp/app/requests/remainingrequests.component.html index 769cd79c2..565de7473 100644 --- a/src/Ombi/ClientApp/app/requests/remainingrequests.component.html +++ b/src/Ombi/ClientApp/app/requests/remainingrequests.component.html @@ -1,15 +1,15 @@ 

- {{remaining.remaining}}/{{remaining.limit}} requests remaining + {{'Requests.Remaining.Quota' | translate: {remaining: remaining.remaining, total: remaining.limit} }}

- Another request will be added in {{daysUntil}} {{daysUntil == 1 ? "day" : "days"}} + {{daysUntil == 1 ? 'Requests.Remaining.NextDay' : "Requests.Remaining.NextDays" | translate: {time: daysUntil} }}

- Another request will be added in {{hoursUntil}} {{hoursUntil == 1 ? "hour" : "hours"}} + {{hoursUntil == 1 ? 'Requests.Remaining.NextHour' : "Requests.Remaining.NextHours" | translate: {time: hoursUntil} }}

- Another request will be added in {{minutesUntil}} {{minutesUntil == 1 ? "minute" : "minutes"}} + {{minutesUntil == 1 ? 'Requests.Remaining.NextMinute' : "Requests.Remaining.NextMinutes" | translate: {time: minutesUntil} }}

diff --git a/src/Ombi/wwwroot/translations/en.json b/src/Ombi/wwwroot/translations/en.json index b70e065cb..a2c7f20dc 100644 --- a/src/Ombi/wwwroot/translations/en.json +++ b/src/Ombi/wwwroot/translations/en.json @@ -145,7 +145,16 @@ "SortRequestDateAsc": "Request Date ▲", "SortRequestDateDesc": "Request Date ▼", "SortStatusAsc":"Status ▲", - "SortStatusDesc":"Status ▼" + "SortStatusDesc":"Status ▼", + "Remaining": { + "Quota": "{{remaining}}/{{total}} requests remaining", + "NextDays": "Another request will be added in {{time}} days", + "NextDay": "Another request will be added in {{time}} day", + "NextHours": "Another request will be added in {{time} hours", + "NextHour": "Another request will be added in {{time} hour", + "NextMinutes": "Another request will be added in {{time}} minutes", + "NextMinute": "Another request will be added in {{time}} minute" + } }, "Issues":{ "Title":"Issues", From 967109f4b2623dfd843d0d84c66c313ea2a03c5b Mon Sep 17 00:00:00 2001 From: Kenton Royal Date: Mon, 27 Aug 2018 16:04:46 +0100 Subject: [PATCH 17/45] Refactor code --- .../app/requests/remainingrequests.component.html | 8 ++++---- .../ClientApp/app/requests/remainingrequests.component.ts | 4 ---- src/Ombi/wwwroot/translations/en.json | 4 +--- 3 files changed, 5 insertions(+), 11 deletions(-) diff --git a/src/Ombi/ClientApp/app/requests/remainingrequests.component.html b/src/Ombi/ClientApp/app/requests/remainingrequests.component.html index 565de7473..11cd28b34 100644 --- a/src/Ombi/ClientApp/app/requests/remainingrequests.component.html +++ b/src/Ombi/ClientApp/app/requests/remainingrequests.component.html @@ -3,13 +3,13 @@ {{'Requests.Remaining.Quota' | translate: {remaining: remaining.remaining, total: remaining.limit} }}

- {{daysUntil == 1 ? 'Requests.Remaining.NextDay' : "Requests.Remaining.NextDays" | translate: {time: daysUntil} }} + {{'Requests.Remaining.NextDays' | translate: {time: daysUntil} }}

- {{hoursUntil == 1 ? 'Requests.Remaining.NextHour' : "Requests.Remaining.NextHours" | translate: {time: hoursUntil} }} + {{'Requests.Remaining.NextHours' | translate: {time: hoursUntil} }}

-

- {{minutesUntil == 1 ? 'Requests.Remaining.NextMinute' : "Requests.Remaining.NextMinutes" | translate: {time: minutesUntil} }} +

+ {{(minutesUntil == 1 ? 'Requests.Remaining.NextMinute' : 'Requests.Remaining.NextMinutes') | translate: {time: minutesUntil} }}

diff --git a/src/Ombi/ClientApp/app/requests/remainingrequests.component.ts b/src/Ombi/ClientApp/app/requests/remainingrequests.component.ts index 4f4439c13..980256d69 100644 --- a/src/Ombi/ClientApp/app/requests/remainingrequests.component.ts +++ b/src/Ombi/ClientApp/app/requests/remainingrequests.component.ts @@ -27,10 +27,6 @@ export class RemainingRequestsComponent implements OnInit { this.update(); }); - setInterval(() => { - self.calculateTime(); - }, 10000); - setInterval(() => { self.update(); }, 60000); diff --git a/src/Ombi/wwwroot/translations/en.json b/src/Ombi/wwwroot/translations/en.json index a2c7f20dc..46be04a6b 100644 --- a/src/Ombi/wwwroot/translations/en.json +++ b/src/Ombi/wwwroot/translations/en.json @@ -149,9 +149,7 @@ "Remaining": { "Quota": "{{remaining}}/{{total}} requests remaining", "NextDays": "Another request will be added in {{time}} days", - "NextDay": "Another request will be added in {{time}} day", - "NextHours": "Another request will be added in {{time} hours", - "NextHour": "Another request will be added in {{time} hour", + "NextHours": "Another request will be added in {{time}} hours", "NextMinutes": "Another request will be added in {{time}} minutes", "NextMinute": "Another request will be added in {{time}} minute" } From 93e9b4cd4ccacdb2025dbe04b4cc8d54e06addb4 Mon Sep 17 00:00:00 2001 From: Kenton Royal Date: Mon, 27 Aug 2018 16:08:06 +0100 Subject: [PATCH 18/45] Remove unused module --- src/Ombi/ClientApp/app/requests/remainingrequests.module.ts | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/Ombi/ClientApp/app/requests/remainingrequests.module.ts b/src/Ombi/ClientApp/app/requests/remainingrequests.module.ts index acbbed256..70a12bf16 100644 --- a/src/Ombi/ClientApp/app/requests/remainingrequests.module.ts +++ b/src/Ombi/ClientApp/app/requests/remainingrequests.module.ts @@ -8,15 +8,12 @@ import { NgbModule } from "@ng-bootstrap/ng-bootstrap"; import { SidebarModule, TooltipModule, TreeTableModule } from "primeng/primeng"; import { RequestService } from "../services"; -import { SharedModule } from "../shared/shared.module"; - @NgModule({ imports: [ CommonModule, FormsModule, NgbModule.forRoot(), TreeTableModule, - SharedModule, SidebarModule, TooltipModule, ], From e6f24eabb45eb38a9e53a4059507addddfc9a458 Mon Sep 17 00:00:00 2001 From: Kenton Royal Date: Mon, 27 Aug 2018 16:52:09 +0100 Subject: [PATCH 19/45] Change way remainingrequests component is notified --- .../requests/remainingrequests.component.ts | 2 +- .../app/search/moviesearch.component.ts | 1 + .../app/search/seriesinformation.component.ts | 1 + .../app/search/tvsearch.component.ts | 1 + .../ClientApp/app/services/request.service.ts | 25 +++---------------- 5 files changed, 8 insertions(+), 22 deletions(-) diff --git a/src/Ombi/ClientApp/app/requests/remainingrequests.component.ts b/src/Ombi/ClientApp/app/requests/remainingrequests.component.ts index 980256d69..8a13d2cfb 100644 --- a/src/Ombi/ClientApp/app/requests/remainingrequests.component.ts +++ b/src/Ombi/ClientApp/app/requests/remainingrequests.component.ts @@ -23,7 +23,7 @@ export class RemainingRequestsComponent implements OnInit { this.update(); - this.requestService.onRequested().subscribe(m => { + this.requestService.requestEvents.subscribe(() => { this.update(); }); diff --git a/src/Ombi/ClientApp/app/search/moviesearch.component.ts b/src/Ombi/ClientApp/app/search/moviesearch.component.ts index 965837bae..fece0cc74 100644 --- a/src/Ombi/ClientApp/app/search/moviesearch.component.ts +++ b/src/Ombi/ClientApp/app/search/moviesearch.component.ts @@ -88,6 +88,7 @@ export class MovieSearchComponent implements OnInit { try { this.requestService.requestMovie({ theMovieDbId: searchResult.id }) .subscribe(x => { + this.requestService.requestEvents.next(); this.result = x; if (this.result.result) { this.translate.get("Search.RequestAdded", { title: searchResult.title }).subscribe(x => { diff --git a/src/Ombi/ClientApp/app/search/seriesinformation.component.ts b/src/Ombi/ClientApp/app/search/seriesinformation.component.ts index 5c0088268..91234780d 100644 --- a/src/Ombi/ClientApp/app/search/seriesinformation.component.ts +++ b/src/Ombi/ClientApp/app/search/seriesinformation.component.ts @@ -62,6 +62,7 @@ export class SeriesInformationComponent implements OnInit { this.requestService.requestTv(viewModel) .subscribe(x => { + this.requestService.requestEvents.next(); this.result = x as IRequestEngineResult; if (this.result.result) { this.notificationService.success( diff --git a/src/Ombi/ClientApp/app/search/tvsearch.component.ts b/src/Ombi/ClientApp/app/search/tvsearch.component.ts index a41f34586..e08b84567 100644 --- a/src/Ombi/ClientApp/app/search/tvsearch.component.ts +++ b/src/Ombi/ClientApp/app/search/tvsearch.component.ts @@ -161,6 +161,7 @@ export class TvSearchComponent implements OnInit { this.requestService.requestTv(viewModel) .subscribe(x => { + this.requestService.requestEvents.next(); this.result = x; if (this.result.result) { this.notificationService.success( diff --git a/src/Ombi/ClientApp/app/services/request.service.ts b/src/Ombi/ClientApp/app/services/request.service.ts index a7fbc76bf..a8032d5a9 100644 --- a/src/Ombi/ClientApp/app/services/request.service.ts +++ b/src/Ombi/ClientApp/app/services/request.service.ts @@ -13,15 +13,12 @@ import { IRemainingRequests } from "../interfaces/IRemainingRequests"; @Injectable() export class RequestService extends ServiceHelpers { - private requestEvents = new ReplaySubject(); + public readonly requestEvents = new ReplaySubject(); + constructor(http: HttpClient, public platformLocation: PlatformLocation) { super(http, "/api/v1/Request/", platformLocation); } - public onRequested(): Observable { - return this.requestEvents.asObservable(); - } - public getRemainingMovieRequests(): Observable { return this.http.get(`${this.url}movie/remaining`, {headers: this.headers}); } @@ -31,14 +28,7 @@ export class RequestService extends ServiceHelpers { } public requestMovie(movie: IMovieRequestModel): Observable { - const observer = Observable.create(observer => { - this.http.post(`${this.url}Movie/`, JSON.stringify(movie), {headers: this.headers}).subscribe(m => { - observer.next(m); - this.requestEvents.next(m); - }); - }); - - return observer; + return this.http.post(`${this.url}Movie/`, JSON.stringify(movie), {headers: this.headers}); } public getTotalMovies(): Observable { @@ -50,14 +40,7 @@ export class RequestService extends ServiceHelpers { } public requestTv(tv: ITvRequestViewModel): Observable { - const observer = Observable.create(observer => { - return this.http.post(`${this.url}TV/`, JSON.stringify(tv), { headers: this.headers }).subscribe(m => { - observer.next(m); - this.requestEvents.next(m); - }); - }); - - return observer; + return this.http.post(`${this.url}TV/`, JSON.stringify(tv), { headers: this.headers }); } public approveMovie(movie: IMovieUpdateModel): Observable { From 26904d3947a544d320511011a87c6192931df872 Mon Sep 17 00:00:00 2001 From: Kenton Royal Date: Mon, 27 Aug 2018 16:55:50 +0100 Subject: [PATCH 20/45] Remove import --- src/Ombi/ClientApp/app/requests/remainingrequests.module.ts | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/Ombi/ClientApp/app/requests/remainingrequests.module.ts b/src/Ombi/ClientApp/app/requests/remainingrequests.module.ts index 70a12bf16..411a94dfd 100644 --- a/src/Ombi/ClientApp/app/requests/remainingrequests.module.ts +++ b/src/Ombi/ClientApp/app/requests/remainingrequests.module.ts @@ -1,5 +1,4 @@ -import { CommonModule } from "@angular/common"; -import { NgModule } from "@angular/core"; +import { NgModule } from "@angular/core"; import { FormsModule } from "@angular/forms"; import { RouterModule } from "@angular/router"; @@ -10,7 +9,6 @@ import { RequestService } from "../services"; @NgModule({ imports: [ - CommonModule, FormsModule, NgbModule.forRoot(), TreeTableModule, From 4cad24f8e95b152358fe67619b2efa62678a8328 Mon Sep 17 00:00:00 2001 From: Kenton Royal Date: Mon, 27 Aug 2018 23:51:44 +0100 Subject: [PATCH 21/45] Move logic for notifying when reuqest is complete --- .../ClientApp/app/requests/remainingrequests.component.ts | 4 +++- src/Ombi/ClientApp/app/search/moviesearch.component.html | 2 +- src/Ombi/ClientApp/app/search/moviesearch.component.ts | 3 ++- .../ClientApp/app/search/seriesinformation.component.ts | 6 ++++-- src/Ombi/ClientApp/app/search/tvsearch.component.html | 4 ++-- src/Ombi/ClientApp/app/search/tvsearch.component.ts | 3 ++- src/Ombi/ClientApp/app/services/request.service.ts | 4 +--- 7 files changed, 15 insertions(+), 11 deletions(-) diff --git a/src/Ombi/ClientApp/app/requests/remainingrequests.component.ts b/src/Ombi/ClientApp/app/requests/remainingrequests.component.ts index 8a13d2cfb..978480e94 100644 --- a/src/Ombi/ClientApp/app/requests/remainingrequests.component.ts +++ b/src/Ombi/ClientApp/app/requests/remainingrequests.component.ts @@ -2,6 +2,7 @@ import { RequestService } from "../services"; import { Component, Input, OnInit } from "@angular/core"; +import { Observable } from "rxjs"; @Component({ selector: "remaining-requests", @@ -14,6 +15,7 @@ export class RemainingRequestsComponent implements OnInit { public daysUntil: number; public hoursUntil: number; public minutesUntil: number; + @Input() quotaRefreshEvents: Observable; constructor(private requestService: RequestService) { } @@ -23,7 +25,7 @@ export class RemainingRequestsComponent implements OnInit { this.update(); - this.requestService.requestEvents.subscribe(() => { + this.quotaRefreshEvents.subscribe(() => { this.update(); }); diff --git a/src/Ombi/ClientApp/app/search/moviesearch.component.html b/src/Ombi/ClientApp/app/search/moviesearch.component.html index 6d8c040ac..eb3cb1b87 100644 --- a/src/Ombi/ClientApp/app/search/moviesearch.component.html +++ b/src/Ombi/ClientApp/app/search/moviesearch.component.html @@ -20,7 +20,7 @@ - +
diff --git a/src/Ombi/ClientApp/app/search/moviesearch.component.ts b/src/Ombi/ClientApp/app/search/moviesearch.component.ts index fece0cc74..1519941ec 100644 --- a/src/Ombi/ClientApp/app/search/moviesearch.component.ts +++ b/src/Ombi/ClientApp/app/search/moviesearch.component.ts @@ -17,6 +17,7 @@ export class MovieSearchComponent implements OnInit { public searchText: string; public searchChanged: Subject = new Subject(); + public movieRequested: Subject = new Subject(); public movieResults: ISearchMovieResult[]; public result: IRequestEngineResult; @@ -88,7 +89,7 @@ export class MovieSearchComponent implements OnInit { try { this.requestService.requestMovie({ theMovieDbId: searchResult.id }) .subscribe(x => { - this.requestService.requestEvents.next(); + this.movieRequested.next(); this.result = x; if (this.result.result) { this.translate.get("Search.RequestAdded", { title: searchResult.title }).subscribe(x => { diff --git a/src/Ombi/ClientApp/app/search/seriesinformation.component.ts b/src/Ombi/ClientApp/app/search/seriesinformation.component.ts index 91234780d..979afc144 100644 --- a/src/Ombi/ClientApp/app/search/seriesinformation.component.ts +++ b/src/Ombi/ClientApp/app/search/seriesinformation.component.ts @@ -7,6 +7,7 @@ import { SearchService } from "../services"; import { INewSeasonRequests, IRequestEngineResult, ISeasonsViewModel, ITvRequestViewModel } from "../interfaces"; import { IEpisodesRequests } from "../interfaces"; import { ISearchTvResult } from "../interfaces"; +import { Subject } from "rxjs"; @Component({ selector: "seriesinformation", @@ -18,9 +19,10 @@ export class SeriesInformationComponent implements OnInit { public result: IRequestEngineResult; public series: ISearchTvResult; public requestedEpisodes: IEpisodesRequests[] = []; - @Input() private seriesId: number; + @Input() public tvRequested: Subject; + constructor(private searchService: SearchService, private requestService: RequestService, private notificationService: NotificationService) { } public ngOnInit() { @@ -62,7 +64,7 @@ export class SeriesInformationComponent implements OnInit { this.requestService.requestTv(viewModel) .subscribe(x => { - this.requestService.requestEvents.next(); + this.tvRequested.next(); this.result = x as IRequestEngineResult; if (this.result.result) { this.notificationService.success( diff --git a/src/Ombi/ClientApp/app/search/tvsearch.component.html b/src/Ombi/ClientApp/app/search/tvsearch.component.html index 5f4938cf1..127077b3b 100644 --- a/src/Ombi/ClientApp/app/search/tvsearch.component.html +++ b/src/Ombi/ClientApp/app/search/tvsearch.component.html @@ -27,7 +27,7 @@
- +
@@ -153,7 +153,7 @@
- +

diff --git a/src/Ombi/ClientApp/app/search/tvsearch.component.ts b/src/Ombi/ClientApp/app/search/tvsearch.component.ts index e08b84567..632900091 100644 --- a/src/Ombi/ClientApp/app/search/tvsearch.component.ts +++ b/src/Ombi/ClientApp/app/search/tvsearch.component.ts @@ -18,6 +18,7 @@ export class TvSearchComponent implements OnInit { public searchText: string; public searchChanged = new Subject(); public tvResults: ISearchTvResult[]; + public tvRequested: Subject = new Subject(); public result: IRequestEngineResult; public searchApplied = false; public defaultPoster: string; @@ -161,7 +162,7 @@ export class TvSearchComponent implements OnInit { this.requestService.requestTv(viewModel) .subscribe(x => { - this.requestService.requestEvents.next(); + this.tvRequested.next(); this.result = x; if (this.result.result) { this.notificationService.success( diff --git a/src/Ombi/ClientApp/app/services/request.service.ts b/src/Ombi/ClientApp/app/services/request.service.ts index a8032d5a9..1ebed5dcd 100644 --- a/src/Ombi/ClientApp/app/services/request.service.ts +++ b/src/Ombi/ClientApp/app/services/request.service.ts @@ -2,7 +2,7 @@ import { PlatformLocation } from "@angular/common"; import { Injectable } from "@angular/core"; import { HttpClient } from "@angular/common/http"; -import { Observable, ReplaySubject } from "rxjs"; +import { Observable } from "rxjs"; import { TreeNode } from "primeng/primeng"; import { FilterType, IChildRequests, IFilter, IMovieRequestModel, IMovieRequests, IMovieUpdateModel, IRequestEngineResult, IRequestsViewModel, ITvRequests, ITvUpdateModel, OrderType } from "../interfaces"; @@ -13,8 +13,6 @@ import { IRemainingRequests } from "../interfaces/IRemainingRequests"; @Injectable() export class RequestService extends ServiceHelpers { - public readonly requestEvents = new ReplaySubject(); - constructor(http: HttpClient, public platformLocation: PlatformLocation) { super(http, "/api/v1/Request/", platformLocation); } From dcae229a8321fe386d9e0437dfbd802df4a9b98e Mon Sep 17 00:00:00 2001 From: Kenton Royal Date: Mon, 27 Aug 2018 23:58:05 +0100 Subject: [PATCH 22/45] Fix lint errors --- .../ClientApp/app/requests/remainingrequests.component.ts | 2 +- src/Ombi/ClientApp/app/search/seriesinformation.component.ts | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Ombi/ClientApp/app/requests/remainingrequests.component.ts b/src/Ombi/ClientApp/app/requests/remainingrequests.component.ts index 978480e94..4de649f6a 100644 --- a/src/Ombi/ClientApp/app/requests/remainingrequests.component.ts +++ b/src/Ombi/ClientApp/app/requests/remainingrequests.component.ts @@ -15,7 +15,7 @@ export class RemainingRequestsComponent implements OnInit { public daysUntil: number; public hoursUntil: number; public minutesUntil: number; - @Input() quotaRefreshEvents: Observable; + @Input() public quotaRefreshEvents: Observable; constructor(private requestService: RequestService) { } diff --git a/src/Ombi/ClientApp/app/search/seriesinformation.component.ts b/src/Ombi/ClientApp/app/search/seriesinformation.component.ts index 979afc144..6a918a69a 100644 --- a/src/Ombi/ClientApp/app/search/seriesinformation.component.ts +++ b/src/Ombi/ClientApp/app/search/seriesinformation.component.ts @@ -7,6 +7,7 @@ import { SearchService } from "../services"; import { INewSeasonRequests, IRequestEngineResult, ISeasonsViewModel, ITvRequestViewModel } from "../interfaces"; import { IEpisodesRequests } from "../interfaces"; import { ISearchTvResult } from "../interfaces"; + import { Subject } from "rxjs"; @Component({ @@ -19,9 +20,8 @@ export class SeriesInformationComponent implements OnInit { public result: IRequestEngineResult; public series: ISearchTvResult; public requestedEpisodes: IEpisodesRequests[] = []; - @Input() private seriesId: number; - @Input() public tvRequested: Subject; + @Input() private seriesId: number; constructor(private searchService: SearchService, private requestService: RequestService, private notificationService: NotificationService) { } From f89165314bdff5b5032f5011ef1dc5583b903606 Mon Sep 17 00:00:00 2001 From: Kenton Royal Date: Wed, 29 Aug 2018 11:48:05 +0100 Subject: [PATCH 23/45] Revert request.service.ts to version on upstream/develop --- src/Ombi/ClientApp/app/services/request.service.ts | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) diff --git a/src/Ombi/ClientApp/app/services/request.service.ts b/src/Ombi/ClientApp/app/services/request.service.ts index 1ebed5dcd..48fa5622d 100644 --- a/src/Ombi/ClientApp/app/services/request.service.ts +++ b/src/Ombi/ClientApp/app/services/request.service.ts @@ -9,22 +9,12 @@ import { FilterType, IChildRequests, IFilter, IMovieRequestModel, IMovieRequests import { ITvRequestViewModel } from "../interfaces"; import { ServiceHelpers } from "./service.helpers"; -import { IRemainingRequests } from "../interfaces/IRemainingRequests"; - @Injectable() export class RequestService extends ServiceHelpers { constructor(http: HttpClient, public platformLocation: PlatformLocation) { super(http, "/api/v1/Request/", platformLocation); } - public getRemainingMovieRequests(): Observable { - return this.http.get(`${this.url}movie/remaining`, {headers: this.headers}); - } - - public getRemainingTvRequests(): Observable { - return this.http.get(`${this.url}tv/remaining`, {headers: this.headers}); - } - public requestMovie(movie: IMovieRequestModel): Observable { return this.http.post(`${this.url}Movie/`, JSON.stringify(movie), {headers: this.headers}); } @@ -38,7 +28,7 @@ export class RequestService extends ServiceHelpers { } public requestTv(tv: ITvRequestViewModel): Observable { - return this.http.post(`${this.url}TV/`, JSON.stringify(tv), { headers: this.headers }); + return this.http.post(`${this.url}TV/`, JSON.stringify(tv), {headers: this.headers}); } public approveMovie(movie: IMovieUpdateModel): Observable { From a23c1030f487145684f0eab1a57101f422a69f6c Mon Sep 17 00:00:00 2001 From: Kenton Royal Date: Wed, 29 Aug 2018 11:56:51 +0100 Subject: [PATCH 24/45] Revert "Revert request.service.ts to version on upstream/develop" This reverts commit f89165314bdff5b5032f5011ef1dc5583b903606. --- src/Ombi/ClientApp/app/services/request.service.ts | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/Ombi/ClientApp/app/services/request.service.ts b/src/Ombi/ClientApp/app/services/request.service.ts index 48fa5622d..1ebed5dcd 100644 --- a/src/Ombi/ClientApp/app/services/request.service.ts +++ b/src/Ombi/ClientApp/app/services/request.service.ts @@ -9,12 +9,22 @@ import { FilterType, IChildRequests, IFilter, IMovieRequestModel, IMovieRequests import { ITvRequestViewModel } from "../interfaces"; import { ServiceHelpers } from "./service.helpers"; +import { IRemainingRequests } from "../interfaces/IRemainingRequests"; + @Injectable() export class RequestService extends ServiceHelpers { constructor(http: HttpClient, public platformLocation: PlatformLocation) { super(http, "/api/v1/Request/", platformLocation); } + public getRemainingMovieRequests(): Observable { + return this.http.get(`${this.url}movie/remaining`, {headers: this.headers}); + } + + public getRemainingTvRequests(): Observable { + return this.http.get(`${this.url}tv/remaining`, {headers: this.headers}); + } + public requestMovie(movie: IMovieRequestModel): Observable { return this.http.post(`${this.url}Movie/`, JSON.stringify(movie), {headers: this.headers}); } @@ -28,7 +38,7 @@ export class RequestService extends ServiceHelpers { } public requestTv(tv: ITvRequestViewModel): Observable { - return this.http.post(`${this.url}TV/`, JSON.stringify(tv), {headers: this.headers}); + return this.http.post(`${this.url}TV/`, JSON.stringify(tv), { headers: this.headers }); } public approveMovie(movie: IMovieUpdateModel): Observable { From 7534a634c24561303c9f829571e2735988df96e5 Mon Sep 17 00:00:00 2001 From: Kenton Royal Date: Wed, 29 Aug 2018 12:02:03 +0100 Subject: [PATCH 25/45] Fix formatting error --- src/Ombi/ClientApp/app/services/request.service.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Ombi/ClientApp/app/services/request.service.ts b/src/Ombi/ClientApp/app/services/request.service.ts index 1ebed5dcd..ac8769e71 100644 --- a/src/Ombi/ClientApp/app/services/request.service.ts +++ b/src/Ombi/ClientApp/app/services/request.service.ts @@ -38,7 +38,7 @@ export class RequestService extends ServiceHelpers { } public requestTv(tv: ITvRequestViewModel): Observable { - return this.http.post(`${this.url}TV/`, JSON.stringify(tv), { headers: this.headers }); + return this.http.post(`${this.url}TV/`, JSON.stringify(tv), {headers: this.headers}); } public approveMovie(movie: IMovieUpdateModel): Observable { From 6882209e3c82dc51805b41ced78162c6c57e7541 Mon Sep 17 00:00:00 2001 From: Kenton Royal Date: Wed, 29 Aug 2018 17:48:41 +0100 Subject: [PATCH 26/45] Refactor code --- src/Ombi/ClientApp/app/requests/movierequests.component.ts | 3 --- src/Ombi/ClientApp/app/search/moviesearch.component.ts | 2 +- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/src/Ombi/ClientApp/app/requests/movierequests.component.ts b/src/Ombi/ClientApp/app/requests/movierequests.component.ts index 651637308..311adeb92 100644 --- a/src/Ombi/ClientApp/app/requests/movierequests.component.ts +++ b/src/Ombi/ClientApp/app/requests/movierequests.component.ts @@ -6,7 +6,6 @@ import { debounceTime, distinctUntilChanged } from "rxjs/operators"; import { AuthService } from "../auth/auth.service"; import { FilterType, IFilter, IIssueCategory, IMovieRequests, IPagenator, IRadarrProfile, IRadarrRootFolder, OrderType } from "../interfaces"; -import { IRemainingRequests } from "../interfaces/IRemainingRequests"; import { NotificationService, RadarrService, RequestService } from "../services"; @Component({ @@ -39,8 +38,6 @@ export class MovieRequestsComponent implements OnInit { public orderType: OrderType = OrderType.RequestedDateDesc; public OrderType = OrderType; - public remaining: IRemainingRequests; - public totalMovies: number = 100; private currentlyLoaded: number; private amountToLoad: number; diff --git a/src/Ombi/ClientApp/app/search/moviesearch.component.ts b/src/Ombi/ClientApp/app/search/moviesearch.component.ts index 1519941ec..5fd3a37db 100644 --- a/src/Ombi/ClientApp/app/search/moviesearch.component.ts +++ b/src/Ombi/ClientApp/app/search/moviesearch.component.ts @@ -73,8 +73,8 @@ export class MovieSearchComponent implements OnInit { this.popularMovies(); } - public search(text: any) { + public search(text: any) { this.searchChanged.next(text.target.value); } From 66281d4d9c1b7636401bac70a5030d14661cc8b6 Mon Sep 17 00:00:00 2001 From: Kenton Royal Date: Wed, 29 Aug 2018 18:32:12 +0100 Subject: [PATCH 27/45] Correct path of lidarr component import for unix systems --- src/Ombi/ClientApp/app/settings/lidarr/lidarr.component.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Ombi/ClientApp/app/settings/lidarr/lidarr.component.ts b/src/Ombi/ClientApp/app/settings/lidarr/lidarr.component.ts index 3860b5675..5d85c3d73 100644 --- a/src/Ombi/ClientApp/app/settings/lidarr/lidarr.component.ts +++ b/src/Ombi/ClientApp/app/settings/lidarr/lidarr.component.ts @@ -7,7 +7,7 @@ import { NotificationService } from "../../services"; import { SettingsService } from "../../services"; @Component({ - templateUrl: "./Lidarr.component.html", + templateUrl: "./lidarr.component.html", }) export class LidarrComponent implements OnInit { From fa7a64e1ad69c20366c88b97d189388c65f635f9 Mon Sep 17 00:00:00 2001 From: Stephen Panzer Date: Fri, 31 Aug 2018 11:42:32 -0600 Subject: [PATCH 28/45] Add clearfix class. Closes #2486 --- .../ClientApp/app/requests/tvrequest-children.component.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Ombi/ClientApp/app/requests/tvrequest-children.component.html b/src/Ombi/ClientApp/app/requests/tvrequest-children.component.html index 12b093bca..f41b17f51 100644 --- a/src/Ombi/ClientApp/app/requests/tvrequest-children.component.html +++ b/src/Ombi/ClientApp/app/requests/tvrequest-children.component.html @@ -1,6 +1,6 @@ 

-
+
From fbb0978dd857966fb2357b66e64fd32a26b9a7a9 Mon Sep 17 00:00:00 2001 From: Stephen Panzer Date: Fri, 31 Aug 2018 12:27:57 -0600 Subject: [PATCH 29/45] Fix displaying year in issue dialog. Closes #2484 --- src/Ombi/ClientApp/app/search/moviesearch.component.ts | 3 ++- src/Ombi/ClientApp/app/search/tvsearch.component.ts | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/Ombi/ClientApp/app/search/moviesearch.component.ts b/src/Ombi/ClientApp/app/search/moviesearch.component.ts index 5fd3a37db..59e9fc1b8 100644 --- a/src/Ombi/ClientApp/app/search/moviesearch.component.ts +++ b/src/Ombi/ClientApp/app/search/moviesearch.component.ts @@ -152,7 +152,8 @@ export class MovieSearchComponent implements OnInit { public reportIssue(catId: IIssueCategory, req: ISearchMovieResult) { this.issueRequestId = req.id; - this.issueRequestTitle = req.title + `(${req.releaseDate.getFullYear})`; + const releaseDate = new Date(req.releaseDate); + this.issueRequestTitle = req.title + ` (${releaseDate.getFullYear()})`; this.issueCategorySelected = catId; this.issuesBarVisible = true; this.issueProviderId = req.id.toString(); diff --git a/src/Ombi/ClientApp/app/search/tvsearch.component.ts b/src/Ombi/ClientApp/app/search/tvsearch.component.ts index 632900091..92d0d549a 100644 --- a/src/Ombi/ClientApp/app/search/tvsearch.component.ts +++ b/src/Ombi/ClientApp/app/search/tvsearch.component.ts @@ -197,7 +197,8 @@ export class TvSearchComponent implements OnInit { public reportIssue(catId: IIssueCategory, req: ISearchTvResult) { this.issueRequestId = req.id; - this.issueRequestTitle = req.title + `(${req.firstAired})`; + const firstAiredDate = new Date(req.firstAired); + this.issueRequestTitle = req.title + ` (${firstAiredDate.getFullYear()})`; this.issueCategorySelected = catId; this.issuesBarVisible = true; this.issueProviderId = req.id.toString(); From 243dc99633698f4b6e91b415aeec4c979f55178e Mon Sep 17 00:00:00 2001 From: Kenton Royal Date: Sat, 1 Sep 2018 02:26:33 +0100 Subject: [PATCH 30/45] bodge fix test to prevent compile error --- src/Ombi.Schedule.Tests/NewsletterTests.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Ombi.Schedule.Tests/NewsletterTests.cs b/src/Ombi.Schedule.Tests/NewsletterTests.cs index fcbd35107..b3c2ce98a 100644 --- a/src/Ombi.Schedule.Tests/NewsletterTests.cs +++ b/src/Ombi.Schedule.Tests/NewsletterTests.cs @@ -18,7 +18,7 @@ namespace Ombi.Schedule.Tests var emailSettings = new Mock>(); var customziation = new Mock>(); var newsletterSettings = new Mock>(); - var newsletter = new NewsletterJob(null, null, null, null, null, null, customziation.Object, emailSettings.Object, null, null, newsletterSettings.Object, null); + var newsletter = new NewsletterJob(null, null, null, null, null, null, customziation.Object, emailSettings.Object, null, null, newsletterSettings.Object, null, null, null, null); var ep = new List(); foreach (var i in episodes) From 69cf31f66b2904aecfc8462712c7521f9f0d90ea Mon Sep 17 00:00:00 2001 From: Kenton Royal Date: Sat, 1 Sep 2018 02:32:04 +0100 Subject: [PATCH 31/45] fix bug causing wrong time to be displayed for next request --- src/Ombi.Core/Engine/MovieRequestEngine.cs | 2 +- src/Ombi.Core/Engine/TvRequestEngine.cs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Ombi.Core/Engine/MovieRequestEngine.cs b/src/Ombi.Core/Engine/MovieRequestEngine.cs index 5a4bc51f5..733ba4b4f 100644 --- a/src/Ombi.Core/Engine/MovieRequestEngine.cs +++ b/src/Ombi.Core/Engine/MovieRequestEngine.cs @@ -516,7 +516,7 @@ namespace Ombi.Core.Engine HasLimit = true, Limit = limit, Remaining = count, - NextRequest = oldestRequestedAt.AddDays(7), + NextRequest = DateTime.SpecifyKind(oldestRequestedAt.AddDays(7), DateTimeKind.Utc), }; } } diff --git a/src/Ombi.Core/Engine/TvRequestEngine.cs b/src/Ombi.Core/Engine/TvRequestEngine.cs index 2d937a377..f9a6e640d 100644 --- a/src/Ombi.Core/Engine/TvRequestEngine.cs +++ b/src/Ombi.Core/Engine/TvRequestEngine.cs @@ -652,7 +652,7 @@ namespace Ombi.Core.Engine HasLimit = true, Limit = limit, Remaining = count, - NextRequest = oldestRequestedAt.AddDays(7), + NextRequest = DateTime.SpecifyKind(oldestRequestedAt.AddDays(7), DateTimeKind.Utc), }; } } From db5d0c0b08b856c905356ec00129d1901d99f0f7 Mon Sep 17 00:00:00 2001 From: TidusJar Date: Tue, 4 Sep 2018 08:36:15 +0100 Subject: [PATCH 32/45] !wip added the api to trigger an album search --- src/Ombi.Api.Lidarr/ILidarrApi.cs | 1 + src/Ombi.Api.Lidarr/LidarrApi.cs | 8 ++++++++ src/Ombi.Api.Lidarr/Models/CommandResult.cs | 15 +++++++++++++++ 3 files changed, 24 insertions(+) create mode 100644 src/Ombi.Api.Lidarr/Models/CommandResult.cs diff --git a/src/Ombi.Api.Lidarr/ILidarrApi.cs b/src/Ombi.Api.Lidarr/ILidarrApi.cs index 15d20fd28..4a23c6200 100644 --- a/src/Ombi.Api.Lidarr/ILidarrApi.cs +++ b/src/Ombi.Api.Lidarr/ILidarrApi.cs @@ -22,5 +22,6 @@ namespace Ombi.Api.Lidarr Task> GetMetadataProfile(string apiKey, string baseUrl); Task> GetLanguageProfile(string apiKey, string baseUrl); Task Status(string apiKey, string baseUrl); + Task AlbumSearch(int[] albumIds, string apiKey, string baseUrl); } } \ No newline at end of file diff --git a/src/Ombi.Api.Lidarr/LidarrApi.cs b/src/Ombi.Api.Lidarr/LidarrApi.cs index 2aded7e1a..8cda49cbf 100644 --- a/src/Ombi.Api.Lidarr/LidarrApi.cs +++ b/src/Ombi.Api.Lidarr/LidarrApi.cs @@ -154,6 +154,14 @@ namespace Ombi.Api.Lidarr return Api.Request(request); } + public Task AlbumSearch(int[] albumIds, string apiKey, string baseUrl) + { + var request = new Request($"{ApiVersion}/command/AlbumSearch", baseUrl, HttpMethod.Post); + request.AddJsonBody(albumIds); + AddHeaders(request, apiKey); + return Api.Request(request); + } + private void AddHeaders(Request request, string key) { request.AddHeader("X-Api-Key", key); diff --git a/src/Ombi.Api.Lidarr/Models/CommandResult.cs b/src/Ombi.Api.Lidarr/Models/CommandResult.cs new file mode 100644 index 000000000..7c6483a6a --- /dev/null +++ b/src/Ombi.Api.Lidarr/Models/CommandResult.cs @@ -0,0 +1,15 @@ +using System; + +namespace Ombi.Api.Lidarr.Models +{ + + public class CommandResult + { + public string name { get; set; } + public DateTime startedOn { get; set; } + public DateTime stateChangeTime { get; set; } + public bool sendUpdatesToClient { get; set; } + public string state { get; set; } + public int id { get; set; } + } +} \ No newline at end of file From 85cbc084630ca4ee158aa803fafb2de47e3b4d6d Mon Sep 17 00:00:00 2001 From: TidusJar Date: Tue, 4 Sep 2018 08:52:42 +0100 Subject: [PATCH 33/45] Fixed the issue if in Radarr we only want to add and monitor, if the movie already exists we search for it. --- src/Ombi.Core/Senders/MovieSender.cs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/Ombi.Core/Senders/MovieSender.cs b/src/Ombi.Core/Senders/MovieSender.cs index e57a5bf2a..aa919e552 100644 --- a/src/Ombi.Core/Senders/MovieSender.cs +++ b/src/Ombi.Core/Senders/MovieSender.cs @@ -123,7 +123,10 @@ namespace Ombi.Core.Senders existingMovie.monitored = true; await RadarrApi.UpdateMovie(existingMovie, settings.ApiKey, settings.FullUri); // Search for it - await RadarrApi.MovieSearch(new[] { existingMovie.id }, settings.ApiKey, settings.FullUri); + if (!settings.AddOnly) + { + await RadarrApi.MovieSearch(new[] {existingMovie.id}, settings.ApiKey, settings.FullUri); + } return new SenderResult { Success = true, Sent = true }; } From 7afcb1749a8a54e53609b05b7dd4f4b9e60f9abc Mon Sep 17 00:00:00 2001 From: TidusJar Date: Tue, 4 Sep 2018 08:55:40 +0100 Subject: [PATCH 34/45] Allow Lidarr to specify if we should search for the album --- src/Ombi.Core/Senders/MusicSender.cs | 4 ++++ .../Settings/Models/External/LidarrSettings.cs | 1 + src/Ombi/ClientApp/app/interfaces/ISettings.ts | 1 + .../app/settings/lidarr/lidarr.component.html | 10 ++++++++++ .../ClientApp/app/settings/lidarr/lidarr.component.ts | 1 + 5 files changed, 17 insertions(+) diff --git a/src/Ombi.Core/Senders/MusicSender.cs b/src/Ombi.Core/Senders/MusicSender.cs index 5e1e44126..937204be5 100644 --- a/src/Ombi.Core/Senders/MusicSender.cs +++ b/src/Ombi.Core/Senders/MusicSender.cs @@ -116,6 +116,10 @@ namespace Ombi.Core.Senders } var result = await _lidarrApi.MontiorAlbum(album.id, settings.ApiKey, settings.FullUri); + if (!settings.AddOnly) + { + await _lidarrApi.AlbumSearch(new[] {result.id}, settings.ApiKey, settings.FullUri); + } if (result.monitored) { return new SenderResult {Message = "Album has been requested!", Sent = true, Success = true}; diff --git a/src/Ombi.Settings/Settings/Models/External/LidarrSettings.cs b/src/Ombi.Settings/Settings/Models/External/LidarrSettings.cs index e0bdbdc43..3a37b7d43 100644 --- a/src/Ombi.Settings/Settings/Models/External/LidarrSettings.cs +++ b/src/Ombi.Settings/Settings/Models/External/LidarrSettings.cs @@ -11,5 +11,6 @@ namespace Ombi.Settings.Settings.Models.External public bool AlbumFolder { get; set; } public int LanguageProfileId { get; set; } public int MetadataProfileId { get; set; } + public bool AddOnly { get; set; } } } \ No newline at end of file diff --git a/src/Ombi/ClientApp/app/interfaces/ISettings.ts b/src/Ombi/ClientApp/app/interfaces/ISettings.ts index 2fb46a2b7..db4db935e 100644 --- a/src/Ombi/ClientApp/app/interfaces/ISettings.ts +++ b/src/Ombi/ClientApp/app/interfaces/ISettings.ts @@ -93,6 +93,7 @@ export interface ILidarrSettings extends IExternalSettings { metadataProfileId: number; languageProfileId: number; albumFolder: boolean; + addOnly: boolean; } export interface ILandingPageSettings extends ISettings { diff --git a/src/Ombi/ClientApp/app/settings/lidarr/lidarr.component.html b/src/Ombi/ClientApp/app/settings/lidarr/lidarr.component.html index 11d9baf2d..c834fbdbd 100644 --- a/src/Ombi/ClientApp/app/settings/lidarr/lidarr.component.html +++ b/src/Ombi/ClientApp/app/settings/lidarr/lidarr.component.html @@ -3,6 +3,10 @@
Lidarr Settings +
+ Advanced + +
@@ -110,6 +114,12 @@
+
+
+ + +
+
diff --git a/src/Ombi/ClientApp/app/settings/lidarr/lidarr.component.ts b/src/Ombi/ClientApp/app/settings/lidarr/lidarr.component.ts index 5d85c3d73..1f372546a 100644 --- a/src/Ombi/ClientApp/app/settings/lidarr/lidarr.component.ts +++ b/src/Ombi/ClientApp/app/settings/lidarr/lidarr.component.ts @@ -45,6 +45,7 @@ export class LidarrComponent implements OnInit { albumFolder: [x.albumFolder], languageProfileId: [x.languageProfileId, [Validators.required]], metadataProfileId: [x.metadataProfileId, [Validators.required]], + addOnly: [x.addOnly] }); if (x.defaultQualityProfile) { From cfd9deb17edde4c0632f57611dc29874db96c222 Mon Sep 17 00:00:00 2001 From: TidusJar Date: Tue, 4 Sep 2018 09:29:32 +0100 Subject: [PATCH 35/45] !wip fixed linting --- src/Ombi/ClientApp/app/settings/lidarr/lidarr.component.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Ombi/ClientApp/app/settings/lidarr/lidarr.component.ts b/src/Ombi/ClientApp/app/settings/lidarr/lidarr.component.ts index 1f372546a..d1e28285f 100644 --- a/src/Ombi/ClientApp/app/settings/lidarr/lidarr.component.ts +++ b/src/Ombi/ClientApp/app/settings/lidarr/lidarr.component.ts @@ -45,7 +45,7 @@ export class LidarrComponent implements OnInit { albumFolder: [x.albumFolder], languageProfileId: [x.languageProfileId, [Validators.required]], metadataProfileId: [x.metadataProfileId, [Validators.required]], - addOnly: [x.addOnly] + addOnly: [x.addOnly], }); if (x.defaultQualityProfile) { From 9c574fb7e901ac16fd9c76e1a5dd3744140632f7 Mon Sep 17 00:00:00 2001 From: Kenton Royal Date: Wed, 5 Sep 2018 00:12:19 +0100 Subject: [PATCH 36/45] Add quota fields to user view model --- .../Engine/Interfaces/IRequestEngine.cs | 2 +- src/Ombi.Core/Engine/MovieRequestEngine.cs | 8 ++++++-- src/Ombi.Core/Engine/TvRequestEngine.cs | 8 ++++++-- src/Ombi.Core/Models/UI/UserViewModel.cs | 2 ++ src/Ombi/ClientApp/app/interfaces/IUser.ts | 4 ++++ .../usermanagement-add.component.ts | 2 ++ src/Ombi/Controllers/IdentityController.cs | 20 +++++++++++++++++-- 7 files changed, 39 insertions(+), 7 deletions(-) diff --git a/src/Ombi.Core/Engine/Interfaces/IRequestEngine.cs b/src/Ombi.Core/Engine/Interfaces/IRequestEngine.cs index 53111fd95..c8b7746f0 100644 --- a/src/Ombi.Core/Engine/Interfaces/IRequestEngine.cs +++ b/src/Ombi.Core/Engine/Interfaces/IRequestEngine.cs @@ -23,6 +23,6 @@ namespace Ombi.Core.Engine.Interfaces Task GetTotal(); Task UnSubscribeRequest(int requestId, RequestType type); Task SubscribeToRequest(int requestId, RequestType type); - Task GetRemainingRequests(); + Task GetRemainingRequests(OmbiUser user = null); } } \ No newline at end of file diff --git a/src/Ombi.Core/Engine/MovieRequestEngine.cs b/src/Ombi.Core/Engine/MovieRequestEngine.cs index 733ba4b4f..0cce7af58 100644 --- a/src/Ombi.Core/Engine/MovieRequestEngine.cs +++ b/src/Ombi.Core/Engine/MovieRequestEngine.cs @@ -486,9 +486,13 @@ namespace Ombi.Core.Engine return new RequestEngineResult {Result = true, Message = $"{movieName} has been successfully added!"}; } - public async Task GetRemainingRequests() + public async Task GetRemainingRequests(OmbiUser user) { - OmbiUser user = await GetUser(); + if (user == null) + { + user = await GetUser(); + } + int limit = user.MovieRequestLimit ?? 0; if (limit <= 0) diff --git a/src/Ombi.Core/Engine/TvRequestEngine.cs b/src/Ombi.Core/Engine/TvRequestEngine.cs index f9a6e640d..a700035a0 100644 --- a/src/Ombi.Core/Engine/TvRequestEngine.cs +++ b/src/Ombi.Core/Engine/TvRequestEngine.cs @@ -615,9 +615,13 @@ namespace Ombi.Core.Engine return new RequestEngineResult { Result = true }; } - public async Task GetRemainingRequests() + public async Task GetRemainingRequests(OmbiUser user) { - OmbiUser user = await GetUser(); + if (user == null) + { + user = await GetUser(); + } + int limit = user.EpisodeRequestLimit ?? 0; if (limit <= 0) diff --git a/src/Ombi.Core/Models/UI/UserViewModel.cs b/src/Ombi.Core/Models/UI/UserViewModel.cs index 1c1e6162b..cddc32b90 100644 --- a/src/Ombi.Core/Models/UI/UserViewModel.cs +++ b/src/Ombi.Core/Models/UI/UserViewModel.cs @@ -16,6 +16,8 @@ namespace Ombi.Core.Models.UI public UserType UserType { get; set; } public int MovieRequestLimit { get; set; } public int EpisodeRequestLimit { get; set; } + public RequestQuotaCountModel EpisodeRequestQuota { get; set; } + public RequestQuotaCountModel MovieRequestQuota { get; set; } } public class ClaimCheckboxes diff --git a/src/Ombi/ClientApp/app/interfaces/IUser.ts b/src/Ombi/ClientApp/app/interfaces/IUser.ts index cd96848fb..9e14dcfb4 100644 --- a/src/Ombi/ClientApp/app/interfaces/IUser.ts +++ b/src/Ombi/ClientApp/app/interfaces/IUser.ts @@ -1,4 +1,5 @@ import { ICheckbox } from "."; +import { IRemainingRequests } from "./IRemainingRequests"; export interface IUser { id: string; @@ -13,7 +14,10 @@ export interface IUser { movieRequestLimit: number; episodeRequestLimit: number; userAccessToken: string; + // FOR UI + episodeRequestQuota: IRemainingRequests | null; + movieRequestQuota: IRemainingRequests | null; checked: boolean; } diff --git a/src/Ombi/ClientApp/app/usermanagement/usermanagement-add.component.ts b/src/Ombi/ClientApp/app/usermanagement/usermanagement-add.component.ts index 36b187e79..5e0799552 100644 --- a/src/Ombi/ClientApp/app/usermanagement/usermanagement-add.component.ts +++ b/src/Ombi/ClientApp/app/usermanagement/usermanagement-add.component.ts @@ -32,6 +32,8 @@ export class UserManagementAddComponent implements OnInit { episodeRequestLimit: 0, movieRequestLimit: 0, userAccessToken: "", + episodeRequestQuota: null, + movieRequestQuota: null, }; } diff --git a/src/Ombi/Controllers/IdentityController.cs b/src/Ombi/Controllers/IdentityController.cs index 742d75b34..3ecb9c3e7 100644 --- a/src/Ombi/Controllers/IdentityController.cs +++ b/src/Ombi/Controllers/IdentityController.cs @@ -16,6 +16,7 @@ using Ombi.Api.Plex; using Ombi.Attributes; using Ombi.Config; using Ombi.Core.Authentication; +using Ombi.Core.Engine.Interfaces; using Ombi.Core.Helpers; using Ombi.Core.Models.UI; using Ombi.Core.Settings; @@ -60,7 +61,9 @@ namespace Ombi.Controllers IRepository issueComments, IRepository notificationRepository, IRepository subscriptionRepository, - ISettingsService umSettings) + ISettingsService umSettings, + IMovieRequestEngine movieRequestEngine, + ITvRequestEngine tvRequestEngine) { UserManager = user; Mapper = mapper; @@ -81,6 +84,8 @@ namespace Ombi.Controllers _requestSubscriptionRepository = subscriptionRepository; _notificationRepository = notificationRepository; _userManagementSettings = umSettings; + TvRequestEngine = tvRequestEngine; + MovieRequestEngine = movieRequestEngine; } private OmbiUserManager UserManager { get; } @@ -94,6 +99,8 @@ namespace Ombi.Controllers private IWelcomeEmail WelcomeEmail { get; } private IMovieRequestRepository MovieRepo { get; } private ITvRequestRepository TvRepo { get; } + private IMovieRequestEngine MovieRequestEngine { get; } + private ITvRequestEngine TvRequestEngine { get; } private readonly ILogger _log; private readonly IPlexApi _plexApi; private readonly ISettingsService _plexSettings; @@ -103,7 +110,6 @@ namespace Ombi.Controllers private readonly IRepository _notificationRepository; private readonly IRepository _requestSubscriptionRepository; - /// /// This is what the Wizard will call when creating the user for the very first time. /// This should never be called after this. @@ -316,6 +322,16 @@ namespace Ombi.Controllers }); } + if (vm.EpisodeRequestLimit > 0) + { + vm.EpisodeRequestQuota = await TvRequestEngine.GetRemainingRequests(user); + } + + if (vm.MovieRequestLimit > 0) + { + vm.MovieRequestQuota = await MovieRequestEngine.GetRemainingRequests(user); + } + return vm; } From 30c9de818b9a93766a0fdb7145cbe14f0865c13f Mon Sep 17 00:00:00 2001 From: Kenton Royal Date: Wed, 5 Sep 2018 18:48:03 +0100 Subject: [PATCH 37/45] Add html for displaying remaining requests on users page --- .../usermanagement.component.html | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/src/Ombi/ClientApp/app/usermanagement/usermanagement.component.html b/src/Ombi/ClientApp/app/usermanagement/usermanagement.component.html index 519db023f..98bc8749b 100644 --- a/src/Ombi/ClientApp/app/usermanagement/usermanagement.component.html +++ b/src/Ombi/ClientApp/app/usermanagement/usermanagement.component.html @@ -48,6 +48,12 @@ Roles + + Requests Remaining + + + Next Request Due + Last Logged In @@ -85,6 +91,22 @@
+ +
+ Movies: {{u.movieRequestQuota.remaining}}/{{u.movieRequestLimit}} remaining +
+
+ TV: {{u.episodeRequestQuota.remaining}}/{{u.episodeRequestLimit}} remaining +
+ + +
+ Movie: {{u.movieRequestQuota.nextRequest | date: 'short'}} +
+
+ TV: {{u.episodeRequestQuota.nextRequest | date: 'short'}} +
+ {{u.lastLoggedIn | date: 'short'}} From c9b6f5f05eb56f108eac7beff797892fe9f6da26 Mon Sep 17 00:00:00 2001 From: Kenton Royal Date: Wed, 5 Sep 2018 20:25:51 +0100 Subject: [PATCH 38/45] Add to translations --- src/Ombi.Core/Engine/MovieRequestEngine.cs | 6 ++++++ src/Ombi.Core/Engine/TvRequestEngine.cs | 6 ++++++ .../app/usermanagement/usermanagement.component.html | 8 ++++---- .../ClientApp/app/usermanagement/usermanagement.module.ts | 3 +++ src/Ombi/wwwroot/translations/en.json | 6 ++++++ 5 files changed, 25 insertions(+), 4 deletions(-) diff --git a/src/Ombi.Core/Engine/MovieRequestEngine.cs b/src/Ombi.Core/Engine/MovieRequestEngine.cs index 0cce7af58..9fd6033bf 100644 --- a/src/Ombi.Core/Engine/MovieRequestEngine.cs +++ b/src/Ombi.Core/Engine/MovieRequestEngine.cs @@ -491,6 +491,12 @@ namespace Ombi.Core.Engine if (user == null) { user = await GetUser(); + + // If user is still null after attempting to get the logged in user, return null. + if (user == null) + { + return null; + } } int limit = user.MovieRequestLimit ?? 0; diff --git a/src/Ombi.Core/Engine/TvRequestEngine.cs b/src/Ombi.Core/Engine/TvRequestEngine.cs index a700035a0..6a7f370d9 100644 --- a/src/Ombi.Core/Engine/TvRequestEngine.cs +++ b/src/Ombi.Core/Engine/TvRequestEngine.cs @@ -620,6 +620,12 @@ namespace Ombi.Core.Engine if (user == null) { user = await GetUser(); + + // If user is still null after attempting to get the logged in user, return null. + if (user == null) + { + return null; + } } int limit = user.EpisodeRequestLimit ?? 0; diff --git a/src/Ombi/ClientApp/app/usermanagement/usermanagement.component.html b/src/Ombi/ClientApp/app/usermanagement/usermanagement.component.html index 98bc8749b..431ea7ddf 100644 --- a/src/Ombi/ClientApp/app/usermanagement/usermanagement.component.html +++ b/src/Ombi/ClientApp/app/usermanagement/usermanagement.component.html @@ -93,18 +93,18 @@
- Movies: {{u.movieRequestQuota.remaining}}/{{u.movieRequestLimit}} remaining + {{'UserManagment.MovieRemaining' | translate: {remaining: u.movieRequestQuota.remaining, total: u.movieRequestLimit} }}
- TV: {{u.episodeRequestQuota.remaining}}/{{u.episodeRequestLimit}} remaining + {{'UserManagment.TvRemaining' | translate: {remaining: u.episodeRequestQuota.remaining, total: u.episodeRequestLimit} }}
- Movie: {{u.movieRequestQuota.nextRequest | date: 'short'}} + {{'UserManagment.MovieDue' | translate: {date: (u.movieRequestQuota.nextRequest | date: 'short')} }}
- TV: {{u.episodeRequestQuota.nextRequest | date: 'short'}} + {{'UserManagment.TvDue' | translate: {date: (u.episodeRequestQuota.nextRequest | date: 'short')} }}
diff --git a/src/Ombi/ClientApp/app/usermanagement/usermanagement.module.ts b/src/Ombi/ClientApp/app/usermanagement/usermanagement.module.ts index cf25446f5..1a91cf295 100644 --- a/src/Ombi/ClientApp/app/usermanagement/usermanagement.module.ts +++ b/src/Ombi/ClientApp/app/usermanagement/usermanagement.module.ts @@ -19,6 +19,8 @@ import { AuthGuard } from "../auth/auth.guard"; import { OrderModule } from "ngx-order-pipe"; import { AddPlexUserComponent } from "./addplexuser.component"; +import { SharedModule } from "../shared/shared.module"; + const routes: Routes = [ { path: "", component: UserManagementComponent, canActivate: [AuthGuard] }, { path: "add", component: UserManagementAddComponent, canActivate: [AuthGuard] }, @@ -39,6 +41,7 @@ const routes: Routes = [ TooltipModule, OrderModule, SidebarModule, + SharedModule, ], declarations: [ UserManagementComponent, diff --git a/src/Ombi/wwwroot/translations/en.json b/src/Ombi/wwwroot/translations/en.json index b38f5fb95..c53229c3d 100644 --- a/src/Ombi/wwwroot/translations/en.json +++ b/src/Ombi/wwwroot/translations/en.json @@ -184,5 +184,11 @@ "FilterHeaderRequestStatus":"Status", "Approved":"Approved", "PendingApproval": "Pending Approval" + }, + "UserManagment": { + "TvRemaining": "TV: {{remaining}}/{{total}} remaining", + "MovieRemaining": "Movies: {{remaining}}/{{total}} remaining", + "TvDue": "TV: {{date}}", + "MovieDue": "Movie: {{date}}" } } From d081526e3f534c9d0d43ff7f7fd394ea95902d48 Mon Sep 17 00:00:00 2001 From: Kenton Royal Date: Wed, 5 Sep 2018 20:56:41 +0100 Subject: [PATCH 39/45] Fix bug in which requested TV wasn't logging for some users --- src/Ombi.Core/Engine/TvRequestEngine.cs | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/Ombi.Core/Engine/TvRequestEngine.cs b/src/Ombi.Core/Engine/TvRequestEngine.cs index 6a7f370d9..7994b23aa 100644 --- a/src/Ombi.Core/Engine/TvRequestEngine.cs +++ b/src/Ombi.Core/Engine/TvRequestEngine.cs @@ -588,6 +588,15 @@ namespace Ombi.Core.Engine NotificationHelper.NewRequest(model); } + await _requestLog.Add(new RequestLog + { + UserId = (await GetUser()).Id, + RequestDate = DateTime.UtcNow, + RequestId = model.Id, + RequestType = RequestType.TvShow, + EpisodeCount = model.SeasonRequests.Select(m => m.Episodes.Count).Sum(), + }); + if (model.Approved) { // Autosend @@ -603,15 +612,6 @@ namespace Ombi.Core.Engine }; } - await _requestLog.Add(new RequestLog - { - UserId = (await GetUser()).Id, - RequestDate = DateTime.UtcNow, - RequestId = model.Id, - RequestType = RequestType.TvShow, - EpisodeCount = model.SeasonRequests.Select(m => m.Episodes.Count).Sum(), - }); - return new RequestEngineResult { Result = true }; } From 9484c84488fe8e1f769b023f4df8459d96a33364 Mon Sep 17 00:00:00 2001 From: Stephen Panzer Date: Sat, 8 Sep 2018 15:06:51 -0600 Subject: [PATCH 40/45] Add href to a tags so that a pointer cursor shows on requests page --- src/Ombi/ClientApp/app/requests/request.component.html | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Ombi/ClientApp/app/requests/request.component.html b/src/Ombi/ClientApp/app/requests/request.component.html index 45509fba3..d2df3c97a 100644 --- a/src/Ombi/ClientApp/app/requests/request.component.html +++ b/src/Ombi/ClientApp/app/requests/request.component.html @@ -3,14 +3,14 @@ From 7d50a845ccbfc7d8e1ed6bc940b211d2d8d3bd27 Mon Sep 17 00:00:00 2001 From: TidusJar Date: Wed, 12 Sep 2018 13:22:15 +0100 Subject: [PATCH 41/45] Users can now see the music search tab #2493 --- src/Ombi/ClientApp/app/search/search.component.ts | 2 +- src/Ombi/ClientApp/app/services/settings.service.ts | 4 ++++ src/Ombi/Controllers/SettingsController.cs | 12 ++++++++++++ 3 files changed, 17 insertions(+), 1 deletion(-) diff --git a/src/Ombi/ClientApp/app/search/search.component.ts b/src/Ombi/ClientApp/app/search/search.component.ts index 74221e71c..43d926970 100644 --- a/src/Ombi/ClientApp/app/search/search.component.ts +++ b/src/Ombi/ClientApp/app/search/search.component.ts @@ -20,7 +20,7 @@ export class SearchComponent implements OnInit { } public ngOnInit() { - this.settingsService.getLidarr().subscribe(x => this.musicEnabled = x.enabled); + this.settingsService.lidarrEnabled().subscribe(x => this.musicEnabled = x); this.showMovie = true; this.showTv = false; this.showMusic = false; diff --git a/src/Ombi/ClientApp/app/services/settings.service.ts b/src/Ombi/ClientApp/app/services/settings.service.ts index 2016d10b7..b4611bfa8 100644 --- a/src/Ombi/ClientApp/app/services/settings.service.ts +++ b/src/Ombi/ClientApp/app/services/settings.service.ts @@ -96,6 +96,10 @@ export class SettingsService extends ServiceHelpers { return this.http.get(`${this.url}/Lidarr`, {headers: this.headers}); } + public lidarrEnabled(): Observable { + return this.http.get(`${this.url}/lidarrenabled`, {headers: this.headers}); + } + public saveLidarr(settings: ILidarrSettings): Observable { return this.http.post(`${this.url}/Lidarr`, JSON.stringify(settings), {headers: this.headers}); } diff --git a/src/Ombi/Controllers/SettingsController.cs b/src/Ombi/Controllers/SettingsController.cs index 84192c53c..474ae8823 100644 --- a/src/Ombi/Controllers/SettingsController.cs +++ b/src/Ombi/Controllers/SettingsController.cs @@ -328,6 +328,18 @@ namespace Ombi.Controllers return await Get(); } + /// + /// Gets the Lidarr Settings. + /// + /// + [HttpGet("lidarrenabled")] + [AllowAnonymous] + public async Task LidarrEnabled() + { + var settings = await Get(); + return settings.Enabled; + } + /// /// Save the Lidarr settings. /// From 9903b17764cda764635a173b581b5f7cdbe8a6cf Mon Sep 17 00:00:00 2001 From: TidusJar Date: Thu, 13 Sep 2018 11:40:59 +0100 Subject: [PATCH 42/45] Update the .net core packages to fix "CVE-2018-8409: ASP.NET Core Denial Of Service Vulnerability" --- src/Ombi/Ombi.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Ombi/Ombi.csproj b/src/Ombi/Ombi.csproj index 6640a8eb8..f01e7c05d 100644 --- a/src/Ombi/Ombi.csproj +++ b/src/Ombi/Ombi.csproj @@ -71,7 +71,7 @@ - + From 8915e64ff36f8173dd3a2830b98a353f1efffa7e Mon Sep 17 00:00:00 2001 From: TidusJar Date: Thu, 13 Sep 2018 11:45:19 +0100 Subject: [PATCH 43/45] Updated all the MS packages --- src/Ombi.Core/Ombi.Core.csproj | 2 +- .../Ombi.DependencyInjection.csproj | 4 ++-- src/Ombi.Helpers/Ombi.Helpers.csproj | 2 +- src/Ombi.Schedule.Tests/Ombi.Schedule.Tests.csproj | 2 +- src/Ombi.Store/Ombi.Store.csproj | 8 ++++---- 5 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/Ombi.Core/Ombi.Core.csproj b/src/Ombi.Core/Ombi.Core.csproj index c2aeb1fd0..10e07822a 100644 --- a/src/Ombi.Core/Ombi.Core.csproj +++ b/src/Ombi.Core/Ombi.Core.csproj @@ -13,7 +13,7 @@ - + diff --git a/src/Ombi.DependencyInjection/Ombi.DependencyInjection.csproj b/src/Ombi.DependencyInjection/Ombi.DependencyInjection.csproj index 6fe083fe3..028c37b43 100644 --- a/src/Ombi.DependencyInjection/Ombi.DependencyInjection.csproj +++ b/src/Ombi.DependencyInjection/Ombi.DependencyInjection.csproj @@ -9,8 +9,8 @@ - - + + diff --git a/src/Ombi.Helpers/Ombi.Helpers.csproj b/src/Ombi.Helpers/Ombi.Helpers.csproj index e94afc816..2aaaa076f 100644 --- a/src/Ombi.Helpers/Ombi.Helpers.csproj +++ b/src/Ombi.Helpers/Ombi.Helpers.csproj @@ -10,7 +10,7 @@ - + diff --git a/src/Ombi.Schedule.Tests/Ombi.Schedule.Tests.csproj b/src/Ombi.Schedule.Tests/Ombi.Schedule.Tests.csproj index a124f01bd..ea1d17f8c 100644 --- a/src/Ombi.Schedule.Tests/Ombi.Schedule.Tests.csproj +++ b/src/Ombi.Schedule.Tests/Ombi.Schedule.Tests.csproj @@ -5,7 +5,7 @@ - + diff --git a/src/Ombi.Store/Ombi.Store.csproj b/src/Ombi.Store/Ombi.Store.csproj index 2ceb78424..cdbd3fe84 100644 --- a/src/Ombi.Store/Ombi.Store.csproj +++ b/src/Ombi.Store/Ombi.Store.csproj @@ -10,10 +10,10 @@ - - - - + + + + From 3bcaefc24a6b4d20dcf193d71e129ec9b5ef0319 Mon Sep 17 00:00:00 2001 From: TidusJar Date: Tue, 18 Sep 2018 12:39:44 +0100 Subject: [PATCH 44/45] Fixed #2516 --- src/Ombi/ClientApp/app/search/music/albumsearch.component.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Ombi/ClientApp/app/search/music/albumsearch.component.html b/src/Ombi/ClientApp/app/search/music/albumsearch.component.html index fd5f71075..d2430bd62 100644 --- a/src/Ombi/ClientApp/app/search/music/albumsearch.component.html +++ b/src/Ombi/ClientApp/app/search/music/albumsearch.component.html @@ -13,7 +13,7 @@

- {{result.title}} + {{result.title | truncate: 36}}

From 2e90edd9c3560c8d90983e3d381019c48d423353 Mon Sep 17 00:00:00 2001 From: TidusJar Date: Tue, 18 Sep 2018 12:48:29 +0100 Subject: [PATCH 45/45] Fixed #2485 --- .../ClientApp/app/login/login.component.ts | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/Ombi/ClientApp/app/login/login.component.ts b/src/Ombi/ClientApp/app/login/login.component.ts index abf387fa1..0c04edbad 100644 --- a/src/Ombi/ClientApp/app/login/login.component.ts +++ b/src/Ombi/ClientApp/app/login/login.component.ts @@ -127,18 +127,18 @@ export class LoginComponent implements OnDestroy, OnInit { } public oauth() { + const oAuthWindow = window.open(window.location.toString(), "_blank", `toolbar=0, + location=0, + status=0, + menubar=0, + scrollbars=1, + resizable=1, + width=500, + height=500`); this.plexTv.GetPin(this.clientId, this.appName).subscribe((pin: any) => { this.authService.login({ usePlexOAuth: true, password: "", rememberMe: true, username: "", plexTvPin: pin }).subscribe(x => { - - window.open(x.url, "_blank", `toolbar=0, - location=0, - status=0, - menubar=0, - scrollbars=1, - resizable=1, - width=500, - height=500`); + oAuthWindow!.location.replace(x.url); this.pinTimer = setInterval(() => { this.notify.info("Authenticating", "Loading... Please Wait");