From e8c222f66ea867b1d33cf25e065f9074f651ab43 Mon Sep 17 00:00:00 2001 From: Drewster727 Date: Sun, 3 Apr 2016 20:32:36 -0500 Subject: [PATCH] #114 start caching quality profiles. Set the cache on startup and when obtaining quality profiles in settings --- PlexRequests.Core/CacheKeys.cs | 3 ++ PlexRequests.Core/Setup.cs | 47 +++++++++++++++++++++ PlexRequests.Helpers/MemoryCacheProvider.cs | 2 +- PlexRequests.UI/Modules/AdminModule.cs | 14 ++++++ PlexRequests.UI/Modules/RequestsModule.cs | 27 ++++++------ PlexRequests.UI/Program.cs | 2 + 6 files changed, 81 insertions(+), 14 deletions(-) diff --git a/PlexRequests.Core/CacheKeys.cs b/PlexRequests.Core/CacheKeys.cs index c76e20034..a40291b91 100644 --- a/PlexRequests.Core/CacheKeys.cs +++ b/PlexRequests.Core/CacheKeys.cs @@ -29,5 +29,8 @@ namespace PlexRequests.Core public class CacheKeys { public const string TvDbToken = "TheTvDbApiToken"; + public const string SonarrQualityProfiles = "SonarrQualityProfiles"; + public const string SickRageQualityProfiles = "SickRageQualityProfiles"; + public const string CouchPotatoQualityProfiles = "CouchPotatoQualityProfiles"; } } \ No newline at end of file diff --git a/PlexRequests.Core/Setup.cs b/PlexRequests.Core/Setup.cs index b612a6301..428c5477e 100644 --- a/PlexRequests.Core/Setup.cs +++ b/PlexRequests.Core/Setup.cs @@ -37,6 +37,7 @@ using PlexRequests.Helpers; using PlexRequests.Store; using PlexRequests.Store.Repository; using System.Text.RegularExpressions; +using System.Threading.Tasks; namespace PlexRequests.Core { @@ -115,6 +116,52 @@ namespace PlexRequests.Core s.SaveSettings(defaultSettings); } + public async void CacheQualityProfiles() + { + var mc = new MemoryCacheProvider(); + + try + { + CacheSonarrQualityProfiles(mc); + CacheCouchPotatoQualityProfiles(mc); + // we don't need to cache sickrage profiles, those are static + // TODO: cache headphones profiles? + } + catch (Exception) + { + Log.Error("Failed to cache quality profiles on startup!"); + } + } + + private async void CacheSonarrQualityProfiles(MemoryCacheProvider cacheProvider) + { + var sonarrSettingsService = new SettingsServiceV2(new SettingsJsonRepository(new DbConfiguration(new SqliteFactory()), new MemoryCacheProvider())); + var sonarrSettings = sonarrSettingsService.GetSettings(); + if (sonarrSettings.Enabled) { + cacheProvider.GetOrSet(CacheKeys.SonarrQualityProfiles, () => + { + SonarrApi sonarrApi = new SonarrApi(); + return sonarrApi.GetProfiles(sonarrSettings.ApiKey, sonarrSettings.FullUri); + + }); + } + } + + private async void CacheCouchPotatoQualityProfiles(MemoryCacheProvider cacheProvider) + { + var cpSettingsService = new SettingsServiceV2(new SettingsJsonRepository(new DbConfiguration(new SqliteFactory()), new MemoryCacheProvider())); + var cpSettings = cpSettingsService.GetSettings(); + if (cpSettings.Enabled) + { + cacheProvider.GetOrSet(CacheKeys.CouchPotatoQualityProfiles, () => + { + CouchPotatoApi cpApi = new CouchPotatoApi(); + return cpApi.GetProfiles(cpSettings.FullUri, cpSettings.ApiKey); + + }); + } + } + private void MigrateDbFrom1300() // TODO: Remove in v1.7 { diff --git a/PlexRequests.Helpers/MemoryCacheProvider.cs b/PlexRequests.Helpers/MemoryCacheProvider.cs index 30863c19f..6e513502c 100644 --- a/PlexRequests.Helpers/MemoryCacheProvider.cs +++ b/PlexRequests.Helpers/MemoryCacheProvider.cs @@ -83,7 +83,7 @@ namespace PlexRequests.Helpers /// The key. /// The object we want to store. /// The amount of time we want to cache the object. - public void Set(string key, object data, int cacheTime) + public void Set(string key, object data, int cacheTime = 20) { var policy = new CacheItemPolicy { AbsoluteExpiration = DateTime.Now + TimeSpan.FromMinutes(cacheTime) }; Cache.Add(new CacheItem(key, data), policy); diff --git a/PlexRequests.UI/Modules/AdminModule.cs b/PlexRequests.UI/Modules/AdminModule.cs index 41716ba2f..17bd24b3c 100644 --- a/PlexRequests.UI/Modules/AdminModule.cs +++ b/PlexRequests.UI/Modules/AdminModule.cs @@ -374,6 +374,13 @@ namespace PlexRequests.UI.Modules var settings = this.Bind(); var profiles = SonarrApi.GetProfiles(settings.ApiKey, settings.FullUri); + // set the cache + if (profiles != null) + { + var cache = new MemoryCacheProvider(); + cache.Set(CacheKeys.SonarrQualityProfiles, profiles); + } + return Response.AsJson(profiles); } @@ -582,6 +589,13 @@ namespace PlexRequests.UI.Modules var settings = this.Bind(); var profiles = CpApi.GetProfiles(settings.FullUri, settings.ApiKey); + // set the cache + if (profiles != null) + { + var cache = new MemoryCacheProvider(); + cache.Set(CacheKeys.CouchPotatoQualityProfiles, profiles); + } + return Response.AsJson(profiles); } diff --git a/PlexRequests.UI/Modules/RequestsModule.cs b/PlexRequests.UI/Modules/RequestsModule.cs index ddeda5c34..371b62f46 100644 --- a/PlexRequests.UI/Modules/RequestsModule.cs +++ b/PlexRequests.UI/Modules/RequestsModule.cs @@ -126,7 +126,7 @@ namespace PlexRequests.UI.Modules })); - + var mc = new MemoryCacheProvider(); List qualities = new List(); if (isAdmin) @@ -136,10 +136,13 @@ namespace PlexRequests.UI.Modules { taskList.Add(Task.Factory.StartNew(() => { - return CpApi.GetProfiles(cpSettings.FullUri, cpSettings.ApiKey).list.Select(x => new QualityModel() { Id = x._id, Name = x.label }); // TODO: cache this! + return mc.GetOrSet(CacheKeys.CouchPotatoQualityProfiles, () => + { + return CpApi.GetProfiles(cpSettings.FullUri, cpSettings.ApiKey); // TODO: cache this! + }); }).ContinueWith((t) => { - qualities = t.Result.ToList(); + qualities = t.Result.list.Select(x => new QualityModel() { Id = x._id, Name = x.label }).ToList(); })); } } @@ -199,6 +202,7 @@ namespace PlexRequests.UI.Modules } })); + var mc = new MemoryCacheProvider(); List qualities = new List(); if (isAdmin) { @@ -207,25 +211,22 @@ namespace PlexRequests.UI.Modules { taskList.Add(Task.Factory.StartNew(() => { - return SonarrApi.GetProfiles(sonarrSettings.ApiKey, sonarrSettings.FullUri).Select(x => new QualityModel() { Id = x.id.ToString(), Name = x.name }); // TODO: cache this! + return mc.GetOrSet(CacheKeys.SonarrQualityProfiles, () => + { + return SonarrApi.GetProfiles(sonarrSettings.ApiKey, sonarrSettings.FullUri); // TODO: cache this! + + }); }).ContinueWith((t) => { - qualities = t.Result.ToList(); + qualities = t.Result.Select(x => new QualityModel() { Id = x.id.ToString(), Name = x.name }).ToList(); })); } else { var sickRageSettings = SickRageSettings.GetSettings(); if (sickRageSettings.Enabled) { - taskList.Add(Task.Factory.StartNew(() => - { - return sickRageSettings.Qualities.Select(x => new QualityModel() { Id = x.Key, Name = x.Value }); // TODO: cache this! - }).ContinueWith((t) => - { - qualities = t.Result.ToList(); - })); + qualities = sickRageSettings.Qualities.Select(x => new QualityModel() { Id = x.Key, Name = x.Value }).ToList(); } - } } diff --git a/PlexRequests.UI/Program.cs b/PlexRequests.UI/Program.cs index c8f863f40..3d47f4425 100644 --- a/PlexRequests.UI/Program.cs +++ b/PlexRequests.UI/Program.cs @@ -63,8 +63,10 @@ namespace PlexRequests.UI WriteOutVersion(); var s = new Setup(); + s.CacheQualityProfiles(); var cn = s.SetupDb(); ConfigureTargets(cn); + if (port == -1) port = GetStartupPort();