2022-06-06 03:50:46 +00:00
|
|
|
using System;
|
2019-12-22 22:08:53 +00:00
|
|
|
using System.Collections.Generic;
|
2014-01-18 11:44:36 +00:00
|
|
|
using System.Linq;
|
|
|
|
using NLog;
|
2019-12-22 22:08:53 +00:00
|
|
|
using NzbDrone.Common.Cache;
|
2014-01-18 11:44:36 +00:00
|
|
|
using NzbDrone.Core.Lifecycle;
|
2022-06-06 03:50:46 +00:00
|
|
|
using NzbDrone.Core.Messaging.Commands;
|
2014-01-18 11:44:36 +00:00
|
|
|
using NzbDrone.Core.Messaging.Events;
|
2022-06-06 03:50:46 +00:00
|
|
|
using NzbDrone.Core.Qualities.Commands;
|
2014-01-18 11:44:36 +00:00
|
|
|
|
|
|
|
namespace NzbDrone.Core.Qualities
|
|
|
|
{
|
|
|
|
public interface IQualityDefinitionService
|
|
|
|
{
|
|
|
|
void Update(QualityDefinition qualityDefinition);
|
2019-09-09 03:27:33 +00:00
|
|
|
void UpdateMany(List<QualityDefinition> qualityDefinitions);
|
2014-01-18 11:44:36 +00:00
|
|
|
List<QualityDefinition> All();
|
2015-10-03 17:45:26 +00:00
|
|
|
QualityDefinition GetById(int id);
|
2014-01-18 11:44:36 +00:00
|
|
|
QualityDefinition Get(Quality quality);
|
|
|
|
}
|
|
|
|
|
2022-06-06 03:50:46 +00:00
|
|
|
public class QualityDefinitionService : IQualityDefinitionService, IExecute<ResetQualityDefinitionsCommand>, IHandle<ApplicationStartedEvent>
|
2014-01-18 11:44:36 +00:00
|
|
|
{
|
2014-12-09 03:27:33 +00:00
|
|
|
private readonly IQualityDefinitionRepository _repo;
|
2014-05-02 22:26:55 +00:00
|
|
|
private readonly ICached<Dictionary<Quality, QualityDefinition>> _cache;
|
2014-01-18 11:44:36 +00:00
|
|
|
private readonly Logger _logger;
|
|
|
|
|
2014-12-09 03:27:33 +00:00
|
|
|
public QualityDefinitionService(IQualityDefinitionRepository repo, ICacheManager cacheManager, Logger logger)
|
2014-01-18 11:44:36 +00:00
|
|
|
{
|
2014-12-09 03:27:33 +00:00
|
|
|
_repo = repo;
|
2019-12-22 22:08:53 +00:00
|
|
|
_cache = cacheManager.GetCache<Dictionary<Quality, QualityDefinition>>(GetType());
|
2014-01-18 11:44:36 +00:00
|
|
|
_logger = logger;
|
|
|
|
}
|
|
|
|
|
2014-05-02 22:26:55 +00:00
|
|
|
private Dictionary<Quality, QualityDefinition> GetAll()
|
|
|
|
{
|
2014-12-09 03:27:33 +00:00
|
|
|
return _cache.Get("all", () => _repo.All().Select(WithWeight).ToDictionary(v => v.Quality), TimeSpan.FromSeconds(5.0));
|
2014-05-02 22:26:55 +00:00
|
|
|
}
|
|
|
|
|
2014-01-18 11:44:36 +00:00
|
|
|
public void Update(QualityDefinition qualityDefinition)
|
|
|
|
{
|
2014-12-09 03:27:33 +00:00
|
|
|
_repo.Update(qualityDefinition);
|
2014-05-02 22:26:55 +00:00
|
|
|
|
|
|
|
_cache.Clear();
|
2014-01-18 11:44:36 +00:00
|
|
|
}
|
|
|
|
|
2019-09-09 03:27:33 +00:00
|
|
|
public void UpdateMany(List<QualityDefinition> qualityDefinitions)
|
|
|
|
{
|
|
|
|
_repo.UpdateMany(qualityDefinitions);
|
|
|
|
}
|
|
|
|
|
2014-01-18 11:44:36 +00:00
|
|
|
public List<QualityDefinition> All()
|
|
|
|
{
|
2014-12-09 03:27:33 +00:00
|
|
|
return GetAll().Values.OrderBy(d => d.Weight).ToList();
|
2014-01-18 11:44:36 +00:00
|
|
|
}
|
2014-09-24 19:08:37 +00:00
|
|
|
|
2015-10-03 17:45:26 +00:00
|
|
|
public QualityDefinition GetById(int id)
|
2014-09-24 19:08:37 +00:00
|
|
|
{
|
|
|
|
return GetAll().Values.Single(v => v.Id == id);
|
|
|
|
}
|
2018-08-05 14:28:05 +00:00
|
|
|
|
2014-01-18 11:44:36 +00:00
|
|
|
public QualityDefinition Get(Quality quality)
|
|
|
|
{
|
2014-05-02 22:26:55 +00:00
|
|
|
return GetAll()[quality];
|
2014-01-18 11:44:36 +00:00
|
|
|
}
|
2018-08-05 14:28:05 +00:00
|
|
|
|
2014-12-09 03:27:33 +00:00
|
|
|
private void InsertMissingDefinitions()
|
2014-01-18 11:44:36 +00:00
|
|
|
{
|
2023-05-23 10:52:39 +00:00
|
|
|
var insertList = new List<QualityDefinition>();
|
|
|
|
var updateList = new List<QualityDefinition>();
|
2018-08-05 14:28:05 +00:00
|
|
|
|
2014-12-09 03:27:33 +00:00
|
|
|
var allDefinitions = Quality.DefaultQualityDefinitions.OrderBy(d => d.Weight).ToList();
|
|
|
|
var existingDefinitions = _repo.All().ToList();
|
2014-01-18 11:44:36 +00:00
|
|
|
|
2014-12-09 03:27:33 +00:00
|
|
|
foreach (var definition in allDefinitions)
|
2014-01-18 11:44:36 +00:00
|
|
|
{
|
2014-12-09 03:27:33 +00:00
|
|
|
var existing = existingDefinitions.SingleOrDefault(d => d.Quality == definition.Quality);
|
2014-01-18 11:44:36 +00:00
|
|
|
|
2014-12-09 03:27:33 +00:00
|
|
|
if (existing == null)
|
2014-01-18 11:44:36 +00:00
|
|
|
{
|
2014-12-09 03:27:33 +00:00
|
|
|
insertList.Add(definition);
|
2014-01-18 11:44:36 +00:00
|
|
|
}
|
2014-12-09 03:27:33 +00:00
|
|
|
else
|
2014-01-18 11:44:36 +00:00
|
|
|
{
|
2014-12-09 03:27:33 +00:00
|
|
|
updateList.Add(existing);
|
|
|
|
existingDefinitions.Remove(existing);
|
2014-01-18 11:44:36 +00:00
|
|
|
}
|
|
|
|
}
|
2014-05-02 22:26:55 +00:00
|
|
|
|
2014-12-09 03:27:33 +00:00
|
|
|
_repo.InsertMany(insertList);
|
|
|
|
_repo.UpdateMany(updateList);
|
|
|
|
_repo.DeleteMany(existingDefinitions);
|
2018-08-05 14:28:05 +00:00
|
|
|
|
2014-05-02 22:26:55 +00:00
|
|
|
_cache.Clear();
|
2014-01-18 11:44:36 +00:00
|
|
|
}
|
|
|
|
|
2014-12-09 03:27:33 +00:00
|
|
|
private static QualityDefinition WithWeight(QualityDefinition definition)
|
|
|
|
{
|
|
|
|
definition.Weight = Quality.DefaultQualityDefinitions.Single(d => d.Quality == definition.Quality).Weight;
|
|
|
|
|
|
|
|
return definition;
|
|
|
|
}
|
|
|
|
|
2014-01-18 11:44:36 +00:00
|
|
|
public void Handle(ApplicationStartedEvent message)
|
2014-05-02 22:26:55 +00:00
|
|
|
{
|
2014-01-18 11:44:36 +00:00
|
|
|
_logger.Debug("Setting up default quality config");
|
|
|
|
|
2014-12-09 03:27:33 +00:00
|
|
|
InsertMissingDefinitions();
|
2014-01-18 11:44:36 +00:00
|
|
|
}
|
2022-06-06 03:50:46 +00:00
|
|
|
|
|
|
|
public void Execute(ResetQualityDefinitionsCommand message)
|
|
|
|
{
|
2023-05-23 10:52:39 +00:00
|
|
|
var updateList = new List<QualityDefinition>();
|
2022-06-06 03:50:46 +00:00
|
|
|
|
|
|
|
var allDefinitions = Quality.DefaultQualityDefinitions.OrderBy(d => d.Weight).ToList();
|
|
|
|
var existingDefinitions = _repo.All().ToList();
|
|
|
|
|
|
|
|
foreach (var definition in allDefinitions)
|
|
|
|
{
|
|
|
|
var existing = existingDefinitions.SingleOrDefault(d => d.Quality == definition.Quality);
|
|
|
|
|
|
|
|
existing.MinSize = definition.MinSize;
|
|
|
|
existing.MaxSize = definition.MaxSize;
|
2023-07-30 16:45:50 +00:00
|
|
|
existing.PreferredSize = definition.PreferredSize;
|
2022-06-06 03:50:46 +00:00
|
|
|
existing.Title = message.ResetTitles ? definition.Title : existing.Title;
|
|
|
|
|
|
|
|
updateList.Add(existing);
|
|
|
|
}
|
|
|
|
|
|
|
|
_repo.UpdateMany(updateList);
|
|
|
|
|
|
|
|
_cache.Clear();
|
|
|
|
}
|
2014-01-18 11:44:36 +00:00
|
|
|
}
|
|
|
|
}
|