Fixed an issue when requesting a collection that we have partially available, it would show as an error, but still add the remaining requests #3832

pull/4235/head v4.0.1424
tidusjar 3 years ago
parent 11527e332c
commit e63524c6e4

@ -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<RequestEngineResult> RequestMovie(MovieRequestViewModel model);
Task<IEnumerable<MovieRequests>> SearchMovieRequest(string search);
Task<RequestEngineResult> RequestCollection(int collectionId, CancellationToken cancellationToken);
Task RemoveMovieRequest(int requestId);
Task RemoveAllMovieRequests();

@ -559,6 +559,30 @@ namespace Ombi.Core.Engine
return await ProcessSendingMovie(request);
}
public async Task<RequestEngineResult> 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<RequestEngineResult>();
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<RequestEngineResult> ProcessSendingMovie(MovieRequests request)
{
if (request.Approved)
@ -642,7 +666,7 @@ namespace Ombi.Core.Engine
public async Task<RequestEngineResult> ReProcessRequest(int requestId, CancellationToken cancellationToken)
{
var request = await MovieRepository.Find(requestId);
var request = await MovieRepository.Find(requestId);
if (request == null)
{
return new RequestEngineResult

@ -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;

@ -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<SearchMovieViewModel, MovieCollection>().ReverseMap();

@ -10,9 +10,11 @@
<button class="col-2" mat-raised-button color="accent" (click)="requestCollection();">Request
Collection</button>
</div>
<div *ngIf="loadingFlag" class="row justify-content-md-center top-spacing loading-spinner">
<div *ngIf="loadingFlag" class="lightbox row justify-content-md-center">
<div class="row justify-content-md-center top-spacing loading-spinner">
<mat-spinner [color]="'accent'"></mat-spinner>
</div>
</div>
<div *ngIf="discoverResults" class="row full-height">
<div class="col-xl-2 col-lg-3 col-md-3 col-6 col-sm-4 small-padding" *ngFor="let result of discoverResults">
<discover-card [isAdmin]="isAdmins" [result]="result"></discover-card>

@ -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;
}

@ -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 { AuthService } from "../../../auth/auth.service";
import { IDiscoverCardResult } from "../../interfaces";
import { IMovieCollectionsViewModel } from "../../../interfaces/ISearchTvResultV2";
import { RequestServiceV2 } from "../../../services/requestV2.service";
import { RequestType } from "../../../interfaces";
import { AuthService } from "../../../auth/auth.service";
@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() {

@ -96,4 +96,8 @@ export class RequestServiceV2 extends ServiceHelpers {
public reprocessRequest(requestId: number, type: RequestType): Observable<IRequestEngineResult> {
return this.http.post<IRequestEngineResult>(`${this.url}reprocess/${type}/${requestId}`, undefined, { headers: this.headers });
}
public requestMovieCollection(collectionId: number): Observable<IRequestEngineResult> {
return this.http.post<IRequestEngineResult>(`${this.url}movie/collection/${collectionId}`, undefined, { headers: this.headers });
}
}

@ -216,6 +216,12 @@ namespace Ombi.Controllers.V2
return BadRequest();
}
[HttpPost("movie/collection/{collectionId}")]
public async Task<RequestEngineResult> RequestCollection(int collectionId)
{
return await _movieRequestEngine.RequestCollection(collectionId, HttpContext.RequestAborted);
}
private string GetApiAlias()
{
// Make sure this only applies when using the API KEY

Loading…
Cancel
Save