- Shares same syntax as Radarr - Only Sonarr impacted - Default behavior of `preferred_ratio` changed. - Hybrid quality definition removed.pull/151/head
parent
ab352f6a4c
commit
bbb2195df2
@ -1,8 +1,10 @@
|
||||
using TrashLib.Services.CustomFormat.Models;
|
||||
using TrashLib.Services.QualitySize;
|
||||
|
||||
namespace TrashLib.Services.Common;
|
||||
|
||||
public interface IGuideService
|
||||
{
|
||||
ICollection<CustomFormatData> GetCustomFormatData();
|
||||
ICollection<QualitySizeData> GetQualities();
|
||||
}
|
||||
|
@ -0,0 +1,7 @@
|
||||
namespace TrashLib.Services.QualitySize.Api;
|
||||
|
||||
public interface IQualityDefinitionService
|
||||
{
|
||||
Task<List<ServiceQualityDefinitionItem>> GetQualityDefinition();
|
||||
Task<IList<ServiceQualityDefinitionItem>> UpdateQualityDefinition(IList<ServiceQualityDefinitionItem> newQuality);
|
||||
}
|
@ -1,7 +1,7 @@
|
||||
using System.Globalization;
|
||||
using System.Text;
|
||||
|
||||
namespace TrashLib.Services.Common.QualityDefinition;
|
||||
namespace TrashLib.Services.QualitySize.Guide;
|
||||
|
||||
public class QualityItem
|
||||
{
|
@ -0,0 +1,9 @@
|
||||
using TrashLib.Config.Services;
|
||||
using TrashLib.Services.Common;
|
||||
|
||||
namespace TrashLib.Services.QualitySize;
|
||||
|
||||
public interface IQualitySizeUpdater
|
||||
{
|
||||
Task Process(bool isPreview, QualityDefinitionConfig config, IGuideService guideService);
|
||||
}
|
@ -0,0 +1,8 @@
|
||||
namespace TrashLib.Services.QualitySize;
|
||||
|
||||
public record QualitySizeData(
|
||||
// ReSharper disable once NotAccessedPositionalProperty.Global
|
||||
string TrashId,
|
||||
string Type,
|
||||
IReadOnlyCollection<QualitySizeItem> Qualities
|
||||
);
|
@ -1,10 +1,10 @@
|
||||
using TrashLib.Services.Common.QualityDefinition;
|
||||
using TrashLib.Services.QualitySize.Guide;
|
||||
|
||||
namespace TrashLib.Services.Radarr.QualityDefinition;
|
||||
namespace TrashLib.Services.QualitySize;
|
||||
|
||||
public class RadarrQualityItem : QualityItem
|
||||
public class QualitySizeItem : QualityItem
|
||||
{
|
||||
public RadarrQualityItem(string quality, decimal min, decimal max, decimal preferred)
|
||||
public QualitySizeItem(string quality, decimal min, decimal max, decimal preferred)
|
||||
: base(quality, min, max)
|
||||
{
|
||||
Preferred = preferred;
|
@ -0,0 +1,127 @@
|
||||
using CliFx.Infrastructure;
|
||||
using Common.Extensions;
|
||||
using Serilog;
|
||||
using TrashLib.Config.Services;
|
||||
using TrashLib.Services.Common;
|
||||
using TrashLib.Services.QualitySize.Api;
|
||||
|
||||
namespace TrashLib.Services.QualitySize;
|
||||
|
||||
internal class QualitySizeUpdater : IQualitySizeUpdater
|
||||
{
|
||||
private readonly ILogger _log;
|
||||
private readonly IQualityDefinitionService _api;
|
||||
private readonly IConsole _console;
|
||||
|
||||
public QualitySizeUpdater(
|
||||
ILogger logger,
|
||||
IQualityDefinitionService api,
|
||||
IConsole console)
|
||||
{
|
||||
_log = logger;
|
||||
_api = api;
|
||||
_console = console;
|
||||
}
|
||||
|
||||
public async Task Process(bool isPreview, QualityDefinitionConfig config, IGuideService guideService)
|
||||
{
|
||||
_log.Information("Processing Quality Definition: {QualityDefinition}", config.Type);
|
||||
var qualityDefinitions = guideService.GetQualities();
|
||||
var qualityTypeInConfig = config.Type;
|
||||
|
||||
var selectedQuality = qualityDefinitions
|
||||
.FirstOrDefault(x => x.Type.EqualsIgnoreCase(qualityTypeInConfig));
|
||||
|
||||
if (selectedQuality == null)
|
||||
{
|
||||
_log.Error("The specified quality definition type does not exist: {Type}", qualityTypeInConfig);
|
||||
return;
|
||||
}
|
||||
|
||||
if (config.PreferredRatio is not null)
|
||||
{
|
||||
_log.Information("Using an explicit preferred ratio which will override values from the guide");
|
||||
|
||||
// Fix an out of range ratio and warn the user
|
||||
if (config.PreferredRatio is < 0 or > 1)
|
||||
{
|
||||
var clampedRatio = Math.Clamp(config.PreferredRatio.Value, 0, 1);
|
||||
_log.Warning("Your `preferred_ratio` of {CurrentRatio} is out of range. " +
|
||||
"It must be a decimal between 0.0 and 1.0. It has been clamped to {ClampedRatio}",
|
||||
config.PreferredRatio, clampedRatio);
|
||||
|
||||
config.PreferredRatio = clampedRatio;
|
||||
}
|
||||
|
||||
// Apply a calculated preferred size
|
||||
foreach (var quality in selectedQuality.Qualities)
|
||||
{
|
||||
quality.Preferred = quality.InterpolatedPreferred(config.PreferredRatio.Value);
|
||||
}
|
||||
}
|
||||
|
||||
if (isPreview)
|
||||
{
|
||||
PrintQualityPreview(selectedQuality.Qualities);
|
||||
return;
|
||||
}
|
||||
|
||||
await ProcessQualityDefinition(selectedQuality.Qualities);
|
||||
}
|
||||
|
||||
private void PrintQualityPreview(IReadOnlyCollection<QualitySizeItem> quality)
|
||||
{
|
||||
_console.Output.WriteLine("");
|
||||
const string format = "{0,-20} {1,-10} {2,-15} {3,-15}";
|
||||
_console.Output.WriteLine(format, "Quality", "Min", "Max", "Preferred");
|
||||
_console.Output.WriteLine(format, "-------", "---", "---", "---------");
|
||||
|
||||
foreach (var q in quality)
|
||||
{
|
||||
_console.Output.WriteLine(format, q.Quality, q.AnnotatedMin, q.AnnotatedMax, q.AnnotatedPreferred);
|
||||
}
|
||||
|
||||
_console.Output.WriteLine("");
|
||||
}
|
||||
|
||||
private static bool QualityIsDifferent(ServiceQualityDefinitionItem a, QualitySizeItem b)
|
||||
{
|
||||
return b.IsMinDifferent(a.MinSize) || b.IsMaxDifferent(a.MaxSize) ||
|
||||
a.PreferredSize is not null && b.IsPreferredDifferent(a.PreferredSize);
|
||||
}
|
||||
|
||||
private async Task ProcessQualityDefinition(IReadOnlyCollection<QualitySizeItem> guideQuality)
|
||||
{
|
||||
var serverQuality = await _api.GetQualityDefinition();
|
||||
|
||||
var newQuality = new List<ServiceQualityDefinitionItem>();
|
||||
foreach (var qualityData in guideQuality)
|
||||
{
|
||||
var serverEntry = serverQuality.FirstOrDefault(q => q.Quality?.Name == qualityData.Quality);
|
||||
if (serverEntry == null)
|
||||
{
|
||||
_log.Warning("Server lacks quality definition for {Quality}; it will be skipped", qualityData.Quality);
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!QualityIsDifferent(serverEntry, qualityData))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
// Not using the original list again, so it's OK to modify the definition ref type objects in-place.
|
||||
serverEntry.MinSize = qualityData.MinForApi;
|
||||
serverEntry.MaxSize = qualityData.MaxForApi;
|
||||
serverEntry.PreferredSize = qualityData.PreferredForApi;
|
||||
newQuality.Add(serverEntry);
|
||||
|
||||
_log.Debug("Setting Quality " +
|
||||
"[Name: {Name}] [Source: {Source}] [Min: {Min}] [Max: {Max}] [Preferred: {Preferred}]",
|
||||
serverEntry.Quality?.Name, serverEntry.Quality?.Source, serverEntry.MinSize, serverEntry.MaxSize,
|
||||
serverEntry.PreferredSize);
|
||||
}
|
||||
|
||||
await _api.UpdateQualityDefinition(newQuality);
|
||||
_log.Information("Number of updated qualities: {Count}", newQuality.Count);
|
||||
}
|
||||
}
|
@ -1,9 +1,7 @@
|
||||
using TrashLib.Services.Common;
|
||||
using TrashLib.Services.Radarr.QualityDefinition;
|
||||
|
||||
namespace TrashLib.Services.Radarr;
|
||||
|
||||
public interface IRadarrGuideService : IGuideService
|
||||
{
|
||||
ICollection<RadarrQualityData> GetQualities();
|
||||
}
|
||||
|
@ -1,9 +0,0 @@
|
||||
using TrashLib.Services.Radarr.QualityDefinition.Api.Objects;
|
||||
|
||||
namespace TrashLib.Services.Radarr.QualityDefinition.Api;
|
||||
|
||||
public interface IQualityDefinitionService
|
||||
{
|
||||
Task<List<RadarrQualityDefinitionItem>> GetQualityDefinition();
|
||||
Task<IList<RadarrQualityDefinitionItem>> UpdateQualityDefinition(IList<RadarrQualityDefinitionItem> newQuality);
|
||||
}
|
@ -1,8 +0,0 @@
|
||||
using TrashLib.Services.Radarr.Config;
|
||||
|
||||
namespace TrashLib.Services.Radarr.QualityDefinition;
|
||||
|
||||
public interface IRadarrQualityDefinitionUpdater
|
||||
{
|
||||
Task Process(bool isPreview, RadarrConfiguration config);
|
||||
}
|
@ -1,8 +0,0 @@
|
||||
namespace TrashLib.Services.Radarr.QualityDefinition;
|
||||
|
||||
public record RadarrQualityData(
|
||||
// ReSharper disable once NotAccessedPositionalProperty.Global
|
||||
string TrashId,
|
||||
string Type,
|
||||
IReadOnlyCollection<RadarrQualityItem> Qualities
|
||||
);
|
@ -1,130 +0,0 @@
|
||||
using CliFx.Infrastructure;
|
||||
using Common.Extensions;
|
||||
using Serilog;
|
||||
using TrashLib.Services.Radarr.Config;
|
||||
using TrashLib.Services.Radarr.QualityDefinition.Api;
|
||||
using TrashLib.Services.Radarr.QualityDefinition.Api.Objects;
|
||||
|
||||
namespace TrashLib.Services.Radarr.QualityDefinition;
|
||||
|
||||
internal class RadarrQualityDefinitionUpdater : IRadarrQualityDefinitionUpdater
|
||||
{
|
||||
private readonly ILogger _log;
|
||||
private readonly IQualityDefinitionService _api;
|
||||
private readonly IConsole _console;
|
||||
private readonly IRadarrGuideService _guide;
|
||||
|
||||
public RadarrQualityDefinitionUpdater(
|
||||
ILogger logger,
|
||||
IRadarrGuideService guide,
|
||||
IQualityDefinitionService api,
|
||||
IConsole console)
|
||||
{
|
||||
_log = logger;
|
||||
_guide = guide;
|
||||
_api = api;
|
||||
_console = console;
|
||||
}
|
||||
|
||||
public async Task Process(bool isPreview, RadarrConfiguration config)
|
||||
{
|
||||
_log.Information("Processing Quality Definition: {QualityDefinition}", config.QualityDefinition!.Type);
|
||||
var qualityDefinitions = _guide.GetQualities();
|
||||
var qualityTypeInConfig = config.QualityDefinition!.Type;
|
||||
|
||||
var selectedQuality = qualityDefinitions
|
||||
.FirstOrDefault(x => x.Type.EqualsIgnoreCase(qualityTypeInConfig));
|
||||
|
||||
if (selectedQuality == null)
|
||||
{
|
||||
_log.Error("The specified quality definition type does not exist: {Type}", qualityTypeInConfig);
|
||||
return;
|
||||
}
|
||||
|
||||
// Fix an out of range ratio and warn the user
|
||||
if (config.QualityDefinition.PreferredRatio is < 0 or > 1)
|
||||
{
|
||||
var clampedRatio = Math.Clamp(config.QualityDefinition.PreferredRatio, 0, 1);
|
||||
_log.Warning("Your `preferred_ratio` of {CurrentRatio} is out of range. " +
|
||||
"It must be a decimal between 0.0 and 1.0. It has been clamped to {ClampedRatio}",
|
||||
config.QualityDefinition.PreferredRatio, clampedRatio);
|
||||
|
||||
config.QualityDefinition.PreferredRatio = clampedRatio;
|
||||
}
|
||||
|
||||
// Apply a calculated preferred size
|
||||
foreach (var quality in selectedQuality.Qualities)
|
||||
{
|
||||
quality.Preferred = quality.InterpolatedPreferred(config.QualityDefinition.PreferredRatio);
|
||||
}
|
||||
|
||||
if (isPreview)
|
||||
{
|
||||
PrintQualityPreview(selectedQuality.Qualities);
|
||||
return;
|
||||
}
|
||||
|
||||
await ProcessQualityDefinition(selectedQuality.Qualities);
|
||||
}
|
||||
|
||||
private void PrintQualityPreview(IEnumerable<RadarrQualityItem> quality)
|
||||
{
|
||||
_console.Output.WriteLine("");
|
||||
const string format = "{0,-20} {1,-10} {2,-15} {3,-15}";
|
||||
_console.Output.WriteLine(format, "Quality", "Min", "Max", "Preferred");
|
||||
_console.Output.WriteLine(format, "-------", "---", "---", "---------");
|
||||
|
||||
foreach (var q in quality)
|
||||
{
|
||||
_console.Output.WriteLine(format, q.Quality, q.AnnotatedMin, q.AnnotatedMax, q.AnnotatedPreferred);
|
||||
}
|
||||
|
||||
_console.Output.WriteLine("");
|
||||
}
|
||||
|
||||
private async Task ProcessQualityDefinition(IEnumerable<RadarrQualityItem> guideQuality)
|
||||
{
|
||||
var serverQuality = await _api.GetQualityDefinition();
|
||||
await UpdateQualityDefinition(serverQuality, guideQuality);
|
||||
}
|
||||
|
||||
private async Task UpdateQualityDefinition(IReadOnlyCollection<RadarrQualityDefinitionItem> serverQuality,
|
||||
IEnumerable<RadarrQualityItem> guideQuality)
|
||||
{
|
||||
static bool QualityIsDifferent(RadarrQualityDefinitionItem a, RadarrQualityItem b)
|
||||
{
|
||||
return b.IsMinDifferent(a.MinSize) ||
|
||||
b.IsMaxDifferent(a.MaxSize) ||
|
||||
b.IsPreferredDifferent(a.PreferredSize);
|
||||
}
|
||||
|
||||
var newQuality = new List<RadarrQualityDefinitionItem>();
|
||||
foreach (var qualityData in guideQuality)
|
||||
{
|
||||
var entry = serverQuality.FirstOrDefault(q => q.Quality?.Name == qualityData.Quality);
|
||||
if (entry == null)
|
||||
{
|
||||
_log.Warning("Server lacks quality definition for {Quality}; it will be skipped", qualityData.Quality);
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!QualityIsDifferent(entry, qualityData))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
// Not using the original list again, so it's OK to modify the definition ref type objects in-place.
|
||||
entry.MinSize = qualityData.MinForApi;
|
||||
entry.MaxSize = qualityData.MaxForApi;
|
||||
entry.PreferredSize = qualityData.PreferredForApi;
|
||||
newQuality.Add(entry);
|
||||
|
||||
_log.Debug("Setting Quality " +
|
||||
"[Name: {Name}] [Source: {Source}] [Min: {Min}] [Max: {Max}] [Preferred: {Preferred}]",
|
||||
entry.Quality?.Name, entry.Quality?.Source, entry.MinSize, entry.MaxSize, entry.PreferredSize);
|
||||
}
|
||||
|
||||
await _api.UpdateQualityDefinition(newQuality);
|
||||
_log.Information("Number of updated qualities: {Count}", newQuality.Count);
|
||||
}
|
||||
}
|
@ -1,8 +0,0 @@
|
||||
using TrashLib.Services.Sonarr.Config;
|
||||
|
||||
namespace TrashLib.Services.Sonarr.QualityDefinition;
|
||||
|
||||
public interface ISonarrQualityDefinitionUpdater
|
||||
{
|
||||
Task Process(bool isPreview, SonarrConfiguration config);
|
||||
}
|
@ -1,10 +0,0 @@
|
||||
using TrashLib.Services.Common.QualityDefinition;
|
||||
|
||||
namespace TrashLib.Services.Sonarr.QualityDefinition;
|
||||
|
||||
public record SonarrQualityData(
|
||||
// ReSharper disable once NotAccessedPositionalProperty.Global
|
||||
string TrashId,
|
||||
string Type,
|
||||
IReadOnlyCollection<QualityItem> Qualities
|
||||
);
|
@ -1,181 +0,0 @@
|
||||
using System.Text.RegularExpressions;
|
||||
using CliFx.Infrastructure;
|
||||
using Common.Extensions;
|
||||
using Serilog;
|
||||
using TrashLib.Services.Common.QualityDefinition;
|
||||
using TrashLib.Services.Sonarr.Api;
|
||||
using TrashLib.Services.Sonarr.Api.Objects;
|
||||
using TrashLib.Services.Sonarr.Config;
|
||||
using TrashLib.Services.Sonarr.ReleaseProfile.Guide;
|
||||
|
||||
namespace TrashLib.Services.Sonarr.QualityDefinition;
|
||||
|
||||
internal class SonarrQualityDefinitionUpdater : ISonarrQualityDefinitionUpdater
|
||||
{
|
||||
private readonly ILogger _log;
|
||||
private readonly ISonarrApi _api;
|
||||
private readonly IConsole _console;
|
||||
private readonly ISonarrGuideService _guide;
|
||||
private readonly Regex _regexHybrid = new(@"720|1080", RegexOptions.Compiled);
|
||||
|
||||
public SonarrQualityDefinitionUpdater(
|
||||
ILogger logger,
|
||||
ISonarrGuideService guide,
|
||||
ISonarrApi api,
|
||||
IConsole console)
|
||||
{
|
||||
_log = logger;
|
||||
_guide = guide;
|
||||
_api = api;
|
||||
_console = console;
|
||||
}
|
||||
|
||||
private SonarrQualityData? GetQualityOrError(ICollection<SonarrQualityData> qualityDefinitions, string type)
|
||||
{
|
||||
var quality = qualityDefinitions.FirstOrDefault(x => x.Type.EqualsIgnoreCase(type));
|
||||
if (quality is null)
|
||||
{
|
||||
_log.Error(
|
||||
"The following quality definition is required for hybrid, but was not found in the guide: {Type}",
|
||||
type);
|
||||
}
|
||||
|
||||
return quality;
|
||||
}
|
||||
|
||||
public async Task Process(bool isPreview, SonarrConfiguration config)
|
||||
{
|
||||
_log.Information("Processing Quality Definition: {QualityDefinition}", config.QualityDefinition);
|
||||
var qualityDefinitions = _guide.GetQualities();
|
||||
var qualityTypeInConfig = config.QualityDefinition;
|
||||
|
||||
SonarrQualityData? selectedQuality;
|
||||
|
||||
if (config.QualityDefinition.EqualsIgnoreCase("hybrid"))
|
||||
{
|
||||
var animeQuality = GetQualityOrError(qualityDefinitions, "anime");
|
||||
var seriesQuality = GetQualityOrError(qualityDefinitions, "series");
|
||||
if (animeQuality is null || seriesQuality is null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
selectedQuality = BuildHybridQuality(animeQuality.Qualities, seriesQuality.Qualities);
|
||||
}
|
||||
else
|
||||
{
|
||||
selectedQuality = qualityDefinitions
|
||||
.FirstOrDefault(x => x.Type.EqualsIgnoreCase(qualityTypeInConfig));
|
||||
|
||||
if (selectedQuality == null)
|
||||
{
|
||||
_log.Error("The specified quality definition type does not exist: {Type}", qualityTypeInConfig);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (isPreview)
|
||||
{
|
||||
PrintQualityPreview(selectedQuality.Qualities);
|
||||
return;
|
||||
}
|
||||
|
||||
await ProcessQualityDefinition(selectedQuality.Qualities);
|
||||
}
|
||||
|
||||
private SonarrQualityData BuildHybridQuality(
|
||||
IReadOnlyCollection<QualityItem> anime,
|
||||
IReadOnlyCollection<QualityItem> series)
|
||||
{
|
||||
_log.Information(
|
||||
"Notice: Hybrid only functions on 720/1080 qualities and uses non-anime values for the rest (e.g. 2160)");
|
||||
|
||||
var hybrid = new List<QualityItem>();
|
||||
foreach (var left in series)
|
||||
{
|
||||
// Any qualities that anime doesn't care about get immediately added from Series quality
|
||||
var match = _regexHybrid.Match(left.Quality);
|
||||
if (!match.Success)
|
||||
{
|
||||
_log.Debug("Using 'Series' Quality For: {QualityName}", left.Quality);
|
||||
hybrid.Add(left);
|
||||
continue;
|
||||
}
|
||||
|
||||
// If there's a quality in Series that Anime doesn't know about, we add the Series quality
|
||||
var right = anime.FirstOrDefault(row => row.Quality == left.Quality);
|
||||
if (right == null)
|
||||
{
|
||||
_log.Error("Could not find matching anime quality for series quality named {QualityName}",
|
||||
left.Quality);
|
||||
hybrid.Add(left);
|
||||
continue;
|
||||
}
|
||||
|
||||
hybrid.Add(new QualityItem(left.Quality,
|
||||
Math.Min(left.Min, right.Min),
|
||||
Math.Max(left.Max, right.Max)));
|
||||
}
|
||||
|
||||
return new SonarrQualityData("", "hybrid", hybrid);
|
||||
}
|
||||
|
||||
private void PrintQualityPreview(IEnumerable<QualityItem> quality)
|
||||
{
|
||||
_console.Output.WriteLine("");
|
||||
const string format = "{0,-20} {1,-10} {2,-15}";
|
||||
_console.Output.WriteLine(format, "Quality", "Min", "Max");
|
||||
_console.Output.WriteLine(format, "-------", "---", "---");
|
||||
|
||||
foreach (var q in quality)
|
||||
{
|
||||
_console.Output.WriteLine(format, q.Quality, q.AnnotatedMin, q.AnnotatedMax);
|
||||
}
|
||||
|
||||
_console.Output.WriteLine("");
|
||||
}
|
||||
|
||||
private async Task ProcessQualityDefinition(IEnumerable<QualityItem> guideQuality)
|
||||
{
|
||||
var serverQuality = await _api.GetQualityDefinition();
|
||||
await UpdateQualityDefinition(serverQuality, guideQuality);
|
||||
}
|
||||
|
||||
private async Task UpdateQualityDefinition(IReadOnlyCollection<SonarrQualityDefinitionItem> serverQuality,
|
||||
IEnumerable<QualityItem> guideQuality)
|
||||
{
|
||||
static bool QualityIsDifferent(SonarrQualityDefinitionItem a, QualityItem b)
|
||||
{
|
||||
return b.IsMinDifferent(a.MinSize) ||
|
||||
b.IsMaxDifferent(a.MaxSize);
|
||||
}
|
||||
|
||||
var newQuality = new List<SonarrQualityDefinitionItem>();
|
||||
foreach (var qualityData in guideQuality)
|
||||
{
|
||||
var entry = serverQuality.FirstOrDefault(q => q.Quality?.Name == qualityData.Quality);
|
||||
if (entry == null)
|
||||
{
|
||||
_log.Warning("Server lacks quality definition for {Quality}; it will be skipped", qualityData.Quality);
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!QualityIsDifferent(entry, qualityData))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
// Not using the original list again, so it's OK to modify the definition ref type objects in-place.
|
||||
entry.MinSize = qualityData.MinForApi;
|
||||
entry.MaxSize = qualityData.MaxForApi;
|
||||
newQuality.Add(entry);
|
||||
|
||||
_log.Debug("Setting Quality " +
|
||||
"[Name: {Name}] [Source: {Source}] [Min: {Min}] [Max: {Max}]",
|
||||
entry.Quality?.Name, entry.Quality?.Source, entry.MinSize, entry.MaxSize);
|
||||
}
|
||||
|
||||
await _api.UpdateQualityDefinition(newQuality);
|
||||
_log.Information("Number of updated qualities: {Count}", newQuality.Count);
|
||||
}
|
||||
}
|
Loading…
Reference in new issue