diff --git a/src/NzbDrone.Core/MediaFiles/DiskScanService.cs b/src/NzbDrone.Core/MediaFiles/DiskScanService.cs index d4d2ec71cb..1c37adb82d 100644 --- a/src/NzbDrone.Core/MediaFiles/DiskScanService.cs +++ b/src/NzbDrone.Core/MediaFiles/DiskScanService.cs @@ -178,7 +178,7 @@ public void Scan(Movie movie) _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 05617dffe1..1843bdf72a 100644 --- a/src/NzbDrone.Core/MediaFiles/DownloadedMovieImportService.cs +++ b/src/NzbDrone.Core/MediaFiles/DownloadedMovieImportService.cs @@ -183,7 +183,7 @@ private List ProcessFolder(DirectoryInfo directoryInfo, ImportMode } } - 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 @@ private List ProcessFile(FileInfo fileInfo, ImportMode importMode, } } - 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 080ef23995..e1f0957912 100644 --- a/src/NzbDrone.Core/MediaFiles/EpisodeImport/ImportDecisionMaker.cs +++ b/src/NzbDrone.Core/MediaFiles/EpisodeImport/ImportDecisionMaker.cs @@ -19,7 +19,8 @@ public interface IMakeImportDecision { 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 @@ public class ImportDecisionMaker : IMakeImportDecision 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 @@ public ImportDecisionMaker(IEnumerable speci IDiskProvider diskProvider, IVideoFileInfoReader videoFileInfoReader, IDetectSample detectSample, + IQualityDefinitionService qualitiesService, Logger logger) { _specifications = specifications; @@ -47,6 +50,7 @@ public ImportDecisionMaker(IEnumerable speci _diskProvider = diskProvider; _videoFileInfoReader = videoFileInfoReader; _detectSample = detectSample; + _qualitiesService = qualitiesService; _logger = logger; } @@ -57,7 +61,12 @@ public List GetImportDecisions(List videoFiles, Series s 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 @@ public List GetImportDecisions(List videoFiles, Series s 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 @@ public List GetImportDecisions(List videoFiles, Movie mo 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 @@ private ImportDecision GetDecision(string file, Movie movie, ParsedMovieInfo fol 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 e8f228327f..d113d53b07 100644 --- a/src/NzbDrone.Core/MediaFiles/EpisodeImport/Manual/ManualImportService.cs +++ b/src/NzbDrone.Core/MediaFiles/EpisodeImport/Manual/ManualImportService.cs @@ -161,7 +161,7 @@ private ManualImportItem ProcessFile(string file, string downloadId, string fold } 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; }