Merge pull request #1284 from tidusjar/dev

Newsletter fixes and also a Sonarr bug fix (stops errors from being logged)
This commit is contained in:
Jamie 2017-03-24 23:24:27 +00:00 committed by GitHub
commit db98671bf8
5 changed files with 224 additions and 87 deletions

View file

@ -25,7 +25,7 @@ namespace Ombi.Api.Models.Sonarr
{ {
public SonarrAddSeries() public SonarrAddSeries()
{ {
images = new List<string>(); images = new List<SonarrImage>();
} }
public AddOptions addOptions { get; set; } public AddOptions addOptions { get; set; }
public string title { get; set; } public string title { get; set; }
@ -40,7 +40,7 @@ namespace Ombi.Api.Models.Sonarr
public string imdbId { get; set; } public string imdbId { get; set; }
public string titleSlug { get; set; } public string titleSlug { get; set; }
public int id { get; set; } public int id { get; set; }
public List<string> images { get; set; } public List<SonarrImage> images { get; set; }
[JsonIgnore] [JsonIgnore]
public List<string> ErrorMessages { get; set; } public List<string> ErrorMessages { get; set; }
} }
@ -51,4 +51,18 @@ namespace Ombi.Api.Models.Sonarr
public bool ignoreEpisodesWithoutFiles { get; set; } public bool ignoreEpisodesWithoutFiles { get; set; }
public bool searchForMissingEpisodes { get; set; } public bool searchForMissingEpisodes { get; set; }
} }
public class Addoptions
{
public bool searchForMissingEpisodes { get; set; }
public bool ignoreEpisodesWithFiles { get; set; }
public bool ignoreEpisodesWithoutFiles { get; set; }
}
public class SonarrImage
{
public string coverType { get; set; }
public string url { get; set; }
}
} }

View file

@ -45,7 +45,7 @@ namespace Ombi.Api
MissingMemberHandling = MissingMemberHandling.Ignore MissingMemberHandling = MissingMemberHandling.Ignore
}; };
private static Logger Log = LogManager.GetCurrentClassLogger(); private static readonly Logger Log = LogManager.GetCurrentClassLogger();
/// <summary> /// <summary>
/// An API request handler /// An API request handler
/// </summary> /// </summary>
@ -58,8 +58,7 @@ namespace Ombi.Api
var client = new RestClient { BaseUrl = baseUri }; var client = new RestClient { BaseUrl = baseUri };
var response = client.Execute<T>(request); var response = client.Execute<T>(request);
Log.Trace($"Request made to {response.ResponseUri} with status code {response.StatusCode}. The response was {response.Content}"); Log.Trace($"Request made to {response.ResponseUri} with status code {response.StatusCode}. The response was {response.Content}");
if ((int)response.StatusCode < 300)
if (response.StatusCode == HttpStatusCode.OK || response.StatusCode == HttpStatusCode.Created)
return response.Data; return response.Data;
else else
throw new ApiRequestException($"Got StatusCode={response.StatusCode} for {response.ResponseUri}."); throw new ApiRequestException($"Got StatusCode={response.StatusCode} for {response.ResponseUri}.");
@ -78,8 +77,7 @@ namespace Ombi.Api
var client = new RestClient { BaseUrl = baseUri }; var client = new RestClient { BaseUrl = baseUri };
var response = client.Execute(request); var response = client.Execute(request);
Log.Trace($"Request made to {response.ResponseUri} with status code {response.StatusCode}. The response was {response.Content}"); Log.Trace($"Request made to {response.ResponseUri} with status code {response.StatusCode}. The response was {response.Content}");
if ((int)response.StatusCode < 300)
if (response.StatusCode == HttpStatusCode.OK || response.StatusCode == HttpStatusCode.Created)
return DeserializeXml<T>(response.Content); return DeserializeXml<T>(response.Content);
else else
throw new ApiRequestException($"Got StatusCode={response.StatusCode} for {response.ResponseUri}."); throw new ApiRequestException($"Got StatusCode={response.StatusCode} for {response.ResponseUri}.");
@ -92,7 +90,7 @@ namespace Ombi.Api
var response = client.Execute(request); var response = client.Execute(request);
Log.Trace($"Request made to {response.ResponseUri} with status code {response.StatusCode}. The response was {response.Content}"); Log.Trace($"Request made to {response.ResponseUri} with status code {response.StatusCode}. The response was {response.Content}");
if (response.StatusCode == HttpStatusCode.OK || response.StatusCode == HttpStatusCode.Created) if ((int)response.StatusCode < 300)
return JsonConvert.DeserializeObject<T>(response.Content, _settings); return JsonConvert.DeserializeObject<T>(response.Content, _settings);
else else
throw new ApiRequestException($"Got StatusCode={response.StatusCode} for {response.ResponseUri}."); throw new ApiRequestException($"Got StatusCode={response.StatusCode} for {response.ResponseUri}.");

View file

@ -134,6 +134,65 @@ namespace Ombi.Services.Jobs.RecentlyAddedNewsletter
newsletter.MovieCount = info.Count; newsletter.MovieCount = info.Count;
info.Clear(); info.Clear();
// Check if there are any epiosdes, then get the series info.
// Otherwise then just add the series to the newsletter
if (filteredEp.Any())
{
var recentlyAddedModel = new List<EmbyRecentlyAddedModel>();
foreach (var embyEpisodes in filteredEp)
{
// Let's sleep, Emby can't keep up with us.
Thread.Sleep(1000);
try
{
// Find related series item
var relatedSeries = series.FirstOrDefault(x => x.EmbyId == embyEpisodes.ParentId);
if (relatedSeries == null)
{
continue;
}
// Get series information
var i = Api.GetInformation(relatedSeries.EmbyId, Ombi.Api.Models.Emby.EmbyMediaType.Series,
embySettings.ApiKey, embySettings.AdministratorId, embySettings.FullUri);
var episodeInfo = Api.GetInformation(embyEpisodes.EmbyId,
Ombi.Api.Models.Emby.EmbyMediaType.Episode,
embySettings.ApiKey, embySettings.AdministratorId, embySettings.FullUri);
// Check if we already have this series
var existingSeries = recentlyAddedModel.FirstOrDefault(x =>
x.EmbyInformation.SeriesInformation.Id.Equals(i.SeriesInformation.Id,
StringComparison.CurrentCultureIgnoreCase));
if (existingSeries != null)
{
existingSeries.EpisodeInformation.Add(episodeInfo.EpisodeInformation);
}
else
{
recentlyAddedModel.Add(new EmbyRecentlyAddedModel
{
EmbyInformation = i,
EpisodeInformation = new List<EmbyEpisodeInformation>() { episodeInfo.EpisodeInformation },
EmbyContent = relatedSeries
});
}
}
catch (JsonReaderException)
{
Log.Error("Failed getting information from Emby, we may have overloaded Emby's api... Waiting and we will skip this one and go to the next");
Thread.Sleep(1000);
}
}
info.AddRange(recentlyAddedModel);
}
else
{
foreach (var t in filteredSeries) foreach (var t in filteredSeries)
{ {
var i = Api.GetInformation(t.EmbyId, Ombi.Api.Models.Emby.EmbyMediaType.Series, var i = Api.GetInformation(t.EmbyId, Ombi.Api.Models.Emby.EmbyMediaType.Series,
@ -169,6 +228,7 @@ namespace Ombi.Services.Jobs.RecentlyAddedNewsletter
info.Add(item); info.Add(item);
} }
}
GenerateTvHtml(info, sb); GenerateTvHtml(info, sb);
newsletter.TvCount = info.Count; newsletter.TvCount = info.Count;
@ -297,7 +357,7 @@ namespace Ombi.Services.Jobs.RecentlyAddedNewsletter
try try
{ {
var info = TvApi.ShowLookupByTheTvDbId(int.Parse(seriesItem.ProviderIds.Tvdb)); var info = TvApi.ShowLookupByTheTvDbId(int.Parse(seriesItem.ProviderIds.Tvdb));
if(info == null)continue; if (info == null) continue;
var banner = info.image?.original; var banner = info.image?.original;
if (!string.IsNullOrEmpty(banner)) if (!string.IsNullOrEmpty(banner))
@ -329,16 +389,17 @@ namespace Ombi.Services.Jobs.RecentlyAddedNewsletter
foreach (var embyEpisodeInformation in results.OrderBy(x => x.ParentIndexNumber)) foreach (var embyEpisodeInformation in results.OrderBy(x => x.ParentIndexNumber))
{ {
var epSb = new StringBuilder(); var epSb = new StringBuilder();
for (var i = 0; i < embyEpisodeInformation.IndexNumber.Count; i++) var orderedEpisodes = embyEpisodeInformation.IndexNumber.OrderBy(x => x.IndexNumber).ToList();
for (var i = 0; i < orderedEpisodes.Count; i++)
{ {
var ep = embyEpisodeInformation.IndexNumber[i]; var ep = orderedEpisodes[i];
if (i < embyEpisodeInformation.IndexNumber.Count) if (i < embyEpisodeInformation.IndexNumber.Count - 1)
{ {
epSb.Append($"{ep.IndexNumber},"); epSb.Append($"{ep.IndexNumber},");
} }
else else
{ {
epSb.Append(ep); epSb.Append(ep.IndexNumber);
} }
} }
AddParagraph(sb, $"Season: {embyEpisodeInformation.ParentIndexNumber}, Episode: {epSb}"); AddParagraph(sb, $"Season: {embyEpisodeInformation.ParentIndexNumber}, Episode: {epSb}");
@ -359,7 +420,7 @@ namespace Ombi.Services.Jobs.RecentlyAddedNewsletter
} }
finally finally
{ {
if(endLoop) if (endLoop)
EndLoopHtml(sb); EndLoopHtml(sb);
} }
} }

View file

@ -97,6 +97,7 @@ namespace Ombi.Services.Jobs.RecentlyAddedNewsletter
{ {
public PlexMetadata Metadata { get; set; } public PlexMetadata Metadata { get; set; }
public PlexContent Content { get; set; } public PlexContent Content { get; set; }
public List<PlexEpisodeMetadata> EpisodeMetadata { get; set; }
} }
private Newsletter GetHtml(bool test) private Newsletter GetHtml(bool test)
@ -137,6 +138,46 @@ namespace Ombi.Services.Jobs.RecentlyAddedNewsletter
newsletter.MovieCount = info.Count; newsletter.MovieCount = info.Count;
info.Clear(); info.Clear();
if (filteredEp.Any())
{
var recentlyAddedModel = new List<PlexRecentlyAddedModel>();
foreach (var plexEpisodes in filteredEp)
{
// Find related series item
var relatedSeries = series.FirstOrDefault(x => x.ProviderId == plexEpisodes.ProviderId);
if (relatedSeries == null)
{
continue;
}
// Get series information
var i = Api.GetMetadata(plexSettings.PlexAuthToken, plexSettings.FullUri, relatedSeries.ItemId);
var episodeInfo = Api.GetEpisodeMetaData(plexSettings.PlexAuthToken, plexSettings.FullUri, plexEpisodes.RatingKey);
// Check if we already have this series
var existingSeries = recentlyAddedModel.FirstOrDefault(x =>
x.Metadata.Directory.RatingKey == i.Directory.RatingKey);
if (existingSeries != null)
{
existingSeries.EpisodeMetadata.Add(episodeInfo);
}
else
{
recentlyAddedModel.Add(new PlexRecentlyAddedModel
{
Metadata = i,
EpisodeMetadata = new List<PlexEpisodeMetadata>() {episodeInfo},
Content = relatedSeries
});
}
}
info.AddRange(recentlyAddedModel);
}
else
{
foreach (var t in filteredSeries) foreach (var t in filteredSeries)
{ {
var i = Api.GetMetadata(plexSettings.PlexAuthToken, plexSettings.FullUri, t.ItemId); var i = Api.GetMetadata(plexSettings.PlexAuthToken, plexSettings.FullUri, t.ItemId);
@ -146,27 +187,33 @@ namespace Ombi.Services.Jobs.RecentlyAddedNewsletter
} }
//var ep = filteredEp.Where(x => x.ShowTitle == t.Title); //var ep = filteredEp.Where(x => x.ShowTitle == t.Title);
if (filteredEp.Any())
{
var episodeList = new List<PlexEpisodeMetadata>();
foreach (var ep in filteredEp)
{
var epInfo = Api.GetEpisodeMetaData(plexSettings.PlexAuthToken, plexSettings.FullUri,
ep.RatingKey);
episodeList.Add(epInfo);
}
info.Add(new PlexRecentlyAddedModel
{
Metadata = i,
Content = t,
EpisodeMetadata = episodeList
});
}
else
{
info.Add(new PlexRecentlyAddedModel info.Add(new PlexRecentlyAddedModel
{ {
Metadata = i, Metadata = i,
Content = t Content = t
}); });
//if (ep.Any()) }
//{ }
// var episodeList = new List<EmbyEpisodeInformation>();
// foreach (var embyEpisodese in ep)
// {
// var epInfo = Api.GetInformation(embyEpisodese.EmbyId, Ombi.Api.Models.Emby.EmbyMediaType.Episode,
// embySettings.ApiKey, embySettings.AdministratorId, embySettings.FullUri);
// episodeList.Add(epInfo.EpisodeInformation);
// }
// info.Add(new EmbyRecentlyAddedModel
// {
// EmbyContent = t,
// EmbyInformation = i,
// EpisodeInformation = episodeList
// });
//}
} }
GenerateTvHtml(info, sb); GenerateTvHtml(info, sb);
newsletter.TvCount = info.Count; newsletter.TvCount = info.Count;
@ -294,9 +341,7 @@ namespace Ombi.Services.Jobs.RecentlyAddedNewsletter
"<table border=\"0\" cellpadding=\"0\" align=\"center\" cellspacing=\"0\" style=\"border-collapse: separate; mso-table-lspace: 0pt; mso-table-rspace: 0pt; width: 100%;\" width=\"100%\">"); "<table border=\"0\" cellpadding=\"0\" align=\"center\" cellspacing=\"0\" style=\"border-collapse: separate; mso-table-lspace: 0pt; mso-table-rspace: 0pt; width: 100%;\" width=\"100%\">");
foreach (var t in orderedTv) foreach (var t in orderedTv)
{ {
//var seriesItem = t.EmbyInformation.SeriesInformation; var relatedEpisodes = t.EpisodeMetadata ?? new List<PlexEpisodeMetadata>();
//var relatedEpisodes = t.EpisodeInformation;
try try
{ {
@ -319,31 +364,34 @@ namespace Ombi.Services.Jobs.RecentlyAddedNewsletter
Header(sb, 3, title); Header(sb, 3, title);
EndTag(sb, "a"); EndTag(sb, "a");
//var results = relatedEpisodes.GroupBy(p => p.ParentIndexNumber, // Group by the ParentIndex (season number)
// (key, g) => new var results = relatedEpisodes.GroupBy(p => p.Video.FirstOrDefault()?.ParentIndex,
// { (key, g) => new
// ParentIndexNumber = key, {
// IndexNumber = g.ToList() ParentIndexNumber = key,
// } IndexNumber = g.ToList()
//); }
);
// Group the episodes // Group the episodes
//foreach (var embyEpisodeInformation in results.OrderBy(x => x.ParentIndexNumber)) foreach (var epInformation in results.OrderBy(x => x.ParentIndexNumber))
//{ {
// var epSb = new StringBuilder(); var orderedEpisodes = epInformation.IndexNumber.OrderBy(x => Convert.ToInt32(x.Video.FirstOrDefault().Index)).ToList();
// for (var i = 0; i < embyEpisodeInformation.IndexNumber.Count; i++) var epSb = new StringBuilder();
// { for (var i = 0; i < orderedEpisodes.Count; i++)
// var ep = embyEpisodeInformation.IndexNumber[i]; {
// if (i < embyEpisodeInformation.IndexNumber.Count) var ep = orderedEpisodes[i];
// { if (i <= orderedEpisodes.Count - 1)
// epSb.Append($"{ep.IndexNumber},"); {
// } epSb.Append($"{ep.Video.FirstOrDefault().Index},");
// else }
// { else
// epSb.Append(ep); {
// } epSb.Append($"{ep.Video.FirstOrDefault().Index}");
// } }
// AddParagraph(sb, $"Season: {embyEpisodeInformation.ParentIndexNumber}, Episode: {epSb}");
//} }
AddParagraph(sb, $"Season: {epInformation.ParentIndexNumber}, Episode: {epSb}");
}
if (info.genres.Any()) if (info.genres.Any())
{ {

View file

@ -864,6 +864,14 @@ namespace Ombi.UI.Modules
private async Task<Response> RequestMovie(int movieId) private async Task<Response> RequestMovie(int movieId)
{ {
if(string.IsNullOrEmpty(Username))
{
return Response.AsJson(new JsonResponseModel
{
Result = false,
Message = "Your session has expired, please refresh the page"
});
}
if (Security.HasPermissions(User, Permissions.ReadOnlyUser) || !Security.HasPermissions(User, Permissions.RequestMovie)) if (Security.HasPermissions(User, Permissions.ReadOnlyUser) || !Security.HasPermissions(User, Permissions.RequestMovie))
{ {
return return
@ -1031,6 +1039,14 @@ namespace Ombi.UI.Modules
/// <returns></returns> /// <returns></returns>
private async Task<Response> RequestTvShow(int showId, string seasons) private async Task<Response> RequestTvShow(int showId, string seasons)
{ {
if (string.IsNullOrEmpty(Username))
{
return Response.AsJson(new JsonResponseModel
{
Result = false,
Message = "Your session has expired, please refresh the page"
});
}
if (Security.HasPermissions(User, Permissions.ReadOnlyUser) || !Security.HasPermissions(User, Permissions.RequestTvShow)) if (Security.HasPermissions(User, Permissions.ReadOnlyUser) || !Security.HasPermissions(User, Permissions.RequestTvShow))
{ {
return return