This commit is contained in:
tidusjar 2016-10-19 21:21:52 +01:00
commit 512d2131bd
10 changed files with 183 additions and 127 deletions

View file

@ -44,6 +44,6 @@ namespace PlexRequests.Api.Interfaces
PlexSearch GetAllEpisodes(string authToken, Uri host, string section, int startPage, int returnCount); PlexSearch GetAllEpisodes(string authToken, Uri host, string section, int startPage, int returnCount);
PlexServer GetServer(string authToken); PlexServer GetServer(string authToken);
PlexSeasonMetadata GetSeasons(string authToken, Uri plexFullHost, string ratingKey); PlexSeasonMetadata GetSeasons(string authToken, Uri plexFullHost, string ratingKey);
RecentlyAdded RecentlyAdded(string authToken, Uri plexFullHost); RecentlyAddedModel RecentlyAdded(string authToken, Uri plexFullHost, string sectionId);
} }
} }

View file

@ -1,7 +1,7 @@
#region Copyright #region Copyright
// /************************************************************************ // /************************************************************************
// Copyright (c) 2016 Jamie Rees // Copyright (c) 2016 Jamie Rees
// File: RecentlyAdded.cs // File: RecentlyAddedModel.cs
// Created By: Jamie Rees // Created By: Jamie Rees
// //
// Permission is hereby granted, free of charge, to any person obtaining // Permission is hereby granted, free of charge, to any person obtaining
@ -32,53 +32,102 @@ namespace PlexRequests.Api.Models.Plex
public class RecentlyAddedChild public class RecentlyAddedChild
{ {
public string _elementType { get; set; } public string _elementType { get; set; }
public string allowSync { get; set; }
public string librarySectionID { get; set; }
public string librarySectionTitle { get; set; }
public string librarySectionUUID { get; set; }
public int ratingKey { get; set; } public int ratingKey { get; set; }
public string key { get; set; } public string key { get; set; }
public int parentRatingKey { get; set; } public int parentRatingKey { get; set; }
public int grandparentRatingKey { get; set; }
public string type { get; set; } public string type { get; set; }
public string title { get; set; } public string title { get; set; }
public string grandparentKey { get; set; }
public string parentKey { get; set; } public string parentKey { get; set; }
public string parentTitle { get; set; } public string grandparentTitle { get; set; }
public string parentSummary { get; set; }
public string summary { get; set; } public string summary { get; set; }
public int index { get; set; } public int index { get; set; }
public int parentIndex { get; set; } public int parentIndex { get; set; }
public string thumb { get; set; } public string thumb { get; set; }
public string art { get; set; } public string art { get; set; }
public string parentThumb { get; set; } public string grandparentThumb { get; set; }
public int leafCount { get; set; } public string grandparentArt { get; set; }
public int viewedLeafCount { get; set; } public int duration { get; set; }
public int addedAt { get; set; } public int addedAt { get; set; }
public int updatedAt { get; set; } public int updatedAt { get; set; }
public List<object> _children { get; set; } public string chapterSource { get; set; }
public string studio { get; set; } public List<Child2> _children { get; set; }
public string contentRating { get; set; } public string contentRating { get; set; }
public string rating { get; set; } public int? year { get; set; }
public string parentThumb { get; set; }
public string grandparentTheme { get; set; }
public string originallyAvailableAt { get; set; }
public string titleSort { get; set; }
public int? viewCount { get; set; } public int? viewCount { get; set; }
public int? lastViewedAt { get; set; } public int? lastViewedAt { get; set; }
public int? year { get; set; }
public int? duration { get; set; }
public string originallyAvailableAt { get; set; }
public string chapterSource { get; set; }
public string parentTheme { get; set; }
public string titleSort { get; set; }
public string tagline { get; set; }
public int? viewOffset { get; set; } public int? viewOffset { get; set; }
public string rating { get; set; }
public string studio { get; set; }
public string tagline { get; set; }
public string originalTitle { get; set; } public string originalTitle { get; set; }
public string audienceRating { get; set; }
public string audienceRatingImage { get; set; }
public string ratingImage { get; set; }
}
public class Child3
{
public string _elementType { get; set; }
public string id { get; set; }
public string key { get; set; }
public double duration { get; set; }
public string file { get; set; }
public double size { get; set; }
public string audioProfile { get; set; }
public string container { get; set; }
public string videoProfile { get; set; }
public string deepAnalysisVersion { get; set; }
public string requiredBandwidths { get; set; }
public string hasThumbnail { get; set; }
public bool? has64bitOffsets { get; set; }
public bool? optimizedForStreaming { get; set; }
public bool? hasChapterTextStream { get; set; }
} }
public class RecentlyAdded public class Child2
{
public string _elementType { get; set; }
public string videoResolution { get; set; }
public int id { get; set; }
public int duration { get; set; }
public int bitrate { get; set; }
public int width { get; set; }
public int height { get; set; }
public string aspectRatio { get; set; }
public int audioChannels { get; set; }
public string audioCodec { get; set; }
public string videoCodec { get; set; }
public string container { get; set; }
public string videoFrameRate { get; set; }
public string audioProfile { get; set; }
public string videoProfile { get; set; }
public List<Child3> _children { get; set; }
public string tag { get; set; }
}
public class RecentlyAddedModel
{ {
public string _elementType { get; set; } public string _elementType { get; set; }
public string allowSync { get; set; } public string allowSync { get; set; }
public string art { get; set; }
public string identifier { get; set; } public string identifier { get; set; }
public string librarySectionID { get; set; }
public string librarySectionTitle { get; set; }
public string librarySectionUUID { get; set; }
public string mediaTagPrefix { get; set; } public string mediaTagPrefix { get; set; }
public string mediaTagVersion { get; set; } public string mediaTagVersion { get; set; }
public string mixedParents { get; set; } public string mixedParents { get; set; }
public string nocache { get; set; }
public string thumb { get; set; }
public string title1 { get; set; }
public string title2 { get; set; }
public string viewGroup { get; set; }
public string viewMode { get; set; }
public List<RecentlyAddedChild> _children { get; set; } public List<RecentlyAddedChild> _children { get; set; }
} }
} }

View file

@ -73,7 +73,7 @@
<Compile Include="Plex\PlexStatus.cs" /> <Compile Include="Plex\PlexStatus.cs" />
<Compile Include="Plex\PlexMediaType.cs" /> <Compile Include="Plex\PlexMediaType.cs" />
<Compile Include="Plex\PlexUserRequest.cs" /> <Compile Include="Plex\PlexUserRequest.cs" />
<Compile Include="Plex\RecentlyAdded.cs" /> <Compile Include="Plex\RecentlyAddedModel.cs" />
<Compile Include="Properties\AssemblyInfo.cs" /> <Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="SickRage\SickRageBase.cs" /> <Compile Include="SickRage\SickRageBase.cs" />
<Compile Include="SickRage\SickrageShows.cs" /> <Compile Include="SickRage\SickrageShows.cs" />

View file

@ -76,7 +76,7 @@ namespace PlexRequests.Api
Method = Method.POST Method = Method.POST
}; };
AddHeaders(ref request); AddHeaders(ref request, false);
request.AddJsonBody(userModel); request.AddJsonBody(userModel);
@ -93,7 +93,7 @@ namespace PlexRequests.Api
Method = Method.GET, Method = Method.GET,
}; };
AddHeaders(ref request, authToken); AddHeaders(ref request, authToken, false);
var users = RetryHandler.Execute(() => Api.ExecuteXml<PlexFriends> (request, new Uri(FriendsUri)), var users = RetryHandler.Execute(() => Api.ExecuteXml<PlexFriends> (request, new Uri(FriendsUri)),
(exception, timespan) => Log.Error (exception, "Exception when calling GetUsers for Plex, Retrying {0}", timespan), null); (exception, timespan) => Log.Error (exception, "Exception when calling GetUsers for Plex, Retrying {0}", timespan), null);
@ -118,7 +118,7 @@ namespace PlexRequests.Api
}; };
request.AddUrlSegment("searchTerm", searchTerm); request.AddUrlSegment("searchTerm", searchTerm);
AddHeaders(ref request, authToken); AddHeaders(ref request, authToken, false);
var search = RetryHandler.Execute(() => Api.ExecuteXml<PlexSearch> (request, plexFullHost), var search = RetryHandler.Execute(() => Api.ExecuteXml<PlexSearch> (request, plexFullHost),
(exception, timespan) => Log.Error (exception, "Exception when calling SearchContent for Plex, Retrying {0}", timespan), null); (exception, timespan) => Log.Error (exception, "Exception when calling SearchContent for Plex, Retrying {0}", timespan), null);
@ -133,7 +133,7 @@ namespace PlexRequests.Api
Method = Method.GET, Method = Method.GET,
}; };
AddHeaders(ref request, authToken); AddHeaders(ref request, authToken, false);
var users = RetryHandler.Execute(() => Api.ExecuteXml<PlexStatus> (request, uri), var users = RetryHandler.Execute(() => Api.ExecuteXml<PlexStatus> (request, uri),
(exception, timespan) => Log.Error (exception, "Exception when calling GetStatus for Plex, Retrying {0}", timespan), null); (exception, timespan) => Log.Error (exception, "Exception when calling GetStatus for Plex, Retrying {0}", timespan), null);
@ -148,7 +148,7 @@ namespace PlexRequests.Api
Method = Method.GET, Method = Method.GET,
}; };
AddHeaders(ref request, authToken); AddHeaders(ref request, authToken, false);
var account = RetryHandler.Execute(() => Api.ExecuteXml<PlexAccount> (request, new Uri(GetAccountUri)), var account = RetryHandler.Execute(() => Api.ExecuteXml<PlexAccount> (request, new Uri(GetAccountUri)),
(exception, timespan) => Log.Error (exception, "Exception when calling GetAccount for Plex, Retrying {0}", timespan), null); (exception, timespan) => Log.Error (exception, "Exception when calling GetAccount for Plex, Retrying {0}", timespan), null);
@ -164,7 +164,7 @@ namespace PlexRequests.Api
Resource = "library/sections" Resource = "library/sections"
}; };
AddHeaders(ref request, authToken); AddHeaders(ref request, authToken, false);
try try
{ {
@ -193,7 +193,7 @@ namespace PlexRequests.Api
}; };
request.AddUrlSegment("libraryId", libraryId); request.AddUrlSegment("libraryId", libraryId);
AddHeaders(ref request, authToken); AddHeaders(ref request, authToken, false);
try try
{ {
@ -228,7 +228,7 @@ namespace PlexRequests.Api
}; };
request.AddUrlSegment("ratingKey", ratingKey); request.AddUrlSegment("ratingKey", ratingKey);
AddHeaders(ref request, authToken); AddHeaders(ref request, authToken, false);
try try
{ {
@ -253,10 +253,9 @@ namespace PlexRequests.Api
}; };
request.AddQueryParameter("type", 4.ToString()); request.AddQueryParameter("type", 4.ToString());
request.AddQueryParameter("X-Plex-Container-Start", startPage.ToString()); AddLimitHeaders(ref request, startPage, returnCount);
request.AddQueryParameter("X-Plex-Container-Size", returnCount.ToString());
request.AddUrlSegment("section", section); request.AddUrlSegment("section", section);
AddHeaders(ref request, authToken); AddHeaders(ref request, authToken, false);
try try
{ {
@ -281,7 +280,7 @@ namespace PlexRequests.Api
}; };
request.AddUrlSegment("itemId", itemId); request.AddUrlSegment("itemId", itemId);
AddHeaders(ref request, authToken); AddHeaders(ref request, authToken, false);
try try
{ {
@ -311,7 +310,7 @@ namespace PlexRequests.Api
}; };
request.AddUrlSegment("ratingKey", ratingKey); request.AddUrlSegment("ratingKey", ratingKey);
AddHeaders(ref request, authToken); AddHeaders(ref request, authToken, false);
try try
{ {
@ -338,7 +337,7 @@ namespace PlexRequests.Api
Method = Method.GET, Method = Method.GET,
}; };
AddHeaders(ref request, authToken); AddHeaders(ref request, authToken, false);
var servers = RetryHandler.Execute(() => Api.ExecuteXml<PlexServer>(request, new Uri(ServerUri)), var servers = RetryHandler.Execute(() => Api.ExecuteXml<PlexServer>(request, new Uri(ServerUri)),
(exception, timespan) => Log.Error(exception, "Exception when calling GetServer for Plex, Retrying {0}", timespan)); (exception, timespan) => Log.Error(exception, "Exception when calling GetServer for Plex, Retrying {0}", timespan));
@ -347,25 +346,22 @@ namespace PlexRequests.Api
return servers; return servers;
} }
public RecentlyAdded RecentlyAdded(string authToken, Uri plexFullHost) public RecentlyAddedModel RecentlyAdded(string authToken, Uri plexFullHost, string sectionId)
{ {
var request = new RestRequest var request = new RestRequest
{ {
Method = Method.GET, Method = Method.GET,
Resource = "library/recentlyAdded" Resource = "library/sections/{sectionId}/recentlyAdded"
}; };
request.AddHeader("X-Plex-Token", authToken); request.AddUrlSegment("sectionId", sectionId);
request.AddHeader("X-Plex-Client-Identifier", $"PlexRequests.Net{Version}"); AddHeaders(ref request, authToken, true);
request.AddHeader("X-Plex-Product", "Plex Requests .Net"); AddLimitHeaders(ref request, 0, 25);
request.AddHeader("X-Plex-Version", Version);
request.AddHeader("Content-Type", "application/json");
request.AddHeader("Accept", "application/json");
try try
{ {
var lib = RetryHandler.Execute(() => Api.ExecuteJson<RecentlyAdded>(request, plexFullHost), var lib = RetryHandler.Execute(() => Api.ExecuteJson<RecentlyAddedModel>(request, plexFullHost),
(exception, timespan) => Log.Error(exception, "Exception when calling RecentlyAdded for Plex, Retrying {0}", timespan), new[] { (exception, timespan) => Log.Error(exception, "Exception when calling RecentlyAddedModel for Plex, Retrying {0}", timespan), new[] {
TimeSpan.FromSeconds (5), TimeSpan.FromSeconds (5),
TimeSpan.FromSeconds(10), TimeSpan.FromSeconds(10),
TimeSpan.FromSeconds(30) TimeSpan.FromSeconds(30)
@ -375,23 +371,30 @@ namespace PlexRequests.Api
} }
catch (Exception e) catch (Exception e)
{ {
Log.Error(e, "There has been a API Exception when attempting to get the Plex RecentlyAdded"); Log.Error(e, "There has been a API Exception when attempting to get the Plex RecentlyAddedModel");
return new RecentlyAdded(); return new RecentlyAddedModel();
} }
} }
private void AddHeaders(ref RestRequest request, string authToken) private void AddLimitHeaders(ref RestRequest request, int from, int to)
{ {
request.AddHeader("X-Plex-Token", authToken); request.AddHeader("X-Plex-Container-Start", from.ToString());
AddHeaders(ref request); request.AddHeader("X-Plex-Container-Size", to.ToString());
} }
private void AddHeaders(ref RestRequest request) private void AddHeaders(ref RestRequest request, string authToken, bool json)
{
request.AddHeader("X-Plex-Token", authToken);
AddHeaders(ref request, json);
}
private void AddHeaders(ref RestRequest request, bool json)
{ {
request.AddHeader("X-Plex-Client-Identifier", $"PlexRequests.Net{Version}"); request.AddHeader("X-Plex-Client-Identifier", $"PlexRequests.Net{Version}");
request.AddHeader("X-Plex-Product", "Plex Requests .Net"); request.AddHeader("X-Plex-Product", "Plex Requests .Net");
request.AddHeader("X-Plex-Version", Version); request.AddHeader("X-Plex-Version", Version);
request.AddHeader("Content-Type", "application/xml"); request.AddHeader("Content-Type", json ? "application/json" : "application/xml");
request.AddHeader("Accept", json ? "application/json" : "application/xml");
} }
} }
} }

View file

@ -1,42 +1,50 @@
using System; using System;
using System.Globalization; using System.Globalization;
using System.Linq; using System.Linq;
namespace PlexRequests.Helpers namespace PlexRequests.Helpers
{ {
public static class DateTimeHelper public static class DateTimeHelper
{ {
public static DateTimeOffset OffsetUTCDateTime(DateTime utcDateTime, int minuteOffset) public static DateTimeOffset OffsetUTCDateTime(DateTime utcDateTime, int minuteOffset)
{ {
//TimeSpan ts = TimeSpan.FromMinutes(-minuteOffset); //TimeSpan ts = TimeSpan.FromMinutes(-minuteOffset);
//return new DateTimeOffset(utcDateTime).ToOffset(ts); //return new DateTimeOffset(utcDateTime).ToOffset(ts);
// this is a workaround below to work with MONO // this is a workaround below to work with MONO
var tzi = FindTimeZoneFromOffset(minuteOffset); var tzi = FindTimeZoneFromOffset(minuteOffset);
var utcOffset = tzi.GetUtcOffset(utcDateTime); var utcOffset = tzi.GetUtcOffset(utcDateTime);
var newDate = utcDateTime + utcOffset; var newDate = utcDateTime + utcOffset;
return new DateTimeOffset(newDate.Ticks, utcOffset); return new DateTimeOffset(newDate.Ticks, utcOffset);
} }
public static void CustomParse(string date, out DateTime dt) public static void CustomParse(string date, out DateTime dt)
{ {
// Try and parse it // Try and parse it
if (DateTime.TryParse(date, out dt)) if (DateTime.TryParse(date, out dt))
{ {
return; return;
} }
// Maybe it's only a year? // Maybe it's only a year?
if (DateTime.TryParseExact(date, "yyyy", CultureInfo.CurrentCulture, DateTimeStyles.None, out dt)) if (DateTime.TryParseExact(date, "yyyy", CultureInfo.CurrentCulture, DateTimeStyles.None, out dt))
{ {
return; return;
} }
} }
private static TimeZoneInfo FindTimeZoneFromOffset(int minuteOffset) private static TimeZoneInfo FindTimeZoneFromOffset(int minuteOffset)
{ {
var tzc = TimeZoneInfo.GetSystemTimeZones(); var tzc = TimeZoneInfo.GetSystemTimeZones();
return tzc.FirstOrDefault(x => x.BaseUtcOffset.TotalMinutes == -minuteOffset); return tzc.FirstOrDefault(x => x.BaseUtcOffset.TotalMinutes == -minuteOffset);
} }
}
} public static DateTime UnixTimeStampToDateTime(this int unixTimeStamp)
{
// Unix timestamp is seconds past epoch
System.DateTime dtDateTime = new DateTime(1970, 1, 1, 0, 0, 0, 0, System.DateTimeKind.Utc);
dtDateTime = dtDateTime.AddSeconds(unixTimeStamp).ToLocalTime();
return dtDateTime;
}
}
}

View file

@ -123,12 +123,13 @@ namespace PlexRequests.Services.Jobs
case RequestType.TvShow: case RequestType.TvShow:
if (!plexSettings.EnableTvEpisodeSearching) if (!plexSettings.EnableTvEpisodeSearching)
{ {
matchResult = IsTvShowAvailable(shows, r.Title, releaseDate, r.TvDbId); matchResult = IsTvShowAvailable(shows, r.Title, releaseDate, r.TvDbId, r.SeasonList);
} }
else else
{ {
matchResult = matchResult = r.Episodes.Any() ?
r.Episodes.All(x => IsEpisodeAvailable(r.TvDbId, x.SeasonNumber, x.EpisodeNumber)); r.Episodes.All(x => IsEpisodeAvailable(r.TvDbId, x.SeasonNumber, x.EpisodeNumber)) :
IsTvShowAvailable(shows, r.Title, releaseDate, r.TvDbId, r.SeasonList);
} }
break; break;
case RequestType.Album: case RequestType.Album:
@ -270,7 +271,7 @@ namespace PlexRequests.Services.Jobs
{ {
if (advanced) if (advanced)
{ {
if (seasons != null && show.ProviderId == providerId) if (show.ProviderId == providerId)
{ {
if (seasons.Any(season => show.Seasons.Contains(season))) if (seasons.Any(season => show.Seasons.Contains(season)))
{ {

View file

@ -2,7 +2,7 @@
// /************************************************************************ // /************************************************************************
// Copyright (c) 2016 Jamie Rees // Copyright (c) 2016 Jamie Rees
// File: RecentlyAdded.cs // File: RecentlyAddedModel.cs
// Created By: Jamie Rees // Created By: Jamie Rees
// //
// Permission is hereby granted, free of charge, to any person obtaining // Permission is hereby granted, free of charge, to any person obtaining
@ -114,7 +114,7 @@ namespace PlexRequests.Services.Jobs
public void Test() public void Test()
{ {
StartDb(true); Start(true);
} }
private void Start(bool testEmail = false) private void Start(bool testEmail = false)
@ -122,18 +122,15 @@ namespace PlexRequests.Services.Jobs
var sb = new StringBuilder(); var sb = new StringBuilder();
var plexSettings = PlexSettings.GetSettings(); var plexSettings = PlexSettings.GetSettings();
var recentlyAdded = Api.RecentlyAdded(plexSettings.PlexAuthToken, plexSettings.FullUri); var libs = Api.GetLibrarySections(plexSettings.PlexAuthToken, plexSettings.FullUri);
var tvSection = libs.Directories.FirstOrDefault(x => x.type.Equals(PlexMediaType.Show.ToString(), StringComparison.CurrentCultureIgnoreCase));
var movieSection = libs.Directories.FirstOrDefault(x => x.type.Equals(PlexMediaType.Movie.ToString(), StringComparison.CurrentCultureIgnoreCase));
var movies = var recentlyAddedTv = Api.RecentlyAdded(plexSettings.PlexAuthToken, plexSettings.FullUri, tvSection.Key);
recentlyAdded._children.Where(x => x.type.Equals("Movie", StringComparison.CurrentCultureIgnoreCase)); var recentlyAddedMovies = Api.RecentlyAdded(plexSettings.PlexAuthToken, plexSettings.FullUri, movieSection.Key);
var tv =
recentlyAdded._children.Where(
x => x.type.Equals("season", StringComparison.CurrentCultureIgnoreCase))
.GroupBy(x => x.parentTitle)
.Select(x => x.FirstOrDefault());
GenerateMovieHtml(movies, plexSettings, ref sb); GenerateMovieHtml(recentlyAddedMovies, plexSettings, ref sb);
GenerateTvHtml(tv, plexSettings, ref sb); GenerateTvHtml(recentlyAddedTv, plexSettings, ref sb);
var template = new RecentlyAddedTemplate(); var template = new RecentlyAddedTemplate();
var html = template.LoadTemplate(sb.ToString()); var html = template.LoadTemplate(sb.ToString());
@ -160,12 +157,12 @@ namespace PlexRequests.Services.Jobs
Send(html, plexSettings, testEmail); Send(html, plexSettings, testEmail);
} }
private void GenerateMovieHtml(IEnumerable<RecentlyAddedChild> movies, PlexSettings plexSettings, ref StringBuilder sb) private void GenerateMovieHtml(RecentlyAddedModel movies, PlexSettings plexSettings, ref StringBuilder sb)
{ {
sb.Append("<h1>New Movies:</h1><br/><br/>"); sb.Append("<h1>New Movies:</h1><br/><br/>");
sb.Append( sb.Append(
"<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 movie in movies.OrderByDescending(x => x.addedAt)) foreach (var movie in movies._children.OrderByDescending(x => x.addedAt.UnixTimeStampToDateTime()))
{ {
var plexGUID = string.Empty; var plexGUID = string.Empty;
try try
@ -264,15 +261,14 @@ namespace PlexRequests.Services.Jobs
} }
sb.Append("</table><br/><br/>"); sb.Append("</table><br/><br/>");
} }
[Obsolete("Use the new DB Version")] private void GenerateTvHtml(RecentlyAddedModel tv, PlexSettings plexSettings, ref StringBuilder sb)
private void GenerateTvHtml(IEnumerable<RecentlyAddedChild> tv, PlexSettings plexSettings, ref StringBuilder sb)
{ {
// TV // TV
sb.Append("<h1>New Episodes:</h1><br/><br/>"); sb.Append("<h1>New Episodes:</h1><br/><br/>");
sb.Append( sb.Append(
"<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 tv.OrderByDescending(x => x.addedAt)) foreach (var t in tv._children.OrderByDescending(x => x.addedAt.UnixTimeStampToDateTime()))
{ {
var plexGUID = string.Empty; var plexGUID = string.Empty;
try try
@ -298,12 +294,14 @@ namespace PlexRequests.Services.Jobs
sb.Append("<tr>"); sb.Append("<tr>");
sb.Append("<td align=\"center\" style=\"font-family: sans-serif; font-size: 14px; vertical-align: top;\" valign=\"top\">"); sb.Append("<td align=\"center\" style=\"font-family: sans-serif; font-size: 14px; vertical-align: top;\" valign=\"top\">");
var title = $"{t.grandparentTitle} - {t.title} {t.originallyAvailableAt.Substring(0, 4)}";
sb.AppendFormat("<a href=\"https://www.imdb.com/title/{0}/\"><h3 style=\"font-family: sans-serif; font-weight: normal; margin: 0; Margin-bottom: 15px;\">{1} {2}</p></a>", sb.AppendFormat("<a href=\"https://www.imdb.com/title/{0}/\"><h3 style=\"font-family: sans-serif; font-weight: normal; margin: 0; Margin-bottom: 15px;\">{1} {2}</p></a>",
info.externals.imdb, info.name, info.premiered.Substring(0, 4)); // Only the year info.externals.imdb, title); // Only the year
sb.AppendFormat("<p style=\"font-family: sans-serif; font-size: 14px; font-weight: normal; margin: 0; Margin-bottom: 15px;\">Genre: {0}</p>", string.Join(", ", info.genres.Select(x => x.ToString()).ToArray())); sb.AppendFormat("<p style=\"font-family: sans-serif; font-size: 14px; font-weight: normal; margin: 0; Margin-bottom: 15px;\">Genre: {0}</p>", string.Join(", ", info.genres.Select(x => x.ToString()).ToArray()));
sb.AppendFormat("<p style=\"font-family: sans-serif; font-size: 14px; font-weight: normal; margin: 0; Margin-bottom: 15px;\">{0}</p>", sb.AppendFormat("<p style=\"font-family: sans-serif; font-size: 14px; font-weight: normal; margin: 0; Margin-bottom: 15px;\">{0}</p>",
string.IsNullOrEmpty(parentMetaData.Directory.Summary) ? info.summary : parentMetaData.Directory.Summary); // Episode Summary string.IsNullOrEmpty(t.summary) ? info.summary : t.summary); // Episode Summary
sb.Append("<td"); sb.Append("<td");
sb.Append("<hr>"); sb.Append("<hr>");

View file

@ -66,7 +66,7 @@ namespace PlexRequests.UI.Jobs
JobBuilder.Create<StoreBackup>().WithIdentity("StoreBackup", "Database").Build(), JobBuilder.Create<StoreBackup>().WithIdentity("StoreBackup", "Database").Build(),
JobBuilder.Create<StoreCleanup>().WithIdentity("StoreCleanup", "Database").Build(), JobBuilder.Create<StoreCleanup>().WithIdentity("StoreCleanup", "Database").Build(),
JobBuilder.Create<UserRequestLimitResetter>().WithIdentity("UserRequestLimiter", "Request").Build(), JobBuilder.Create<UserRequestLimitResetter>().WithIdentity("UserRequestLimiter", "Request").Build(),
JobBuilder.Create<RecentlyAdded>().WithIdentity("RecentlyAdded", "Email").Build() JobBuilder.Create<RecentlyAdded>().WithIdentity("RecentlyAddedModel", "Email").Build()
}; };
@ -168,7 +168,7 @@ namespace PlexRequests.UI.Jobs
var rencentlyAdded = var rencentlyAdded =
TriggerBuilder.Create() TriggerBuilder.Create()
.WithIdentity("RecentlyAdded", "Email") .WithIdentity("RecentlyAddedModel", "Email")
.StartNow() .StartNow()
.WithSimpleSchedule(x => x.WithIntervalInHours(2).RepeatForever()) .WithSimpleSchedule(x => x.WithIntervalInHours(2).RepeatForever())
.Build(); .Build();

View file

@ -67,9 +67,6 @@ namespace PlexRequests.UI
Debug.WriteLine("Finished bootstrapper"); Debug.WriteLine("Finished bootstrapper");
var scheduler = new Scheduler(); var scheduler = new Scheduler();
scheduler.StartScheduler(); scheduler.StartScheduler();
var r = kernel.Get<IRecentlyAdded>();
r.Test();
} }
catch (Exception exception) catch (Exception exception)
{ {

View file

@ -82,7 +82,7 @@
<div class="form-group"> <div class="form-group">
<label for="RecentlyAdded" class="control-label">Recently Added Email (hours)</label> <label for="RecentlyAdded" class="control-label">Recently Added Email (hours)</label>
<div> <div>
<input type="text" class="form-control form-control-custom " id="RecentlyAdded" name="RecentlyAdded" value="@Model.RecentlyAdded"> <input type="text" class="form-control form-control-custom " id="RecentlyAdded" name="RecentlyAddedModel" value="@Model.RecentlyAddedModel">
</div> </div>
</div> </div>