2019-07-16 02:27:35 +00:00
|
|
|
using System.Linq;
|
|
|
|
using NLog;
|
|
|
|
using NzbDrone.Common.Instrumentation;
|
|
|
|
|
|
|
|
namespace NzbDrone.Core.Qualities
|
|
|
|
{
|
|
|
|
public static class QualityFinder
|
|
|
|
{
|
|
|
|
private static readonly Logger Logger = NzbDroneLogger.GetLogger(typeof(QualityFinder));
|
|
|
|
|
2019-10-31 03:46:40 +00:00
|
|
|
public static Quality FindBySourceAndResolution(Source source, int resolution, Modifier modifer)
|
2019-07-16 02:27:35 +00:00
|
|
|
{
|
2019-09-29 20:27:54 +00:00
|
|
|
// Check for a perfect 3-way match
|
2019-09-24 02:10:51 +00:00
|
|
|
var matchingQuality = Quality.All.SingleOrDefault(q => q.Source == source && q.Resolution == resolution && q.Modifier == modifer);
|
2019-07-16 02:27:35 +00:00
|
|
|
|
|
|
|
if (matchingQuality != null)
|
|
|
|
{
|
|
|
|
return matchingQuality;
|
|
|
|
}
|
|
|
|
|
2019-09-29 20:27:54 +00:00
|
|
|
// Check for Source and Modifier Match for Qualities with Unknown Resolution
|
2019-10-31 03:46:40 +00:00
|
|
|
var matchingQualitiesUnknownResolution = Quality.All.Where(q => q.Source == source && (q.Resolution == 0) && q.Modifier == modifer && q != Quality.Unknown);
|
2019-09-29 20:27:54 +00:00
|
|
|
|
|
|
|
if (matchingQualitiesUnknownResolution.Any())
|
|
|
|
{
|
|
|
|
if (matchingQualitiesUnknownResolution.Count() == 1)
|
|
|
|
{
|
|
|
|
return matchingQualitiesUnknownResolution.First();
|
|
|
|
}
|
|
|
|
|
|
|
|
foreach (var quality in matchingQualitiesUnknownResolution)
|
|
|
|
{
|
|
|
|
if (quality.Source >= source)
|
|
|
|
{
|
|
|
|
Logger.Warn("Unable to find exact quality for {0}, {1}, and {2}. Using {3} as fallback", source, resolution, modifer, quality);
|
|
|
|
return quality;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-11-20 18:27:45 +00:00
|
|
|
// Check for Modifier match
|
2019-09-29 02:39:09 +00:00
|
|
|
var matchingModifier = Quality.All.Where(q => q.Modifier == modifer);
|
|
|
|
|
|
|
|
var matchingResolution = matchingModifier.Where(q => q.Resolution == resolution)
|
2019-07-16 02:27:35 +00:00
|
|
|
.OrderBy(q => q.Source)
|
|
|
|
.ToList();
|
|
|
|
|
|
|
|
var nearestQuality = Quality.Unknown;
|
|
|
|
|
|
|
|
foreach (var quality in matchingResolution)
|
|
|
|
{
|
|
|
|
if (quality.Source >= source)
|
|
|
|
{
|
|
|
|
nearestQuality = quality;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-09-29 02:39:09 +00:00
|
|
|
Logger.Warn("Unable to find exact quality for {0}, {1}, and {2}. Using {3} as fallback", source, resolution, modifer, nearestQuality);
|
2019-07-16 02:27:35 +00:00
|
|
|
|
|
|
|
return nearestQuality;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|