Fixed #561 and a small bit of work on #569

pull/570/head
tidusjar 8 years ago
parent 6e3e290359
commit e563b5bf3d

@ -38,6 +38,6 @@ namespace PlexRequests.Api.Interfaces
CouchPotatoProfiles GetProfiles(Uri url, string apiKey);
CouchPotatoMovies GetMovies(Uri baseUrl, string apiKey, string[] status);
CoucPotatoApiKey GetApiKey(Uri baseUrl, string username, string password);
CouchPotatoApiKey GetApiKey(Uri baseUrl, string username, string password);
}
}

@ -1,7 +1,7 @@
#region Copyright
// /************************************************************************
// Copyright (c) 2016 Jamie Rees
// File: CoucPotatoApiKey.cs
// File: CouchPotatoApiKey.cs
// Created By: Jamie Rees
//
// Permission is hereby granted, free of charge, to any person obtaining
@ -28,10 +28,10 @@ using Newtonsoft.Json;
namespace PlexRequests.Api.Models.Movie
{
public class CoucPotatoApiKey
public class CouchPotatoApiKey
{
[JsonProperty("success")]
public bool Result { get; set; }
public bool success { get; set; }
[JsonProperty("api_key")]
public string ApiKey { get; set; }
}

@ -49,7 +49,7 @@
<Compile Include="Movie\CouchPotatoMovies.cs" />
<Compile Include="Movie\CouchPotatoProfiles.cs" />
<Compile Include="Movie\CouchPotatoStatus.cs" />
<Compile Include="Movie\CoucPotatoApiKey.cs" />
<Compile Include="Movie\CouchPotatoApiKey.cs" />
<Compile Include="Music\HeadphonesAlbumSearchResult.cs" />
<Compile Include="Music\HeadphonesArtistSearchResult.cs" />
<Compile Include="Music\HeadphonesGetIndex.cs" />

@ -160,18 +160,18 @@ namespace PlexRequests.Api
}
}
public CoucPotatoApiKey GetApiKey(Uri baseUrl, string username, string password)
public CouchPotatoApiKey GetApiKey(Uri baseUrl, string username, string password)
{
var request = new RestRequest
{
Resource = "getkey/?p={username}&u={password}",
Resource = "getkey/?u={username}&p={password}",
Method = Method.GET
};
request.AddUrlSegment("username", StringHasher.CalcuateMd5Hash(username));
request.AddUrlSegment("password", StringHasher.CalcuateMd5Hash(password));
var obj = RetryHandler.Execute(() => Api.Execute<CoucPotatoApiKey>(request, baseUrl),
var obj = RetryHandler.Execute(() => Api.Execute<CouchPotatoApiKey>(request, baseUrl),
(exception, timespan) => Log.Error(exception, "Exception when calling GetApiKey for CP, Retrying {0}", timespan), null);
return obj;

@ -0,0 +1,10 @@
using Quartz;
namespace PlexRequests.Services.Jobs
{
public interface IRecentlyAdded
{
void Execute(IJobExecutionContext context);
void Test();
}
}

@ -45,7 +45,7 @@ using Quartz;
namespace PlexRequests.Services.Jobs
{
public class RecentlyAdded : IJob
public class RecentlyAdded : IJob, IRecentlyAdded
{
public RecentlyAdded(IPlexApi api, ISettingsService<PlexSettings> plexSettings, ISettingsService<EmailNotificationSettings> email,
ISettingsService<ScheduledJobsSettings> scheduledService, IJobRecord rec)
@ -83,7 +83,7 @@ namespace PlexRequests.Services.Jobs
return;
}
Start();
Start();
}
catch (Exception e)
{
@ -95,10 +95,16 @@ namespace PlexRequests.Services.Jobs
}
}
private void Start()
public void Test()
{
Start(true);
}
private void Start(bool testEmail = false)
{
var sb = new StringBuilder();
var plexSettings = PlexSettings.GetSettings();
var recentlyAdded = Api.RecentlyAdded(plexSettings.PlexAuthToken, plexSettings.FullUri);
var movies =
@ -115,7 +121,7 @@ namespace PlexRequests.Services.Jobs
var template = new RecentlyAddedTemplate();
var html = template.LoadTemplate(sb.ToString());
Send(html, plexSettings);
Send(html, plexSettings, testEmail);
}
private void GenerateMovieHtml(IEnumerable<RecentlyAddedChild> movies, PlexSettings plexSettings, ref StringBuilder sb)
@ -194,10 +200,15 @@ namespace PlexRequests.Services.Jobs
sb.Append("</table><br/><br/>");
}
private void Send(string html, PlexSettings plexSettings)
private void Send(string html, PlexSettings plexSettings, bool testEmail = false)
{
var users = Api.GetUsers(plexSettings.PlexAuthToken);
var settings = EmailSettings.GetSettings();
if (!settings.Enabled || string.IsNullOrEmpty(settings.EmailHost))
{
return;
}
var body = new BodyBuilder { HtmlBody = html, TextBody = "This email is only available on devices that support HTML." };
var message = new MimeMessage
{
@ -205,11 +216,16 @@ namespace PlexRequests.Services.Jobs
Subject = "New Content on Plex!",
};
foreach (var user in users.User)
if (!testEmail)
{
message.Bcc.Add(new MailboxAddress(user.Username, user.Email));
var users = Api.GetUsers(plexSettings.PlexAuthToken);
foreach (var user in users.User)
{
message.Bcc.Add(new MailboxAddress(user.Username, user.Email));
}
}
message.Bcc.Add(new MailboxAddress(settings.EmailUsername, settings.EmailSender)); // Include the admin
message.From.Add(new MailboxAddress(settings.EmailUsername, settings.EmailSender));
try
{

@ -80,6 +80,7 @@
<ItemGroup>
<Compile Include="Interfaces\IJobRecord.cs" />
<Compile Include="Interfaces\INotificationEngine.cs" />
<Compile Include="Jobs\IRecentlyAdded.cs" />
<Compile Include="Jobs\JobRecord.cs" />
<Compile Include="Jobs\JobNames.cs" />
<Compile Include="Jobs\PlexEpisodeCacher.cs" />

@ -48,6 +48,7 @@ using PlexRequests.UI.Models;
using PlexRequests.UI.Modules;
using PlexRequests.Helpers;
using PlexRequests.Helpers.Analytics;
using PlexRequests.Services.Jobs;
using PlexRequests.UI.Helpers;
namespace PlexRequests.UI.Tests
@ -81,6 +82,7 @@ namespace PlexRequests.UI.Tests
private Mock<ISlackApi> SlackApi { get; set; }
private Mock<IAnalytics> Analytics { get; set; }
private Mock<ISettingsService<NotificationSettingsV2>> NotifyV2 { get; set; }
private Mock<IRecentlyAdded> RecentlyAdded { get; set; }
private ConfigurableBootstrapper Bootstrapper { get; set; }
@ -122,6 +124,7 @@ namespace PlexRequests.UI.Tests
RecorderMock = new Mock<IJobRecord>();
Analytics = new Mock<IAnalytics>();
NotifyV2= new Mock<ISettingsService<NotificationSettingsV2>>();
RecentlyAdded = new Mock<IRecentlyAdded>();
Bootstrapper = new ConfigurableBootstrapper(with =>
@ -153,6 +156,7 @@ namespace PlexRequests.UI.Tests
with.Dependency(SlackSettings.Object);
with.Dependency(ScheduledJobsSettingsMock.Object);
with.Dependency(RecorderMock.Object);
with.Dependency(RecentlyAdded.Object);
with.RootPathProvider<TestRootPathProvider>();
with.RequestStartup((container, pipelines, context) =>
{

@ -57,6 +57,7 @@ using PlexRequests.Helpers;
using PlexRequests.Helpers.Analytics;
using PlexRequests.Helpers.Exceptions;
using PlexRequests.Services.Interfaces;
using PlexRequests.Services.Jobs;
using PlexRequests.Services.Notification;
using PlexRequests.Store.Models;
using PlexRequests.Store.Repository;
@ -94,6 +95,7 @@ namespace PlexRequests.UI.Modules
private ISlackApi SlackApi { get; }
private IJobRecord JobRecorder { get; }
private IAnalytics Analytics { get; }
private IRecentlyAdded RecentlyAdded { get; }
private ISettingsService<NotificationSettingsV2> NotifySettings { get; }
private static Logger Log = LogManager.GetCurrentClassLogger();
@ -118,7 +120,7 @@ namespace PlexRequests.UI.Modules
ICacheProvider cache, ISettingsService<SlackNotificationSettings> slackSettings,
ISlackApi slackApi, ISettingsService<LandingPageSettings> lp,
ISettingsService<ScheduledJobsSettings> scheduler, IJobRecord rec, IAnalytics analytics,
ISettingsService<NotificationSettingsV2> notifyService) : base("admin", prService)
ISettingsService<NotificationSettingsV2> notifyService, IRecentlyAdded recentlyAdded) : base("admin", prService)
{
PrService = prService;
CpService = cpService;
@ -146,6 +148,7 @@ namespace PlexRequests.UI.Modules
JobRecorder = rec;
Analytics = analytics;
NotifySettings = notifyService;
RecentlyAdded = recentlyAdded;
this.RequiresClaims(UserClaims.Admin);
@ -216,6 +219,8 @@ namespace PlexRequests.UI.Modules
Get["/notificationsettings", true] = async (x, ct) => await NotificationSettings();
Post["/notificationsettings", true] = async (x, ct) => await SaveNotificationSettings();
Post["/recentlyAddedTest"] = x => RecentlyAddedTest();
}
private async Task<Negotiator> Authentication()
@ -985,5 +990,19 @@ namespace PlexRequests.UI.Modules
var model = this.Bind<NotificationSettingsV2>();
return View["NotificationSettings", model];
}
private Response RecentlyAddedTest()
{
try
{
RecentlyAdded.Test();
return Response.AsJson(new JsonResponseModel { Result = true, Message = "Sent email to administrator" });
}
catch (Exception e)
{
return Response.AsJson(new JsonResponseModel { Result = false, Message = e.Message });
}
}
}
}

@ -45,6 +45,7 @@ namespace PlexRequests.UI.NinjectModules
Bind<ICouchPotatoCacher>().To<CouchPotatoCacher>();
Bind<ISonarrCacher>().To<SonarrCacher>();
Bind<ISickRageCacher>().To<SickRageCacher>();
Bind<IRecentlyAdded>().To<RecentlyAdded>();
Bind<IJobFactory>().To<CustomJobFactory>();
Bind<IAnalytics>().To<Analytics>();

@ -160,6 +160,7 @@
$('#requestToken').click(function (e) {
e.preventDefault();
debugger;
var $form = $("#mainForm");
$.ajax({
type: $form.prop("method"),
@ -167,7 +168,7 @@
data: $form.serialize(),
dataType: "json",
success: function (response) {
if (response.result === true) {
if (response.apiKey) {
generateNotify("Success!", "success");
$('#ApiKey').val(response.apiKey);
} else {

@ -76,21 +76,22 @@
</div>
<br/>
<br/>
<div class="form-group">
<div class="checkbox">
<div class="form-group">
<div class="checkbox">
<small>Note: This will require you to setup your email notifications</small>
@if (Model.SendRecentlyAddedEmail)
{
<input type="checkbox" id="SendRecentlyAddedEmail" name="SendRecentlyAddedEmail" checked="checked"><label for="SendRecentlyAddedEmail">Send out a weekly email of recently added content to all your Plex 'Friends'</label>
}
else
{
<input type="checkbox" id="SendRecentlyAddedEmail" name="SendRecentlyAddedEmail"><label for="SendRecentlyAddedEmail">Send out a weekly email of recently added content to all your Plex 'Friends'</label>
}
<small>Note: This will require you to setup your email notifications</small>
@if (Model.SendRecentlyAddedEmail)
{
<input type="checkbox" id="SendRecentlyAddedEmail" name="SendRecentlyAddedEmail" checked="checked"><label for="SendRecentlyAddedEmail">Send out a weekly email of recently added content to all your Plex 'Friends'</label>
}
else
{
<input type="checkbox" id="SendRecentlyAddedEmail" name="SendRecentlyAddedEmail"><label for="SendRecentlyAddedEmail">Send out a weekly email of recently added content to all your Plex 'Friends'</label>
}
</div>
</div>
</div>
<button id="recentlyAddedBtn" class="btn btn-primary-outline">Send test email to Admin</button>
<div class="form-group">
<div class="checkbox">
@ -372,5 +373,29 @@
}
});
});
$('#recentlyAddedBtn').click(function (e) {
e.preventDefault();
var base = '@Html.GetBaseUrl()';
var url = createBaseUrl(base, '/admin/recentlyAddedTest');
$.ajax({
type: "post",
url: url,
dataType: "json",
success: function (response) {
if (response) {
generateNotify(response.message, "success");
} else {
generateNotify(response.message, "danger");
}
},
error: function (e) {
console.log(e);
generateNotify("Something went wrong!", "danger");
}
});
});
});
</script>
Loading…
Cancel
Save