You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
Lidarr/NzbDrone.Core/DataAugmentation/Scene/SceneMappingService.cs

114 lines
3.3 KiB

12 years ago
using System;
using System.Linq;
12 years ago
using NLog;
using NzbDrone.Common.Cache;
using NzbDrone.Common.Messaging;
12 years ago
using NzbDrone.Core.Lifecycle;
namespace NzbDrone.Core.DataAugmentation.Scene
12 years ago
{
public interface ISceneMappingService
{
string GetSceneName(int tvdbId, int seasonNumber = -1);
Nullable<int> GetTvDbId(string cleanName);
}
public class SceneMappingService : ISceneMappingService,
IHandleAsync<ApplicationStartedEvent>,
IExecute<UpdateSceneMappingCommand>
12 years ago
{
private static readonly object mutex = new object();
12 years ago
private readonly ISceneMappingRepository _repository;
private readonly ISceneMappingProxy _sceneMappingProxy;
private readonly Logger _logger;
private readonly ICached<SceneMapping> _getSceneNameCache;
private readonly ICached<SceneMapping> _gettvdbIdCache;
12 years ago
public SceneMappingService(ISceneMappingRepository repository, ISceneMappingProxy sceneMappingProxy, ICacheManger cacheManger, Logger logger)
12 years ago
{
_repository = repository;
_sceneMappingProxy = sceneMappingProxy;
_getSceneNameCache = cacheManger.GetCache<SceneMapping>(GetType(), "scene_name");
_gettvdbIdCache = cacheManger.GetCache<SceneMapping>(GetType(), "tvdb_id");
12 years ago
_logger = logger;
}
public string GetSceneName(int tvdbId, int seasonNumber = -1)
12 years ago
{
lock (mutex)
{
var mapping = _getSceneNameCache.Find(tvdbId.ToString());
12 years ago
if (mapping == null) return null;
12 years ago
return mapping.SceneName;
}
12 years ago
}
public Nullable<Int32> GetTvDbId(string cleanName)
12 years ago
{
lock (mutex)
{
var mapping = _gettvdbIdCache.Find(cleanName);
12 years ago
if (mapping == null)
return null;
12 years ago
return mapping.TvdbId;
}
12 years ago
}
public void HandleAsync(ApplicationStartedEvent message)
12 years ago
{
if (!_repository.HasItems())
{
UpdateMappings();
}
}
private void UpdateMappings()
{
try
{
var mappings = _sceneMappingProxy.Fetch();
lock (mutex)
{
if (mappings.Any())
{
_repository.Purge();
_repository.InsertMany(mappings);
_gettvdbIdCache.Clear();
_getSceneNameCache.Clear();
foreach (var sceneMapping in mappings)
{
_getSceneNameCache.Set(sceneMapping.TvdbId.ToString(), sceneMapping);
_gettvdbIdCache.Set(sceneMapping.CleanTitle, sceneMapping);
}
}
else
{
_logger.Warn("Received empty list of mapping. will not update.");
}
}
}
catch (Exception ex)
{
_logger.ErrorException("Failed to Update Scene Mappings:", ex);
}
}
public void Execute(UpdateSceneMappingCommand message)
{
UpdateMappings();
}
12 years ago
}
}