Reworked the TV model AGAIN #865

pull/1425/head
Jamie.Rees 7 years ago
parent 25526cc4d9
commit 1b5698b3ca

@ -36,7 +36,8 @@ namespace Ombi.Core.Engine
// For some reason the poster path is always http
var posterPath = showInfo.image?.medium.Replace("http:", "https:");
var model = new TvRequestModel
var childRequest = new ChildTvRequest
{
Id = tv.Id,
Type = RequestType.TvShow,
@ -49,17 +50,36 @@ namespace Ombi.Core.Engine
Approved = false,
RequestedUsers = new List<string> { Username },
Issues = IssueState.None,
ProviderId = tv.Id,
RequestAll = tv.RequestAll,
SeasonRequests = tv.SeasonRequests,
};
var model = new TvRequestModel
{
Id = tv.Id,
Type = RequestType.TvShow,
Overview = showInfo.summary.RemoveHtml(),
PosterPath = posterPath,
Title = showInfo.name,
ReleaseDate = firstAir,
Status = showInfo.status,
Approved = false,
ImdbId = showInfo.externals?.imdb ?? string.Empty,
TvDbId = tv.Id.ToString(),
ProviderId = tv.Id,
RequestAll = tv.RequestAll
};
model.ChildRequests.Add(childRequest);
if (childRequest.SeasonRequests.Any())
{
var episodes = await TvApi.EpisodeLookup(showInfo.id);
foreach (var e in episodes)
{
var season = model.SeasonRequests.FirstOrDefault(x => x.SeasonNumber == e.season);
var season = childRequest.SeasonRequests.FirstOrDefault(x => x.SeasonNumber == e.season);
season?.Episodes.Add(new EpisodesRequested
{
Url = e.url,
@ -68,11 +88,12 @@ namespace Ombi.Core.Engine
EpisodeNumber = e.number,
});
}
}
if (tv.LatestSeason)
{
var latest = showInfo.Season.OrderBy(x => x.SeasonNumber).FirstOrDefault();
foreach (var modelSeasonRequest in model.SeasonRequests)
foreach (var modelSeasonRequest in childRequest.SeasonRequests)
{
if (modelSeasonRequest.SeasonNumber == latest.SeasonNumber)
{
@ -86,7 +107,7 @@ namespace Ombi.Core.Engine
if (tv.FirstSeason)
{
var first = showInfo.Season.OrderByDescending(x => x.SeasonNumber).FirstOrDefault();
foreach (var modelSeasonRequest in model.SeasonRequests)
foreach (var modelSeasonRequest in childRequest.SeasonRequests)
{
if (modelSeasonRequest.SeasonNumber == first.SeasonNumber)
{
@ -124,19 +145,7 @@ namespace Ombi.Core.Engine
{
var allRequests = await TvRequestService.GetAllAsync();
var results = allRequests.FirstOrDefault(x => x.Id == request.Id);
results.Approved = request.Approved;
results.Available = request.Available;
results.Denied = request.Denied;
results.DeniedReason = request.DeniedReason;
results.AdminNote = request.AdminNote;
results.ImdbId = request.ImdbId;
results.IssueId = request.IssueId;
results.Issues = request.Issues;
results.OtherMessage = request.OtherMessage;
results.Overview = request.Overview;
results.PosterPath = request.PosterPath;
results.RequestedUsers = request.RequestedUsers?.ToList() ?? new List<string>();
results = Mapper.Map<TvRequestModel>(request);
var model = TvRequestService.UpdateRequest(results);
return model;
@ -149,38 +158,25 @@ namespace Ombi.Core.Engine
private async Task<RequestEngineResult> AddExistingRequest(TvRequestModel newRequest, TvRequestModel existingRequest)
{
var episodeDifference = new List<SeasonRequestModel>();
if (existingRequest.HasChildRequests)
{
// Let's check if this has already been requested as a child!
foreach (var children in existingRequest.ChildRequests)
var child = newRequest.ChildRequests.FirstOrDefault(); // There will only be 1
var episodeDiff = new List<SeasonRequestModel>();
foreach (var existingChild in existingRequest.ChildRequests)
{
var difference = GetListDifferences(children.SeasonRequests, newRequest.SeasonRequests).ToList();
var difference = GetListDifferences(existingChild.SeasonRequests, child.SeasonRequests).ToList();
if (difference.Any())
{
episodeDifference = difference;
}
episodeDiff = difference;
}
}
if (episodeDifference.Any())
if (episodeDiff.Any())
{
// This is where there are some episodes that have been requested, but this list contains the 'new' requests
newRequest.SeasonRequests = episodeDifference;
}
if (!existingRequest.HasChildRequests)
{
// So this is the first child request, we will want to convert the original request to a child
var originalRequest = Mapper.Map<TvRequestModel>(existingRequest);
existingRequest.ChildRequests.Add(originalRequest);
existingRequest.RequestedUsers.Clear();
existingRequest.Approved = false;
existingRequest.Available = false;
child.SeasonRequests = episodeDiff;
}
existingRequest.ChildRequests.Add(newRequest);
existingRequest.ChildRequests.AddRange(newRequest.ChildRequests);
TvRequestService.UpdateRequest(existingRequest);
if (ShouldAutoApprove(RequestType.TvShow))
@ -210,7 +206,7 @@ namespace Ombi.Core.Engine
return await AfterRequest(model);
}
private async Task<RequestEngineResult> AfterRequest(BaseRequestModel model)
private async Task<RequestEngineResult> AfterRequest(TvRequestModel model)
{
if (ShouldSendNotification(model.Type))
{

@ -166,9 +166,12 @@ namespace Ombi.Core.Engine
// Let's modify the seasonsrequested to reflect what we have requested...
foreach (var season in item.SeasonRequests)
{
foreach (var existingRequestChildRequest in existingRequest.ChildRequests)
{
// Find the existing request season
var existingSeason =
existingRequest.SeasonRequests.FirstOrDefault(x => x.SeasonNumber == season.SeasonNumber);
existingRequestChildRequest.SeasonRequests.FirstOrDefault(x => x.SeasonNumber == season.SeasonNumber);
foreach (var ep in existingSeason.Episodes)
{
@ -178,6 +181,7 @@ namespace Ombi.Core.Engine
episodeSearching.Available = ep.Available;
episodeSearching.Approved = ep.Approved;
}
}
}
}

@ -1,4 +1,6 @@
using System.Collections.Generic;
using System;
using System.Collections.Generic;
using Ombi.Store.Entities;
namespace Ombi.Core.Models.Requests
{
@ -6,22 +8,12 @@ namespace Ombi.Core.Models.Requests
{
public TvRequestModel()
{
SeasonRequests = new List<SeasonRequestModel>();
ChildRequests = new List<TvRequestModel>();
ChildRequests = new List<ChildTvRequest>();
}
public string ImdbId { get; set; }
public string TvDbId { get; set; }
public bool RequestAll { get; set; }
public List<SeasonRequestModel> SeasonRequests { get; set; }
/// <summary>
/// This is for TV requests, If there is more than 1 request for a show then it should be a child
/// e.g. Request 1 is for Season 1, Request 2 is for season 5. There should be two child items.
/// </summary>
public List<TvRequestModel> ChildRequests { get; set; }
public bool HasChildRequests => ChildRequests.Count > 0;
public List<ChildTvRequest> ChildRequests { get; set; }
/// <summary>
/// For TV Shows with a custom root folder
@ -31,4 +23,11 @@ namespace Ombi.Core.Models.Requests
/// </value>
public int RootFolderSelected { get; set; }
}
public class ChildTvRequest : BaseRequestModel
{
public bool RequestAll { get; set; }
public List<SeasonRequestModel> SeasonRequests { get; set; } = new List<SeasonRequestModel>();
}
}

@ -6,9 +6,14 @@ namespace Ombi.Helpers
{
public class ByteConverterHelper
{
private static readonly JsonSerializerSettings Settings = new JsonSerializerSettings
{
ReferenceLoopHandling = ReferenceLoopHandling.Serialize,
PreserveReferencesHandling = PreserveReferencesHandling.Objects
};
public static byte[] ReturnBytes(object obj)
{
var json = JsonConvert.SerializeObject(obj);
var json = JsonConvert.SerializeObject(obj, Settings);
var bytes = Encoding.UTF8.GetBytes(json);
return bytes;
@ -17,7 +22,7 @@ namespace Ombi.Helpers
public static T ReturnObject<T>(byte[] bytes)
{
var json = Encoding.UTF8.GetString(bytes);
var model = JsonConvert.DeserializeObject<T>(json);
var model = JsonConvert.DeserializeObject<T>(json, Settings);
return model;
}
public static string ReturnFromBytes(byte[] bytes)

@ -4,6 +4,8 @@
/wwwroot/maps/**
/wwwroot/app/**/*.js
/wwwroot/app/**/*.js.map
/wwwroot/*.js.map
/wwwroot/*.js
# dependencies
/node_modules

@ -1,4 +1,5 @@
using System.Collections.Generic;
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
@ -55,8 +56,17 @@ namespace Ombi.Controllers
[HttpGet("tv/{count:int}/{position:int}")]
public async Task<IEnumerable<TvRequestModel>> GetTvRequests(int count, int position)
{
try
{
return await TvRequestEngine.GetTvRequests(count, position);
}
catch (Exception e)
{
Console.WriteLine(e);
throw;
}
}
[HttpPost("tv")]
public async Task<RequestEngineResult> RequestTv([FromBody]SearchTvShowViewModel tv)

@ -12,6 +12,11 @@
<Content Include="wwwroot\**" />
</ItemGroup>
<ItemGroup>
<Content Remove="wwwroot/systemjs.config.js.map" />
<Content Remove="wwwroot\systemjs.config.js" />
</ItemGroup>
<ItemGroup>

@ -28,16 +28,17 @@ export interface IMovieRequestModel extends IMediaBase {
export interface ITvRequestModel extends IMediaBase {
imdbId: string,
tvDbId: string,
requestAll: boolean,
seasonRequests: ISeasonRequests[],
childRequests: ITvRequestModel[],
hasChildRequests: boolean,
childRequests: IChildTvRequest[]
rootFolderSelected: number,
firstAired: string,
}
export interface ISeasonRequests
{
export interface IChildTvRequest extends IMediaBase {
requestAll: boolean,
seasonRequests: ISeasonRequests[],
}
export interface ISeasonRequests {
seasonNumber: number,
episodes: IEpisodesRequested[],
}

@ -77,16 +77,17 @@
</div>
<!--Child Requests-->
<div *ngIf="request.hasChildRequests">
<button type="button" class="btn btn-sm btn-info-outline" data-toggle="collapse" [attr.data-target]="'#' + request.id +'childRequests'">Children</button>
<div id="{{request.id}}childRequests" class="collapse">
<div *ngFor="let child of request.childRequests">
<hr />
<div *ngIf="request.requestedUsers">Requested By: <span *ngFor="let user of request.requestedUsers">{{user}} </span>
<div *ngIf="request.requestedUsers">
Requested By: <span *ngFor="let user of request.requestedUsers">{{user}} </span>
</div>
<div>Seasons Requested: <span *ngFor="let s of request.seasonNumbersRequested">{{s}} </span>
<div *ngIf="child.seasonRequests">
Seasons Requested: <span *ngFor="let s of child.seasonRequests">{{s.seasonNumber}} </span>
</div>
<div>
<span>Request status: </span>
@ -100,7 +101,6 @@
</div>
</div>
</div>
</div>
<div class="col-sm-3 col-sm-push-3">
@ -114,6 +114,7 @@
<span class="caret"></span>
<span class="sr-only">Toggle Dropdown</span>
</button>
<!--<ul class="dropdown-menu">
{{#each qualities}}
<li><a href="#" class="approve-with-quality" id="{{id}}">{{name}}</a></li>
@ -127,6 +128,10 @@
<!--<form method="POST" action="@formAction/requests/changeRootFolder{{#if_eq type "tv"}}tv{{else}}movie{{/if_eq}}" id="changeFolder{{requestId}}">
<input name="requestId" type="text" value="{{requestId}}" hidden="hidden"/>
{{#if_eq hasRootFolders true}}

Loading…
Cancel
Save