From 3a0278d0a1285fc64c524cdf0e9a95e08d13852d Mon Sep 17 00:00:00 2001 From: Leonardo Galli Date: Sat, 14 Jan 2017 13:33:30 +0100 Subject: [PATCH] Use MediaInfo to correctly identify quality when scanning disk as some file names may not contain the real quality. Fixes #170 --- .../MediaFiles/DiskScanService.cs | 2 +- .../DownloadedMovieImportService.cs | 4 +- .../EpisodeImport/ImportDecisionMaker.cs | 119 +++++++++++++++++- .../Manual/ManualImportService.cs | 2 +- 4 files changed, 118 insertions(+), 9 deletions(-) diff --git a/src/NzbDrone.Core/MediaFiles/DiskScanService.cs b/src/NzbDrone.Core/MediaFiles/DiskScanService.cs index d4d2ec71c..1c37adb82 100644 --- a/src/NzbDrone.Core/MediaFiles/DiskScanService.cs +++ b/src/NzbDrone.Core/MediaFiles/DiskScanService.cs @@ -178,7 +178,7 @@ namespace NzbDrone.Core.MediaFiles _mediaFileTableCleanupService.Clean(movie, mediaFileList); var decisionsStopwatch = Stopwatch.StartNew(); - var decisions = _importDecisionMaker.GetImportDecisions(mediaFileList, movie); + var decisions = _importDecisionMaker.GetImportDecisions(mediaFileList, movie, true); decisionsStopwatch.Stop(); _logger.Trace("Import decisions complete for: {0} [{1}]", movie, decisionsStopwatch.Elapsed); diff --git a/src/NzbDrone.Core/MediaFiles/DownloadedMovieImportService.cs b/src/NzbDrone.Core/MediaFiles/DownloadedMovieImportService.cs index 05617dffe..1843bdf72 100644 --- a/src/NzbDrone.Core/MediaFiles/DownloadedMovieImportService.cs +++ b/src/NzbDrone.Core/MediaFiles/DownloadedMovieImportService.cs @@ -183,7 +183,7 @@ namespace NzbDrone.Core.MediaFiles } } - var decisions = _importDecisionMaker.GetImportDecisions(videoFiles.ToList(), movie, folderInfo, true); + var decisions = _importDecisionMaker.GetImportDecisions(videoFiles.ToList(), movie, folderInfo, true, false); var importResults = _importApprovedMovie.Import(decisions, true, downloadClientItem, importMode); if ((downloadClientItem == null || !downloadClientItem.IsReadOnly) && @@ -237,7 +237,7 @@ namespace NzbDrone.Core.MediaFiles } } - var decisions = _importDecisionMaker.GetImportDecisions(new List() { fileInfo.FullName }, movie, null, true); + var decisions = _importDecisionMaker.GetImportDecisions(new List() { fileInfo.FullName }, movie, null, true, false); return _importApprovedMovie.Import(decisions, true, downloadClientItem, importMode); } diff --git a/src/NzbDrone.Core/MediaFiles/EpisodeImport/ImportDecisionMaker.cs b/src/NzbDrone.Core/MediaFiles/EpisodeImport/ImportDecisionMaker.cs index 080ef2399..e1f095791 100644 --- a/src/NzbDrone.Core/MediaFiles/EpisodeImport/ImportDecisionMaker.cs +++ b/src/NzbDrone.Core/MediaFiles/EpisodeImport/ImportDecisionMaker.cs @@ -19,7 +19,8 @@ namespace NzbDrone.Core.MediaFiles.EpisodeImport { List GetImportDecisions(List videoFiles, Series series); List GetImportDecisions(List videoFiles, Movie movie); - List GetImportDecisions(List videoFiles, Movie movie, ParsedMovieInfo folderInfo, bool sceneSource); //TODO: Needs changing to ParsedMovieInfo!! + List GetImportDecisions(List videoFiles, Movie movie, bool shouldCheckQuality); + List GetImportDecisions(List videoFiles, Movie movie, ParsedMovieInfo folderInfo, bool sceneSource, bool shouldCheckQuality); //TODO: Needs changing to ParsedMovieInfo!! List GetImportDecisions(List videoFiles, Series series, ParsedEpisodeInfo folderInfo, bool sceneSource); } @@ -31,6 +32,7 @@ namespace NzbDrone.Core.MediaFiles.EpisodeImport private readonly IDiskProvider _diskProvider; private readonly IVideoFileInfoReader _videoFileInfoReader; private readonly IDetectSample _detectSample; + private readonly IQualityDefinitionService _qualitiesService; private readonly Logger _logger; public ImportDecisionMaker(IEnumerable specifications, @@ -39,6 +41,7 @@ namespace NzbDrone.Core.MediaFiles.EpisodeImport IDiskProvider diskProvider, IVideoFileInfoReader videoFileInfoReader, IDetectSample detectSample, + IQualityDefinitionService qualitiesService, Logger logger) { _specifications = specifications; @@ -47,6 +50,7 @@ namespace NzbDrone.Core.MediaFiles.EpisodeImport _diskProvider = diskProvider; _videoFileInfoReader = videoFileInfoReader; _detectSample = detectSample; + _qualitiesService = qualitiesService; _logger = logger; } @@ -57,7 +61,12 @@ namespace NzbDrone.Core.MediaFiles.EpisodeImport public List GetImportDecisions(List videoFiles, Movie movie) { - return GetImportDecisions(videoFiles, movie, null, true); + return GetImportDecisions(videoFiles, movie, null, true, false); + } + + public List GetImportDecisions(List videoFiles, Movie movie, bool shouldCheckQuality = false) + { + return GetImportDecisions(videoFiles, movie, null, true, shouldCheckQuality); } public List GetImportDecisions(List videoFiles, Series series, ParsedEpisodeInfo folderInfo, bool sceneSource) @@ -77,7 +86,7 @@ namespace NzbDrone.Core.MediaFiles.EpisodeImport return decisions; } - public List GetImportDecisions(List videoFiles, Movie movie, ParsedMovieInfo folderInfo, bool sceneSource) + public List GetImportDecisions(List videoFiles, Movie movie, ParsedMovieInfo folderInfo, bool sceneSource, bool shouldCheckQuality = false) { var newFiles = _mediaFileService.FilterExistingFiles(videoFiles.ToList(), movie); @@ -88,13 +97,13 @@ namespace NzbDrone.Core.MediaFiles.EpisodeImport foreach (var file in newFiles) { - decisions.AddIfNotNull(GetDecision(file, movie, folderInfo, sceneSource, shouldUseFolderName)); + decisions.AddIfNotNull(GetDecision(file, movie, folderInfo, sceneSource, shouldUseFolderName, shouldCheckQuality)); } return decisions; } - private ImportDecision GetDecision(string file, Movie movie, ParsedMovieInfo folderInfo, bool sceneSource, bool shouldUseFolderName) + private ImportDecision GetDecision(string file, Movie movie, ParsedMovieInfo folderInfo, bool sceneSource, bool shouldUseFolderName, bool shouldCheckQuality = false) { ImportDecision decision = null; @@ -113,6 +122,106 @@ namespace NzbDrone.Core.MediaFiles.EpisodeImport if (sceneSource) { localMovie.MediaInfo = _videoFileInfoReader.GetMediaInfo(file); + if (shouldCheckQuality) + { + var width = localMovie.MediaInfo.Width; + var current = localMovie.Quality; + var qualityName = current.Quality.Name.ToLower(); + QualityModel updated = null; + if (width > 1400) + { + if (qualityName.Contains("bluray")) + { + updated = new QualityModel(Quality.Bluray1080p); + } + + else if (qualityName.Contains("webdl")) + { + updated = new QualityModel(Quality.WEBDL1080p); + } + + else if (qualityName.Contains("hdtv")) + { + updated = new QualityModel(Quality.HDTV1080p); + } + + else + { + + var def = _qualitiesService.Get(Quality.HDTV1080p); + if (localMovie.Size > def.MinSize && def.MaxSize > localMovie.Size) + { + updated = new QualityModel(Quality.HDTV1080p); + } + def = _qualitiesService.Get(Quality.WEBDL1080p); + if (localMovie.Size > def.MinSize && def.MaxSize > localMovie.Size) + { + updated = new QualityModel(Quality.WEBDL1080p); + } + def = _qualitiesService.Get(Quality.Bluray1080p); + if (localMovie.Size > def.MinSize && def.MaxSize > localMovie.Size) + { + updated = new QualityModel(Quality.Bluray1080p); + } + if (updated == null) + { + updated = new QualityModel(Quality.Bluray1080p); + } + } + + } + else + if (width > 900) + { + if (qualityName.Contains("bluray")) + { + updated = new QualityModel(Quality.Bluray720p); + } + + else if (qualityName.Contains("webdl")) + { + updated = new QualityModel(Quality.WEBDL720p); + } + + else if (qualityName.Contains("hdtv")) + { + updated = new QualityModel(Quality.HDTV720p); + } + + else + { + + var def = _qualitiesService.Get(Quality.HDTV720p); + if (localMovie.Size > def.MinSize && def.MaxSize > localMovie.Size) + { + updated = new QualityModel(Quality.HDTV720p); + } + def = _qualitiesService.Get(Quality.WEBDL720p); + if (localMovie.Size > def.MinSize && def.MaxSize > localMovie.Size) + { + updated = new QualityModel(Quality.WEBDL720p); + } + def = _qualitiesService.Get(Quality.Bluray720p); + if (localMovie.Size > def.MinSize && def.MaxSize > localMovie.Size) + { + updated = new QualityModel(Quality.Bluray720p); + } + if (updated == null) + { + updated = new QualityModel(Quality.Bluray720p); + } + + } + } + if (updated != null && updated != current) + { + updated.QualitySource = QualitySource.MediaInfo; + localMovie.Quality = updated; + } + } + + + decision = GetDecision(localMovie); } else diff --git a/src/NzbDrone.Core/MediaFiles/EpisodeImport/Manual/ManualImportService.cs b/src/NzbDrone.Core/MediaFiles/EpisodeImport/Manual/ManualImportService.cs index e8f228327..d113d53b0 100644 --- a/src/NzbDrone.Core/MediaFiles/EpisodeImport/Manual/ManualImportService.cs +++ b/src/NzbDrone.Core/MediaFiles/EpisodeImport/Manual/ManualImportService.cs @@ -161,7 +161,7 @@ namespace NzbDrone.Core.MediaFiles.EpisodeImport.Manual } var importDecisions = _importDecisionMaker.GetImportDecisions(new List { file }, - movie, null, SceneSource(movie, folder)); + movie, null, SceneSource(movie, folder), true); return importDecisions.Any() ? MapItem(importDecisions.First(), folder, downloadId) : null; }