mirror of
https://github.com/Ombi-app/Ombi.git
synced 2025-07-14 01:02:57 -07:00
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
This commit is contained in:
parent
11527e332c
commit
e63524c6e4
9 changed files with 78 additions and 12 deletions
|
@ -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 { 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() {
|
||||
|
|
|
@ -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…
Add table
Add a link
Reference in a new issue