Fixed: Quality Resolution determination using MediaInfo

This commit is contained in:
Taloth Saldono 2020-06-08 17:24:28 +02:00
parent e66b28fb87
commit 06c7f6034d
8 changed files with 39 additions and 13 deletions

View File

@ -10,31 +10,34 @@ namespace NzbDrone.Core.MediaFiles.EpisodeImport.Aggregation.Aggregators
{
public class AggregateQuality : IAggregateLocalEpisode
{
private readonly IEnumerable<IAugmentQuality> _augmentQualities;
private readonly List<IAugmentQuality> _augmentQualities;
private readonly Logger _logger;
public AggregateQuality(IEnumerable<IAugmentQuality> augmentQualities,
Logger logger)
{
_augmentQualities = augmentQualities;
_augmentQualities = augmentQualities.OrderBy(a => a.Order).ToList();
_logger = logger;
}
public LocalEpisode Aggregate(LocalEpisode localEpisode, DownloadClientItem downloadClientItem, bool otherFiles)
{
var augmentedQualities = _augmentQualities.OrderBy(a => a.Order)
.Select(a => a.AugmentQuality(localEpisode, downloadClientItem))
.Where(a => a != null)
.ToList();
var source = QualitySource.Unknown;
var sourceConfidence = Confidence.Default;
var resolution = 0;
var resolutionConfidence = Confidence.Default;
var revision = new Revision();
foreach (var augmentedQuality in augmentedQualities)
foreach (var augmentQuality in _augmentQualities)
{
var augmentedQuality = augmentQuality.AugmentQuality(localEpisode, downloadClientItem);
if (augmentedQuality == null)
{
continue;
}
_logger.Trace("Considering Source {0} ({1}) Resolution {2} ({3}) Revision {4} from {5}", augmentedQuality.Source, augmentedQuality.SourceConfidence, augmentedQuality.Resolution, augmentedQuality.ResolutionConfidence, augmentedQuality.Revision, augmentQuality.Name);
if (source == QualitySource.Unknown ||
augmentedQuality.SourceConfidence > sourceConfidence && augmentedQuality.Source != QualitySource.Unknown)
{
@ -55,7 +58,7 @@ namespace NzbDrone.Core.MediaFiles.EpisodeImport.Aggregation.Aggregators
}
}
_logger.Trace("Finding quality. Source: {0}. Resolution: {1}", source, resolution);
_logger.Trace("Selected Source {0} ({1}) Resolution {2} ({3}) Revision {4}", source, sourceConfidence, resolution, resolutionConfidence, revision);
var quality = new QualityModel(QualityFinder.FindBySourceAndResolution(source, resolution), revision);

View File

@ -7,6 +7,7 @@ namespace NzbDrone.Core.MediaFiles.EpisodeImport.Aggregation.Aggregators.Augment
public class AugmentQualityFromDownloadClientItem : IAugmentQuality
{
public int Order => 3;
public string Name => "DownloadClientItem";
public AugmentQualityResult AugmentQuality(LocalEpisode localEpisode, DownloadClientItem downloadClientItem)
{

View File

@ -7,6 +7,7 @@ namespace NzbDrone.Core.MediaFiles.EpisodeImport.Aggregation.Aggregators.Augment
public class AugmentQualityFromFileName : IAugmentQuality
{
public int Order => 1;
public string Name => "FileName";
public AugmentQualityResult AugmentQuality(LocalEpisode localEpisode, DownloadClientItem downloadClientItem)
{

View File

@ -7,6 +7,7 @@ namespace NzbDrone.Core.MediaFiles.EpisodeImport.Aggregation.Aggregators.Augment
public class AugmentQualityFromFolder : IAugmentQuality
{
public int Order => 2;
public string Name => "FolderName";
public AugmentQualityResult AugmentQuality(LocalEpisode localEpisode, DownloadClientItem downloadClientItem)
{

View File

@ -1,3 +1,4 @@
using NLog;
using NzbDrone.Core.Download;
using NzbDrone.Core.Parser.Model;
@ -5,7 +6,15 @@ namespace NzbDrone.Core.MediaFiles.EpisodeImport.Aggregation.Aggregators.Augment
{
public class AugmentQualityFromMediaInfo : IAugmentQuality
{
private readonly Logger _logger;
public int Order => 4;
public string Name => "MediaInfo";
public AugmentQualityFromMediaInfo(Logger logger)
{
_logger = logger;
}
public AugmentQualityResult AugmentQuality(LocalEpisode localEpisode, DownloadClientItem downloadClientItem)
{
@ -15,27 +24,35 @@ namespace NzbDrone.Core.MediaFiles.EpisodeImport.Aggregation.Aggregators.Augment
}
var width = localEpisode.MediaInfo.Width;
var height = localEpisode.MediaInfo.Height;
if (width >= 3200)
if (width >= 3200 || height >= 2100)
{
_logger.Trace("Resolution {0}x{1} considered 2160p", width, height);
return AugmentQualityResult.ResolutionOnly(2160, Confidence.MediaInfo);
}
if (width >= 1800)
if (width >= 1800 || height >= 1000)
{
_logger.Trace("Resolution {0}x{1} considered 1080p", width, height);
return AugmentQualityResult.ResolutionOnly(1080, Confidence.MediaInfo);
}
if (width >= 1200)
if (width >= 1200 || height >= 700)
{
_logger.Trace("Resolution {0}x{1} considered 720p", width, height);
return AugmentQualityResult.ResolutionOnly(720, Confidence.MediaInfo);
}
if (width > 0)
if (width > 0 || height > 0)
{
_logger.Trace("Resolution {0}x{1} considered 480p", width, height);
return AugmentQualityResult.ResolutionOnly(480, Confidence.MediaInfo);
}
_logger.Trace("Resolution {0}x{1}", width, height);
return null;
}
}

View File

@ -9,6 +9,7 @@ namespace NzbDrone.Core.MediaFiles.EpisodeImport.Aggregation.Aggregators.Augment
public class AugmentQualityFromReleaseName : IAugmentQuality
{
public int Order => 5;
public string Name => "ReleaseName";
private readonly IDownloadHistoryService _downloadHistoryService;

View File

@ -4,6 +4,7 @@ namespace NzbDrone.Core.MediaFiles.EpisodeImport.Aggregation.Aggregators.Augment
{
public class AugmentQualityResult
{
public string Name { get; set; }
public QualitySource Source { get; set; }
public Confidence SourceConfidence { get; set; }
public int Resolution { get; set; }

View File

@ -6,6 +6,7 @@ namespace NzbDrone.Core.MediaFiles.EpisodeImport.Aggregation.Aggregators.Augment
public interface IAugmentQuality
{
int Order { get; }
string Name { get; }
AugmentQualityResult AugmentQuality(LocalEpisode localEpisode, DownloadClientItem downloadClientItem);
}
}