1
0
mirror of https://github.com/Sonarr/Sonarr.git synced 2024-12-23 02:05:27 +02:00
Sonarr/NzbDrone.Core/Indexers/IndexerService.cs

193 lines
6.0 KiB
C#
Raw Normal View History

using System;
using System.Collections.Generic;
2013-02-21 10:07:34 +03:00
using System.Linq;
using NLog;
2013-05-29 03:44:29 +03:00
using NzbDrone.Common.Serializer;
using NzbDrone.Core.Configuration;
2013-05-28 03:19:07 +03:00
using NzbDrone.Core.Indexers.Newznab;
2013-02-21 19:38:31 +03:00
using NzbDrone.Core.Lifecycle;
2013-09-11 09:33:47 +03:00
using NzbDrone.Core.Messaging;
using NzbDrone.Core.Messaging.Events;
using Omu.ValueInjecter;
2013-03-02 21:25:39 +03:00
2013-02-21 10:07:34 +03:00
namespace NzbDrone.Core.Indexers
{
public class Indexer
{
2013-05-03 02:06:08 +03:00
public int Id { get; set; }
public string Name { get; set; }
public bool Enable { get; set; }
public IIndexerSetting Settings { get; set; }
public IIndexer Instance { get; set; }
2013-05-29 03:44:29 +03:00
public string Implementation { get; set; }
}
2013-02-21 10:07:34 +03:00
public interface IIndexerService
{
List<Indexer> All();
List<IIndexer> GetAvailableIndexers();
Indexer Get(int id);
Indexer Get(string name);
2013-05-28 03:19:07 +03:00
List<Indexer> Schema();
2013-05-29 03:44:29 +03:00
Indexer Create(Indexer indexer);
Indexer Update(Indexer indexer);
2013-06-27 10:37:39 +03:00
void Delete(int id);
2013-02-21 10:07:34 +03:00
}
public class IndexerService : IIndexerService, IHandle<ApplicationStartedEvent>
2013-02-21 10:07:34 +03:00
{
private readonly IIndexerRepository _indexerRepository;
private readonly IConfigFileProvider _configFileProvider;
2013-02-21 19:38:31 +03:00
private readonly Logger _logger;
2013-02-21 10:07:34 +03:00
2013-05-03 07:37:08 +03:00
private readonly List<IIndexer> _indexers;
2013-02-21 10:07:34 +03:00
public IndexerService(IIndexerRepository indexerRepository, IEnumerable<IIndexer> indexers, IConfigFileProvider configFileProvider, Logger logger)
2013-02-21 10:07:34 +03:00
{
_indexerRepository = indexerRepository;
_configFileProvider = configFileProvider;
2013-02-21 19:38:31 +03:00
_logger = logger;
if (!configFileProvider.Torrent)
{
_indexers = indexers.Where(c => c.Kind != IndexerKind.Torrent).ToList();
}
else
{
_indexers = indexers.ToList();
}
2013-02-21 19:38:31 +03:00
}
public List<Indexer> All()
2013-02-21 10:07:34 +03:00
{
return _indexerRepository.All().Select(ToIndexer).ToList();
2013-02-21 10:07:34 +03:00
}
public List<IIndexer> GetAvailableIndexers()
2013-02-21 10:07:34 +03:00
{
2013-08-22 11:08:43 +03:00
return All().Where(c => c.Enable && c.Settings.Validate().IsValid).Select(c => c.Instance).ToList();
}
2013-04-07 10:30:37 +03:00
public Indexer Get(int id)
{
return ToIndexer(_indexerRepository.Get(id));
}
public Indexer Get(string name)
{
return ToIndexer(_indexerRepository.Get(name));
2013-02-21 10:07:34 +03:00
}
2013-05-28 03:19:07 +03:00
public List<Indexer> Schema()
{
var indexers = new List<Indexer>();
var newznab = new Indexer();
newznab.Instance = new Newznab.Newznab();
newznab.Id = 1;
newznab.Name = "Newznab";
newznab.Settings = new NewznabSettings();
2013-05-29 03:44:29 +03:00
newznab.Implementation = "Newznab";
2013-05-28 03:19:07 +03:00
indexers.Add(newznab);
2013-05-28 18:06:36 +03:00
return indexers;
2013-05-28 03:19:07 +03:00
}
2013-05-29 03:44:29 +03:00
public Indexer Create(Indexer indexer)
{
var definition = new IndexerDefinition
{
Name = indexer.Name,
Enable = indexer.Enable,
Implementation = indexer.Implementation,
Settings = indexer.Settings.ToJson()
2013-05-29 03:44:29 +03:00
};
definition = _indexerRepository.Insert(definition);
indexer.Id = definition.Id;
return indexer;
}
public Indexer Update(Indexer indexer)
{
var definition = _indexerRepository.Get(indexer.Id);
definition.InjectFrom(indexer);
definition.Settings = indexer.Settings.ToJson();
_indexerRepository.Update(definition);
return indexer;
}
2013-06-27 10:37:39 +03:00
public void Delete(int id)
{
_indexerRepository.Delete(id);
}
private Indexer ToIndexer(IndexerDefinition definition)
2013-02-21 10:07:34 +03:00
{
var indexer = new Indexer();
2013-05-03 02:06:08 +03:00
indexer.Id = definition.Id;
indexer.Enable = definition.Enable;
indexer.Instance = GetInstance(definition);
indexer.Name = definition.Name;
2013-05-29 03:44:29 +03:00
indexer.Implementation = definition.Implementation;
if (indexer.Instance.GetType().GetMethod("ImportSettingsFromJson") != null)
{
indexer.Settings = ((dynamic)indexer.Instance).ImportSettingsFromJson(definition.Settings);
}
else
{
indexer.Settings = NullSetting.Instance;
}
return indexer;
2013-02-21 10:07:34 +03:00
}
private IIndexer GetInstance(IndexerDefinition indexerDefinition)
2013-02-21 10:07:34 +03:00
{
2013-06-28 03:05:09 +03:00
var type = GetImplementation(indexerDefinition);
2013-05-03 07:37:08 +03:00
var instance = (IIndexer)Activator.CreateInstance(type);
instance.InstanceDefinition = indexerDefinition;
return instance;
2013-02-21 10:07:34 +03:00
}
2013-06-28 03:05:09 +03:00
private Type GetImplementation(IndexerDefinition indexerDefinition)
{
return _indexers.Select(c => c.GetType()).SingleOrDefault(c => c.Name.Equals(indexerDefinition.Implementation, StringComparison.InvariantCultureIgnoreCase));
}
public void Handle(ApplicationStartedEvent message)
{
_logger.Debug("Initializing indexers. Count {0}", _indexers.Count);
2013-06-28 03:05:09 +03:00
RemoveMissingImplementations();
2013-09-14 02:17:58 +03:00
var definitions = _indexers.SelectMany(indexer => indexer.DefaultDefinitions);
var currentIndexer = All();
var newIndexers = definitions.Where(def => currentIndexer.All(c => c.Implementation != def.Implementation)).ToList();
if (newIndexers.Any())
{
2013-09-14 02:17:58 +03:00
_indexerRepository.InsertMany(newIndexers);
}
}
2013-06-28 03:05:09 +03:00
private void RemoveMissingImplementations()
{
var storedIndexers = _indexerRepository.All();
foreach (var indexerDefinition in storedIndexers.Where(i => GetImplementation(i) == null))
{
_logger.Debug("Removing Indexer {0} ", indexerDefinition.Name);
_indexerRepository.Delete(indexerDefinition);
}
}
2013-02-21 10:07:34 +03:00
}
}