From 75d90c8e4c2213b7428640d407583f4e1c579aa4 Mon Sep 17 00:00:00 2001 From: Claus Vium Date: Thu, 7 Feb 2019 20:28:19 +0100 Subject: [PATCH] Add caching PoC --- .../MediaBrowser.Providers.csproj | 1 + .../TV/TheTVDB/TvDbClientManager.cs | 32 +++++++++++++++++++ .../TV/TheTVDB/TvdbSeriesProvider.cs | 16 +++++----- 3 files changed, 41 insertions(+), 8 deletions(-) diff --git a/MediaBrowser.Providers/MediaBrowser.Providers.csproj b/MediaBrowser.Providers/MediaBrowser.Providers.csproj index 1cf1ab256a..aadf31a7a7 100644 --- a/MediaBrowser.Providers/MediaBrowser.Providers.csproj +++ b/MediaBrowser.Providers/MediaBrowser.Providers.csproj @@ -11,6 +11,7 @@ + diff --git a/MediaBrowser.Providers/TV/TheTVDB/TvDbClientManager.cs b/MediaBrowser.Providers/TV/TheTVDB/TvDbClientManager.cs index 861cd3f5bd..e7b2d151c4 100644 --- a/MediaBrowser.Providers/TV/TheTVDB/TvDbClientManager.cs +++ b/MediaBrowser.Providers/TV/TheTVDB/TvDbClientManager.cs @@ -1,12 +1,19 @@ using System; +using System.Threading; +using System.Threading.Tasks; using MediaBrowser.Controller.Library; +using Microsoft.Extensions.Caching.Memory; +using Microsoft.Extensions.Internal; using TvDbSharper; +using TvDbSharper.Dto; namespace MediaBrowser.Providers.TV { public sealed class TvDbClientManager { private static volatile TvDbClientManager instance; + // TODO add to DI once Bond's PR is merged + private static MemoryCache _cache; private static readonly object syncRoot = new object(); private static TvDbClient tvDbClient; private static DateTime tokenCreatedAt; @@ -30,7 +37,10 @@ namespace MediaBrowser.Providers.TV lock (syncRoot) { if (instance == null) + { instance = new TvDbClientManager(); + _cache = new MemoryCache(new MemoryCacheOptions()); + } } return instance; @@ -60,5 +70,27 @@ namespace MediaBrowser.Providers.TV return tvDbClient; } } + + public async Task GetSeriesByName(string name, CancellationToken cancellationToken) + { + if (_cache.TryGetValue(name, out SeriesSearchResult[] series)) + { + return series; + } + var result = await TvDbClient.Search.SearchSeriesByNameAsync(name, cancellationToken); + _cache.Set(name, result.Data, DateTimeOffset.UtcNow.AddHours(1)); + return result.Data; + } + + public async Task GetSeriesById(int tvdbId, CancellationToken cancellationToken) + { + if (_cache.TryGetValue(tvdbId, out Series series)) + { + return series; + } + var result = await TvDbClient.Series.GetAsync(tvdbId, cancellationToken); + _cache.Set(tvdbId, result.Data, DateTimeOffset.UtcNow.AddHours(1)); + return result.Data; + } } } diff --git a/MediaBrowser.Providers/TV/TheTVDB/TvdbSeriesProvider.cs b/MediaBrowser.Providers/TV/TheTVDB/TvdbSeriesProvider.cs index 25bea7821f..db7519b4eb 100644 --- a/MediaBrowser.Providers/TV/TheTVDB/TvdbSeriesProvider.cs +++ b/MediaBrowser.Providers/TV/TheTVDB/TvdbSeriesProvider.cs @@ -124,10 +124,10 @@ namespace MediaBrowser.Providers.TV.TheTVDB } // TODO call this function elsewhere? - var seriesResult = await _tvDbClientManager.TvDbClient.Series.GetAsync(Convert.ToInt32(tvdbId), cancellationToken); + var seriesResult = await _tvDbClientManager.GetSeriesById(Convert.ToInt32(tvdbId), cancellationToken); // TODO error handling - MapSeriesToResult(result, seriesResult.Data); + MapSeriesToResult(result, seriesResult); cancellationToken.ThrowIfCancellationRequested(); @@ -201,10 +201,10 @@ namespace MediaBrowser.Providers.TV.TheTVDB _tvDbClientManager.TvDbClient.AcceptedLanguage = NormalizeLanguage(language); var comparableName = GetComparableName(name); var list = new List, RemoteSearchResult>>(); - TvDbResponse result; + SeriesSearchResult[] result; try { - result = await _tvDbClientManager.TvDbClient.Search.SearchSeriesByNameAsync(comparableName, cancellationToken); + result = await _tvDbClientManager.GetSeriesByName(comparableName, cancellationToken); } catch (TvDbServerException e) { @@ -212,7 +212,7 @@ namespace MediaBrowser.Providers.TV.TheTVDB return new List(); } - foreach (var seriesSearchResult in result.Data) + foreach (var seriesSearchResult in result) { var tvdbTitles = new List { @@ -232,9 +232,9 @@ namespace MediaBrowser.Providers.TV.TheTVDB try { var seriesSesult = - await _tvDbClientManager.TvDbClient.Series.GetAsync(seriesSearchResult.Id, cancellationToken); - remoteSearchResult.SetProviderId(MetadataProviders.Imdb, seriesSesult.Data.ImdbId); - remoteSearchResult.SetProviderId(MetadataProviders.Zap2It, seriesSesult.Data.Zap2itId); + await _tvDbClientManager.GetSeriesById(seriesSearchResult.Id, cancellationToken); + remoteSearchResult.SetProviderId(MetadataProviders.Imdb, seriesSesult.ImdbId); + remoteSearchResult.SetProviderId(MetadataProviders.Zap2It, seriesSesult.Zap2itId); } catch (TvDbServerException e) {