diff --git a/src/Ombi.Core/Engine/Interfaces/IMovieRequestEngine.cs b/src/Ombi.Core/Engine/Interfaces/IMovieRequestEngine.cs index 64c76b18f..dfcd1b1da 100644 --- a/src/Ombi.Core/Engine/Interfaces/IMovieRequestEngine.cs +++ b/src/Ombi.Core/Engine/Interfaces/IMovieRequestEngine.cs @@ -1,4 +1,5 @@ using System.Collections.Generic; +using System.Threading; using System.Threading.Tasks; using Ombi.Core.Models.Requests; using Ombi.Core.Models.UI; @@ -11,6 +12,7 @@ namespace Ombi.Core.Engine.Interfaces Task RequestMovie(MovieRequestViewModel model); Task> SearchMovieRequest(string search); + Task RequestCollection(int collectionId, CancellationToken cancellationToken); Task RemoveMovieRequest(int requestId); Task RemoveAllMovieRequests(); diff --git a/src/Ombi.Core/Engine/MovieRequestEngine.cs b/src/Ombi.Core/Engine/MovieRequestEngine.cs index d37983d21..269961c2f 100644 --- a/src/Ombi.Core/Engine/MovieRequestEngine.cs +++ b/src/Ombi.Core/Engine/MovieRequestEngine.cs @@ -559,6 +559,30 @@ namespace Ombi.Core.Engine return await ProcessSendingMovie(request); } + public async Task RequestCollection(int collectionId, CancellationToken cancellationToken) + { + var langCode = await DefaultLanguageCode(null); + var collections = await Cache.GetOrAdd($"GetCollection{collectionId}{langCode}", + async () => await MovieApi.GetCollection(langCode, collectionId, cancellationToken), DateTime.Now.AddDays(1), cancellationToken); + + var results = new List(); + foreach (var collection in collections.parts) + { + results.Add(await RequestMovie(new MovieRequestViewModel + { + TheMovieDbId = collection.id + })); + } + + + if (results.All(x => x.IsError)) + { + new RequestEngineResult { Result = false, ErrorMessage = $"The whole collection {collections.name} Is already monitored or requested!" }; + } + + return new RequestEngineResult { Result = true, Message = $"The collection {collections.name} has been successfully added!", RequestId = results.FirstOrDefault().RequestId}; + } + private async Task ProcessSendingMovie(MovieRequests request) { if (request.Approved) @@ -642,7 +666,7 @@ namespace Ombi.Core.Engine public async Task ReProcessRequest(int requestId, CancellationToken cancellationToken) { - var request = await MovieRepository.Find(requestId); + var request = await MovieRepository.Find(requestId); if (request == null) { return new RequestEngineResult diff --git a/src/Ombi.Core/Models/Search/V2/MovieCollectionsViewModel.cs b/src/Ombi.Core/Models/Search/V2/MovieCollectionsViewModel.cs index 47870c18b..0cecd83e5 100644 --- a/src/Ombi.Core/Models/Search/V2/MovieCollectionsViewModel.cs +++ b/src/Ombi.Core/Models/Search/V2/MovieCollectionsViewModel.cs @@ -16,7 +16,7 @@ namespace Ombi.Core.Models.Search.V2 public string Overview { get; set; } public string PosterPath { get; set; } public string Title { get; set; } - public DateTime ReleaseDate { get; set; } + public DateTime? ReleaseDate { get; set; } public override RequestType Type => RequestType.Movie; diff --git a/src/Ombi.Mapping/Profiles/MovieProfile.cs b/src/Ombi.Mapping/Profiles/MovieProfile.cs index 161cb1fda..0551abd58 100644 --- a/src/Ombi.Mapping/Profiles/MovieProfile.cs +++ b/src/Ombi.Mapping/Profiles/MovieProfile.cs @@ -104,7 +104,7 @@ namespace Ombi.Mapping.Profiles .ForMember(x => x.Id, o => o.MapFrom(s => s.id)) .ForMember(x => x.Overview, o => o.MapFrom(s => s.overview)) .ForMember(x => x.PosterPath, o => o.MapFrom(s => s.poster_path)) - .ForMember(x => x.ReleaseDate, o => o.MapFrom(s => DateTime.Parse(s.release_date))) + .ForMember(x => x.ReleaseDate, o => o.MapFrom(s => string.IsNullOrEmpty(s.release_date) ? (DateTime?)null : DateTime.Parse(s.release_date))) .ForMember(x => x.Title, o => o.MapFrom(s => s.title)); CreateMap().ReverseMap(); diff --git a/src/Ombi/ClientApp/src/app/discover/components/collections/discover-collections.component.html b/src/Ombi/ClientApp/src/app/discover/components/collections/discover-collections.component.html index 4bc510b20..6c892fae6 100644 --- a/src/Ombi/ClientApp/src/app/discover/components/collections/discover-collections.component.html +++ b/src/Ombi/ClientApp/src/app/discover/components/collections/discover-collections.component.html @@ -10,9 +10,11 @@ -
+
diff --git a/src/Ombi/ClientApp/src/app/discover/components/collections/discover-collections.component.scss b/src/Ombi/ClientApp/src/app/discover/components/collections/discover-collections.component.scss index 728ff23c5..f90915636 100644 --- a/src/Ombi/ClientApp/src/app/discover/components/collections/discover-collections.component.scss +++ b/src/Ombi/ClientApp/src/app/discover/components/collections/discover-collections.component.scss @@ -14,6 +14,27 @@ margin-bottom: 28px; } +.lightbox { + /* Default to hidden */ + + /* Overlay entire screen */ + position: fixed; + z-index: 999; + top: 0; + left: 0; + right: 0; + bottom: 0; + + /* A bit of padding around image */ + padding: 1em; + + /* Translucent background */ + background: rgba(0, 0, 0, 0.8); + } + .loading-spinner { margin: 10%; + position: absolute; + width: 100vh; + z-index: 10; } \ No newline at end of file diff --git a/src/Ombi/ClientApp/src/app/discover/components/collections/discover-collections.component.ts b/src/Ombi/ClientApp/src/app/discover/components/collections/discover-collections.component.ts index 82593bab1..b4147f04e 100644 --- a/src/Ombi/ClientApp/src/app/discover/components/collections/discover-collections.component.ts +++ b/src/Ombi/ClientApp/src/app/discover/components/collections/discover-collections.component.ts @@ -1,10 +1,12 @@ import { Component, OnInit } from "@angular/core"; +import { MessageService, SearchV2Service } from "../../../services"; + import { ActivatedRoute } from "@angular/router"; -import { SearchV2Service, RequestService, MessageService } from "../../../services"; -import { IMovieCollectionsViewModel } from "../../../interfaces/ISearchTvResultV2"; -import { IDiscoverCardResult } from "../../interfaces"; -import { RequestType } from "../../../interfaces"; import { AuthService } from "../../../auth/auth.service"; +import { IDiscoverCardResult } from "../../interfaces"; +import { IMovieCollectionsViewModel } from "../../../interfaces/ISearchTvResultV2"; +import { RequestServiceV2 } from "../../../services/requestV2.service"; +import { RequestType } from "../../../interfaces"; @Component({ templateUrl: "./discover-collections.component.html", @@ -21,7 +23,7 @@ export class DiscoverCollectionsComponent implements OnInit { constructor(private searchService: SearchV2Service, private route: ActivatedRoute, - private requestService: RequestService, + private requestServiceV2: RequestServiceV2, private messageService: MessageService, private auth: AuthService) { this.route.params.subscribe((params: any) => { @@ -37,10 +39,15 @@ export class DiscoverCollectionsComponent implements OnInit { } public async requestCollection() { - await this.collection.collection.forEach(async (movie) => { - await this.requestService.requestMovie({theMovieDbId: movie.id, languageCode: null, requestOnBehalf: null, qualityPathOverride: null, rootFolderOverride: null}).toPromise(); + this.loading(); + this.requestServiceV2.requestMovieCollection(this.collectionId).subscribe(result => { + if (result.result) { + this.messageService.send(result.message); + } else { + this.messageService.send(result.errorMessage); + } + this.finishLoading(); }); - this.messageService.send("Requested Collection"); } private createModel() { diff --git a/src/Ombi/ClientApp/src/app/services/requestV2.service.ts b/src/Ombi/ClientApp/src/app/services/requestV2.service.ts index a7ebd6d0c..433547b8f 100644 --- a/src/Ombi/ClientApp/src/app/services/requestV2.service.ts +++ b/src/Ombi/ClientApp/src/app/services/requestV2.service.ts @@ -96,4 +96,8 @@ export class RequestServiceV2 extends ServiceHelpers { public reprocessRequest(requestId: number, type: RequestType): Observable { return this.http.post(`${this.url}reprocess/${type}/${requestId}`, undefined, { headers: this.headers }); } + + public requestMovieCollection(collectionId: number): Observable { + return this.http.post(`${this.url}movie/collection/${collectionId}`, undefined, { headers: this.headers }); + } } diff --git a/src/Ombi/Controllers/V2/RequestsController.cs b/src/Ombi/Controllers/V2/RequestsController.cs index 67d206e0b..6449db438 100644 --- a/src/Ombi/Controllers/V2/RequestsController.cs +++ b/src/Ombi/Controllers/V2/RequestsController.cs @@ -216,6 +216,12 @@ namespace Ombi.Controllers.V2 return BadRequest(); } + [HttpPost("movie/collection/{collectionId}")] + public async Task RequestCollection(int collectionId) + { + return await _movieRequestEngine.RequestCollection(collectionId, HttpContext.RequestAborted); + } + private string GetApiAlias() { // Make sure this only applies when using the API KEY