Add caching PoC

pull/776/head
Claus Vium 5 years ago
parent ecbc0538f6
commit 75d90c8e4c

@ -11,6 +11,7 @@
</ItemGroup>
<ItemGroup>
<PackageReference Include="Microsoft.Extensions.Caching.Memory" Version="2.2.0" />
<PackageReference Include="PlaylistsNET" Version="1.0.2" />
<PackageReference Include="TvDbSharper" Version="2.0.0" />
</ItemGroup>

@ -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<SeriesSearchResult[]> 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<Series> 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;
}
}
}

@ -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<Tuple<List<string>, RemoteSearchResult>>();
TvDbResponse<SeriesSearchResult[]> 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<RemoteSearchResult>();
}
foreach (var seriesSearchResult in result.Data)
foreach (var seriesSearchResult in result)
{
var tvdbTitles = new List<string>
{
@ -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)
{

Loading…
Cancel
Save