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
+
+ 1">
+ Another request will be added in {{daysUntil}} {{daysUntil == 1 ? "day" : "days"}}
+
+ 1 && daysUntil <= 1">
+ Another request will be added in {{hoursUntil}} {{hoursUntil == 1 ? "hour" : "hours"}}
+
+ 1 && hoursUntil <= 1 && daysUntil <= 1" #minutes>
+ 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