diff --git a/src/Ombi.Core/Engine/Interfaces/IMovieRequestEngine.cs b/src/Ombi.Core/Engine/Interfaces/IMovieRequestEngine.cs index bc1fa68d1..2cd834624 100644 --- a/src/Ombi.Core/Engine/Interfaces/IMovieRequestEngine.cs +++ b/src/Ombi.Core/Engine/Interfaces/IMovieRequestEngine.cs @@ -20,5 +20,6 @@ namespace Ombi.Core.Engine.Interfaces Task ApproveMovieById(int requestId); Task DenyMovieById(int modelId, string denyReason); Task> GetRequests(int count, int position, string sortProperty, string sortOrder); + Task UpdateAdvancedOptions(MovieAdvancedOptions options); } } \ No newline at end of file diff --git a/src/Ombi.Core/Engine/MovieRequestEngine.cs b/src/Ombi.Core/Engine/MovieRequestEngine.cs index 231c1d062..33b45ed54 100644 --- a/src/Ombi.Core/Engine/MovieRequestEngine.cs +++ b/src/Ombi.Core/Engine/MovieRequestEngine.cs @@ -249,6 +249,29 @@ namespace Ombi.Core.Engine } + public async Task UpdateAdvancedOptions(MovieAdvancedOptions options) + { + var request = await MovieRepository.Find(options.RequestId); + if (request == null) + { + return new RequestEngineResult + { + Result = false, + ErrorMessage = "Request does not exist" + }; + } + + request.QualityOverride = options.QualityOverride; + request.RootPathOverride = options.RootPathOverride; + + await MovieRepository.Update(request); + + return new RequestEngineResult + { + Result = true + }; + } + private IQueryable OrderMovies(IQueryable allRequests, OrderType type) { switch (type) diff --git a/src/Ombi.Core/Models/Requests/MovieAdvancedOptions.cs b/src/Ombi.Core/Models/Requests/MovieAdvancedOptions.cs new file mode 100644 index 000000000..7ac2f2bd6 --- /dev/null +++ b/src/Ombi.Core/Models/Requests/MovieAdvancedOptions.cs @@ -0,0 +1,9 @@ +namespace Ombi.Core.Models.Requests +{ + public class MovieAdvancedOptions + { + public int RequestId { get; set; } + public int RootPathOverride { get; set; } + public int QualityOverride { get; set; } + } +} \ No newline at end of file diff --git a/src/Ombi/ClientApp/src/app/interfaces/IRadarr.ts b/src/Ombi/ClientApp/src/app/interfaces/IRadarr.ts index 9370cc6e7..a52b19d9d 100644 --- a/src/Ombi/ClientApp/src/app/interfaces/IRadarr.ts +++ b/src/Ombi/ClientApp/src/app/interfaces/IRadarr.ts @@ -17,13 +17,11 @@ export interface IMinimumAvailability { value: string; name: string; } - -export interface IAdvancedModel { - profile: IRadarrProfile; - rootFolder: IRadarrRootFolder; -} - export interface IAdvancedData { + profile: IRadarrProfile; profiles: IRadarrProfile[]; + profileId: number; + rootFolder: IRadarrRootFolder; rootFolders: IRadarrRootFolder[]; + rootFolderId: number; } \ No newline at end of file diff --git a/src/Ombi/ClientApp/src/app/interfaces/IRequestModel.ts b/src/Ombi/ClientApp/src/app/interfaces/IRequestModel.ts index a45871770..5e76f9b40 100644 --- a/src/Ombi/ClientApp/src/app/interfaces/IRequestModel.ts +++ b/src/Ombi/ClientApp/src/app/interfaces/IRequestModel.ts @@ -21,6 +21,12 @@ export interface IMovieRequests extends IFullBaseRequest { qualityOverrideTitle: string; } +export interface IMovieAdvancedOptions { + requestId: number; + qualityOverride: number; + rootPathOverride: number; +} + export interface IAlbumRequest extends IBaseRequest { foreignAlbumId: string; foreignArtistId: string; diff --git a/src/Ombi/ClientApp/src/app/media-details/components/index.ts b/src/Ombi/ClientApp/src/app/media-details/components/index.ts index aae142fa1..1d382dda1 100644 --- a/src/Ombi/ClientApp/src/app/media-details/components/index.ts +++ b/src/Ombi/ClientApp/src/app/media-details/components/index.ts @@ -11,6 +11,8 @@ import { DenyDialogComponent } from "./shared/deny-dialog/deny-dialog.component" import { TvRequestsPanelComponent } from "./tv/panels/tv-requests/tv-requests-panel.component"; import { MovieAdminPanelComponent } from "./movie/panels/movie-admin-panel/movie-admin-panel.component"; import { MovieAdvancedOptionsComponent } from "./movie/panels/movie-advanced-options/movie-advanced-options.component"; +import { SearchService, RequestService, RadarrService } from "../../services"; +import { RequestServiceV2 } from "../../services/requestV2.service"; export const components: any[] = [ MovieDetailsComponent, @@ -28,10 +30,15 @@ export const components: any[] = [ MovieAdvancedOptionsComponent ]; - - export const entryComponents: any[] = [ YoutubeTrailerComponent, DenyDialogComponent, MovieAdvancedOptionsComponent, ]; + +export const providers: any[] = [ + SearchService, + RequestService, + RadarrService, + RequestServiceV2, +]; diff --git a/src/Ombi/ClientApp/src/app/media-details/components/movie/movie-details.component.html b/src/Ombi/ClientApp/src/app/media-details/components/movie/movie-details.component.html index 036ad4e87..254dfb49b 100644 --- a/src/Ombi/ClientApp/src/app/media-details/components/movie/movie-details.component.html +++ b/src/Ombi/ClientApp/src/app/media-details/components/movie/movie-details.component.html @@ -82,13 +82,13 @@ - + - + diff --git a/src/Ombi/ClientApp/src/app/media-details/components/movie/movie-details.component.ts b/src/Ombi/ClientApp/src/app/media-details/components/movie/movie-details.component.ts index b8a6c3e7b..739d40fd1 100644 --- a/src/Ombi/ClientApp/src/app/media-details/components/movie/movie-details.component.ts +++ b/src/Ombi/ClientApp/src/app/media-details/components/movie/movie-details.component.ts @@ -6,7 +6,7 @@ import { ISearchMovieResultV2 } from "../../../interfaces/ISearchMovieResultV2"; import { MatDialog } from "@angular/material"; import { YoutubeTrailerComponent } from "../shared/youtube-trailer.component"; import { AuthService } from "../../../auth/auth.service"; -import { IMovieRequests, RequestType } from "../../../interfaces"; +import { IMovieRequests, RequestType, IAdvancedData } from "../../../interfaces"; import { DenyDialogComponent } from "../shared/deny-dialog/deny-dialog.component"; @Component({ @@ -19,6 +19,7 @@ export class MovieDetailsComponent { public hasRequest: boolean; public movieRequest: IMovieRequests; public isAdmin: boolean; + public advancedOptions: IAdvancedData; private theMovidDbId: number; @@ -100,4 +101,8 @@ export class MovieDetailsComponent { this.messageService.send(result.errorMessage, "Ok"); } } + + public setAdvancedOptions(data: any) { + this.advancedOptions = data; + } } diff --git a/src/Ombi/ClientApp/src/app/media-details/components/movie/panels/movie-admin-panel/movie-admin-panel.component.html b/src/Ombi/ClientApp/src/app/media-details/components/movie/panels/movie-admin-panel/movie-admin-panel.component.html index 7d20cfc08..13fc86050 100644 --- a/src/Ombi/ClientApp/src/app/media-details/components/movie/panels/movie-admin-panel/movie-admin-panel.component.html +++ b/src/Ombi/ClientApp/src/app/media-details/components/movie/panels/movie-admin-panel/movie-admin-panel.component.html @@ -1,3 +1,3 @@ -
+
\ No newline at end of file diff --git a/src/Ombi/ClientApp/src/app/media-details/components/movie/panels/movie-admin-panel/movie-admin-panel.component.ts b/src/Ombi/ClientApp/src/app/media-details/components/movie/panels/movie-admin-panel/movie-admin-panel.component.ts index a67390364..8c3f378a7 100644 --- a/src/Ombi/ClientApp/src/app/media-details/components/movie/panels/movie-admin-panel/movie-admin-panel.component.ts +++ b/src/Ombi/ClientApp/src/app/media-details/components/movie/panels/movie-admin-panel/movie-admin-panel.component.ts @@ -1,8 +1,9 @@ -import { Component, Input, OnInit } from "@angular/core"; +import { Component, Input, OnInit, EventEmitter, Output } from "@angular/core"; import { RadarrService } from "../../../../../services"; import { IRadarrProfile, IRadarrRootFolder, IMovieRequests, IAdvancedData } from "../../../../../interfaces"; import { MatDialog } from "@angular/material"; import { MovieAdvancedOptionsComponent } from "../movie-advanced-options/movie-advanced-options.component"; +import { RequestServiceV2 } from "../../../../../services/requestV2.service"; @Component({ templateUrl: "./movie-admin-panel.component.html", @@ -11,16 +12,19 @@ import { MovieAdvancedOptionsComponent } from "../movie-advanced-options/movie-a export class MovieAdminPanelComponent implements OnInit { @Input() public movie: IMovieRequests; + @Output() public advancedOptionsChanged = new EventEmitter(); + public radarrEnabled: boolean; public radarrProfiles: IRadarrProfile[]; public selectedRadarrProfile: IRadarrProfile; public radarrRootFolders: IRadarrRootFolder[]; public selectRadarrRootFolders: IRadarrRootFolder; - constructor(private radarrService: RadarrService, private dialog: MatDialog) { } + constructor(private radarrService: RadarrService, private requestService: RequestServiceV2, private dialog: MatDialog) { } public async ngOnInit() { - if (await this.radarrService.isRadarrEnabled()) { + this.radarrEnabled = await this.radarrService.isRadarrEnabled(); + if (this.radarrEnabled) { this.radarrService.getQualityProfilesFromSettings().subscribe(c => { this.radarrProfiles = c; this.setQualityOverrides(); @@ -32,10 +36,16 @@ export class MovieAdminPanelComponent implements OnInit { } } - public openAdvancedOptions() { + public async openAdvancedOptions() { const dialog = this.dialog.open(MovieAdvancedOptionsComponent, { width: "700px", data: { profiles: this.radarrProfiles, rootFolders: this.radarrRootFolders }, panelClass: 'modal-panel' }) - dialog.afterClosed().subscribe(result => { - console.log(result); + await dialog.afterClosed().subscribe(async result => { + if(result) { + // get the name and ids + result.rootFolder = result.rootFolders.filter(f => f.id === +result.rootFolderId)[0]; + result.profile = result.profiles.filter(f => f.id === +result.profileId)[0]; + await this.requestService.updateMovieAdvancedOptions({qualityOverride: result.profileId, rootPathOverride: result.rootFolderId, requestId: this.movie.id}).toPromise(); + this.advancedOptionsChanged.emit(result); + } }); } diff --git a/src/Ombi/ClientApp/src/app/media-details/components/movie/panels/movie-advanced-options/movie-advanced-options.component.html b/src/Ombi/ClientApp/src/app/media-details/components/movie/panels/movie-advanced-options/movie-advanced-options.component.html index 76cc80869..ad98fb432 100644 --- a/src/Ombi/ClientApp/src/app/media-details/components/movie/panels/movie-advanced-options/movie-advanced-options.component.html +++ b/src/Ombi/ClientApp/src/app/media-details/components/movie/panels/movie-advanced-options/movie-advanced-options.component.html @@ -4,18 +4,19 @@
Radarr Quality Profile - + {{profile.name}} Radarr Root Folders - + {{profile.path}}
- + +
diff --git a/src/Ombi/ClientApp/src/app/media-details/components/movie/panels/movie-advanced-options/movie-advanced-options.component.ts b/src/Ombi/ClientApp/src/app/media-details/components/movie/panels/movie-advanced-options/movie-advanced-options.component.ts index 93d0d7061..4e237890d 100644 --- a/src/Ombi/ClientApp/src/app/media-details/components/movie/panels/movie-advanced-options/movie-advanced-options.component.ts +++ b/src/Ombi/ClientApp/src/app/media-details/components/movie/panels/movie-advanced-options/movie-advanced-options.component.ts @@ -1,6 +1,6 @@ import { Component, Inject } from "@angular/core"; import { MatDialogRef, MAT_DIALOG_DATA } from "@angular/material"; -import { IAdvancedModel, IAdvancedData } from "../../../../../interfaces"; +import { IAdvancedData } from "../../../../../interfaces"; @Component({ templateUrl: "./movie-advanced-options.component.html", @@ -8,7 +8,7 @@ import { IAdvancedModel, IAdvancedData } from "../../../../../interfaces"; }) export class MovieAdvancedOptionsComponent { - public options: IAdvancedModel; - - constructor(public dialogRef: MatDialogRef, @Inject(MAT_DIALOG_DATA) public data: IAdvancedData) { } + constructor(public dialogRef: MatDialogRef, @Inject(MAT_DIALOG_DATA) public data: IAdvancedData, + ) { + } } diff --git a/src/Ombi/ClientApp/src/app/media-details/components/movie/panels/movie-information-panel.component.html b/src/Ombi/ClientApp/src/app/media-details/components/movie/panels/movie-information-panel.component.html index 359588028..304d35be5 100644 --- a/src/Ombi/ClientApp/src/app/media-details/components/movie/panels/movie-information-panel.component.html +++ b/src/Ombi/ClientApp/src/app/media-details/components/movie/panels/movie-information-panel.component.html @@ -19,6 +19,14 @@
+
+ Root Folder Override +
{{advancedOptions.rootFolder.path}}
+
+
+ Quality Override +
{{advancedOptions.profile.name}}
+

Genres: diff --git a/src/Ombi/ClientApp/src/app/media-details/components/movie/panels/movie-information-panel.component.ts b/src/Ombi/ClientApp/src/app/media-details/components/movie/panels/movie-information-panel.component.ts index 5d5d9005e..64b458de4 100644 --- a/src/Ombi/ClientApp/src/app/media-details/components/movie/panels/movie-information-panel.component.ts +++ b/src/Ombi/ClientApp/src/app/media-details/components/movie/panels/movie-information-panel.component.ts @@ -1,5 +1,6 @@ import { Component, ViewEncapsulation, Input } from "@angular/core"; import { ISearchMovieResultV2 } from "../../../../interfaces/ISearchMovieResultV2"; +import { IAdvancedData } from "../../../../interfaces"; @Component({ templateUrl: "./movie-information-panel.component.html", @@ -9,4 +10,5 @@ import { ISearchMovieResultV2 } from "../../../../interfaces/ISearchMovieResultV }) export class MovieInformationPanelComponent { @Input() public movie: ISearchMovieResultV2; + @Input() public advancedOptions: IAdvancedData; } diff --git a/src/Ombi/ClientApp/src/app/media-details/media-details.module.ts b/src/Ombi/ClientApp/src/app/media-details/media-details.module.ts index da68ba6b2..3e8ddfb92 100644 --- a/src/Ombi/ClientApp/src/app/media-details/media-details.module.ts +++ b/src/Ombi/ClientApp/src/app/media-details/media-details.module.ts @@ -12,6 +12,7 @@ import { PipeModule } from "../pipes/pipe.module"; import * as fromComponents from './components'; import { AuthGuard } from "../auth/auth.guard"; +import { RequestServiceV2 } from "../services/requestV2.service"; const routes: Routes = [ @@ -36,9 +37,7 @@ const routes: Routes = [ ...fromComponents.entryComponents ], providers: [ - SearchService, - RequestService, - RadarrService, + ...fromComponents.providers ], }) diff --git a/src/Ombi/ClientApp/src/app/services/requestV2.service.ts b/src/Ombi/ClientApp/src/app/services/requestV2.service.ts index e3ae468b2..5142f8974 100644 --- a/src/Ombi/ClientApp/src/app/services/requestV2.service.ts +++ b/src/Ombi/ClientApp/src/app/services/requestV2.service.ts @@ -1,10 +1,10 @@ -import { PlatformLocation, APP_BASE_HREF } from "@angular/common"; +import { APP_BASE_HREF } from "@angular/common"; import { Injectable, Inject } from "@angular/core"; import { HttpClient } from "@angular/common/http"; import { Observable } from "rxjs"; import { ServiceHelpers } from "./service.helpers"; -import { IRequestsViewModel, IMovieRequests, ITvRequests, IChildRequests } from "../interfaces"; +import { IRequestsViewModel, IMovieRequests, IChildRequests, IMovieAdvancedOptions, IRequestEngineResult } from "../interfaces"; @Injectable() @@ -19,6 +19,9 @@ export class RequestServiceV2 extends ServiceHelpers { public getTvRequests(count: number, position: number, sortProperty: string , order: string): Observable> { return this.http.get>(`${this.url}tv/${count}/${position}/${sortProperty}/${order}`, {headers: this.headers}); + } + + public updateMovieAdvancedOptions(options: IMovieAdvancedOptions): Observable { + return this.http.post(`${this.url}movie/advancedoptions`, options, {headers: this.headers}); } - } diff --git a/src/Ombi/ClientApp/src/app/services/signlarnotification.service.ts b/src/Ombi/ClientApp/src/app/services/signlarnotification.service.ts index e44b1d2b2..92ec7e3dc 100644 --- a/src/Ombi/ClientApp/src/app/services/signlarnotification.service.ts +++ b/src/Ombi/ClientApp/src/app/services/signlarnotification.service.ts @@ -26,7 +26,6 @@ export class SignalRNotificationService { this.hubConnection.on("Notification", (data: any) => { - debugger; this.Notification.emit(data); }); diff --git a/src/Ombi/Controllers/V2/RequestsController.cs b/src/Ombi/Controllers/V2/RequestsController.cs index 322b63b83..8acd40139 100644 --- a/src/Ombi/Controllers/V2/RequestsController.cs +++ b/src/Ombi/Controllers/V2/RequestsController.cs @@ -4,7 +4,9 @@ using Microsoft.AspNetCore.Mvc; using System.Threading.Tasks; using Ombi.Core; +using Ombi.Core.Engine; using Ombi.Core.Engine.Interfaces; +using Ombi.Core.Models.Requests; using Ombi.Core.Models.UI; using Ombi.Store.Entities.Requests; @@ -49,5 +51,11 @@ namespace Ombi.Controllers.V2 { return await _tvRequestEngine.GetRequests(count, position, sort, sortOrder); } + + [HttpPost("movie/advancedoptions")] + public async Task UpdateAdvancedOptions([FromBody] MovieAdvancedOptions options) + { + return await _movieRequestEngine.UpdateAdvancedOptions(options); + } } } \ No newline at end of file