mirror of
https://github.com/Ombi-app/Ombi.git
synced 2025-07-11 15:56:05 -07:00
Reworked the TV model AGAIN #865
This commit is contained in:
parent
25526cc4d9
commit
1b5698b3ca
10 changed files with 141 additions and 114 deletions
|
@ -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)
|
||||
|
||||
var child = newRequest.ChildRequests.FirstOrDefault(); // There will only be 1
|
||||
var episodeDiff = new List<SeasonRequestModel>();
|
||||
foreach (var existingChild in existingRequest.ChildRequests)
|
||||
{
|
||||
// Let's check if this has already been requested as a child!
|
||||
foreach (var children 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;
|
||||
child.SeasonRequests = episodeDiff;
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
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)
|
||||
|
|
2
src/Ombi/.gitignore
vendored
2
src/Ombi/.gitignore
vendored
|
@ -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>
|
||||
|
|
|
@ -18,7 +18,7 @@
|
|||
issueId: number,
|
||||
denied: boolean,
|
||||
deniedReason: string,
|
||||
released:boolean
|
||||
released: boolean
|
||||
}
|
||||
|
||||
export interface IMovieRequestModel extends IMediaBase {
|
||||
|
@ -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,
|
||||
firstAired: string,
|
||||
}
|
||||
|
||||
export interface ISeasonRequests
|
||||
{
|
||||
export interface IChildTvRequest extends IMediaBase {
|
||||
requestAll: boolean,
|
||||
seasonRequests: ISeasonRequests[],
|
||||
}
|
||||
|
||||
export interface ISeasonRequests {
|
||||
seasonNumber: number,
|
||||
episodes: IEpisodesRequested[],
|
||||
}
|
||||
|
@ -49,7 +50,7 @@ export interface IEpisodesRequested {
|
|||
url: string,
|
||||
requested: boolean,
|
||||
status: string,
|
||||
available:boolean
|
||||
available: boolean
|
||||
}
|
||||
|
||||
|
||||
|
@ -60,5 +61,5 @@ export enum RequestType {
|
|||
|
||||
export interface IRequestsPageScroll {
|
||||
count: number,
|
||||
position:number
|
||||
position: number
|
||||
}
|
|
@ -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>
|
||||
<hr />
|
||||
<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…
Add table
Add a link
Reference in a new issue