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