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)
{