Radarr/src/NzbDrone.Core/Notifications/Xbmc/XbmcService.cs

125 lines
4.2 KiB
C#
Raw Normal View History

2013-06-12 06:45:25 +00:00
using System;
using System.Collections.Generic;
using System.Linq;
using FluentValidation.Results;
2013-06-12 06:45:25 +00:00
using Newtonsoft.Json.Linq;
using NLog;
using NzbDrone.Common.Cache;
using NzbDrone.Common.Serializer;
2013-09-19 01:09:26 +00:00
using NzbDrone.Core.Notifications.Xbmc.Model;
using NzbDrone.Core.Movies;
2013-06-12 06:45:25 +00:00
namespace NzbDrone.Core.Notifications.Xbmc
{
public interface IXbmcService
{
void Notify(XbmcSettings settings, string title, string message);
void UpdateMovie(XbmcSettings settings, Movie movie);
2013-06-12 06:45:25 +00:00
void Clean(XbmcSettings settings);
2015-04-25 16:02:17 +00:00
ValidationFailure Test(XbmcSettings settings, string message);
2013-06-12 06:45:25 +00:00
}
public class XbmcService : IXbmcService
2013-06-12 06:45:25 +00:00
{
private readonly IXbmcJsonApiProxy _proxy;
2013-06-12 06:45:25 +00:00
private readonly IEnumerable<IApiProvider> _apiProviders;
private readonly Logger _logger;
2013-06-12 06:45:25 +00:00
private readonly ICached<XbmcVersion> _xbmcVersionCache;
public XbmcService(IXbmcJsonApiProxy proxy,
IEnumerable<IApiProvider> apiProviders,
ICacheManager cacheManager,
Logger logger)
2013-06-12 06:45:25 +00:00
{
_proxy = proxy;
2013-06-12 06:45:25 +00:00
_apiProviders = apiProviders;
_logger = logger;
_xbmcVersionCache = cacheManager.GetCache<XbmcVersion>(GetType());
2013-06-12 06:45:25 +00:00
}
public void Notify(XbmcSettings settings, string title, string message)
{
var provider = GetApiProvider(settings);
provider.Notify(settings, title, message);
}
public void UpdateMovie(XbmcSettings settings, Movie movie)
{
var provider = GetApiProvider(settings);
provider.UpdateMovie(settings, movie);
}
2013-06-12 06:45:25 +00:00
public void Clean(XbmcSettings settings)
{
var provider = GetApiProvider(settings);
provider.Clean(settings);
}
2014-10-03 23:29:52 +00:00
private XbmcVersion GetJsonVersion(XbmcSettings settings)
2013-06-12 06:45:25 +00:00
{
return _xbmcVersionCache.Get(settings.Address, () =>
2013-06-12 06:45:25 +00:00
{
var response = _proxy.GetJsonVersion(settings);
2013-06-12 06:45:25 +00:00
_logger.Debug("Getting version from response: " + response);
var result = Json.Deserialize<XbmcJsonResult<JObject>>(response);
2013-06-12 06:45:25 +00:00
var versionObject = result.Result.Property("version");
if (versionObject.Value.Type == JTokenType.Integer)
{
return new XbmcVersion((int)versionObject.Value);
}
2013-06-12 06:45:25 +00:00
if (versionObject.Value.Type == JTokenType.Object)
{
return Json.Deserialize<XbmcVersion>(versionObject.Value.ToString());
}
2013-06-12 06:45:25 +00:00
throw new InvalidCastException("Unknown Version structure!: " + versionObject);
}, TimeSpan.FromHours(12));
2013-06-12 06:45:25 +00:00
}
private IApiProvider GetApiProvider(XbmcSettings settings)
{
var version = GetJsonVersion(settings);
var apiProvider = _apiProviders.SingleOrDefault(a => a.CanHandle(version));
if (apiProvider == null)
{
var message = string.Format("Invalid API Version: {0} for {1}", version, settings.Address);
2013-06-12 06:45:25 +00:00
throw new InvalidXbmcVersionException(message);
}
return apiProvider;
}
2015-04-25 16:02:17 +00:00
public ValidationFailure Test(XbmcSettings settings, string message)
2013-06-12 06:45:25 +00:00
{
_xbmcVersionCache.Clear();
try
{
2015-04-25 16:02:17 +00:00
_logger.Debug("Determining version of Host: {0}", settings.Address);
var version = GetJsonVersion(settings);
_logger.Debug("Version is: {0}", version);
2013-06-12 06:45:25 +00:00
if (version == new XbmcVersion(0))
{
throw new InvalidXbmcVersionException("Version received from XBMC is invalid, please correct your settings.");
}
2015-04-25 16:02:17 +00:00
Notify(settings, "Test Notification", message);
}
catch (Exception ex)
2013-06-13 02:55:11 +00:00
{
_logger.Error(ex, "Unable to send test message");
return new ValidationFailure("Host", "Unable to send test message");
2013-06-13 02:55:11 +00:00
}
return null;
2013-06-12 06:45:25 +00:00
}
}
}