From ccf707e57b701b236c1dcb1f12e81486ccaa1aed Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Sun, 19 Jan 2014 13:31:03 -0500 Subject: #680 - Support new episode file sorting --- .../FileSorting/TvFileSorter.cs | 55 ++++++++++++++++++---- 1 file changed, 45 insertions(+), 10 deletions(-) (limited to 'MediaBrowser.Server.Implementations/FileSorting/TvFileSorter.cs') diff --git a/MediaBrowser.Server.Implementations/FileSorting/TvFileSorter.cs b/MediaBrowser.Server.Implementations/FileSorting/TvFileSorter.cs index 679ab2c2d..093a1dba6 100644 --- a/MediaBrowser.Server.Implementations/FileSorting/TvFileSorter.cs +++ b/MediaBrowser.Server.Implementations/FileSorting/TvFileSorter.cs @@ -35,11 +35,13 @@ namespace MediaBrowser.Server.Implementations.FileSorting _iFileSortingRepository = iFileSortingRepository; } - public async Task Sort(FileSortingOptions options, CancellationToken cancellationToken, IProgress progress) + public async Task Sort(TvFileSortingOptions options, CancellationToken cancellationToken, IProgress progress) { var minFileBytes = options.MinFileSizeMb * 1024 * 1024; - var eligibleFiles = options.TvWatchLocations.SelectMany(GetFilesToSort) + var watchLocations = options.WatchLocations.ToList(); + + var eligibleFiles = watchLocations.SelectMany(GetFilesToSort) .OrderBy(_fileSystem.GetCreationTimeUtc) .Where(i => EntityResolutionHelper.IsVideoFile(i.FullName) && i.Length >= minFileBytes) .ToList(); @@ -72,7 +74,7 @@ namespace MediaBrowser.Server.Implementations.FileSorting if (!options.EnableTrialMode) { - foreach (var path in options.TvWatchLocations) + foreach (var path in watchLocations) { if (options.LeftOverFileExtensionsToDelete.Length > 0) { @@ -116,7 +118,7 @@ namespace MediaBrowser.Server.Implementations.FileSorting /// The path. /// The options. /// All series. - private Task SortFile(string path, FileSortingOptions options, IEnumerable allSeries) + private Task SortFile(string path, TvFileSortingOptions options, IEnumerable allSeries) { _logger.Info("Sorting file {0}", path); @@ -180,7 +182,7 @@ namespace MediaBrowser.Server.Implementations.FileSorting /// The options. /// All series. /// The result. - private void SortFile(string path, string seriesName, int seasonNumber, int episodeNumber, FileSortingOptions options, IEnumerable allSeries, FileSortingResult result) + private void SortFile(string path, string seriesName, int seasonNumber, int episodeNumber, TvFileSortingOptions options, IEnumerable allSeries, FileSortingResult result) { var series = GetMatchingSeries(seriesName, allSeries); @@ -216,13 +218,14 @@ namespace MediaBrowser.Server.Implementations.FileSorting return; } - if (!options.OverwriteExistingEpisodes && File.Exists(result.TargetPath)) + var targetExists = File.Exists(result.TargetPath); + if (!options.OverwriteExistingEpisodes && targetExists) { result.Status = FileSortingStatus.SkippedExisting; return; } - PerformFileSorting(options, result); + PerformFileSorting(options, result, targetExists); } /// @@ -230,8 +233,40 @@ namespace MediaBrowser.Server.Implementations.FileSorting /// /// The options. /// The result. - private void PerformFileSorting(FileSortingOptions options, FileSortingResult result) + /// if set to true [copy]. + private void PerformFileSorting(TvFileSortingOptions options, FileSortingResult result, bool copy) { + try + { + if (copy) + { + File.Copy(result.OriginalPath, result.TargetPath, true); + } + else + { + File.Move(result.OriginalPath, result.TargetPath); + } + } + catch (Exception ex) + { + var errorMsg = string.Format("Failed to move file from {0} to {1}", result.OriginalPath, result.TargetPath); + result.Status = FileSortingStatus.Failure; + result.ErrorMessage = errorMsg; + _logger.ErrorException(errorMsg, ex); + return; + } + + if (copy) + { + try + { + File.Delete(result.OriginalPath); + } + catch (Exception ex) + { + _logger.ErrorException("Error deleting {0}", ex, result.OriginalPath); + } + } } /// @@ -252,7 +287,7 @@ namespace MediaBrowser.Server.Implementations.FileSorting /// The episode number. /// The options. /// System.String. - private string GetNewPath(Series series, int seasonNumber, int episodeNumber, FileSortingOptions options) + private string GetNewPath(Series series, int seasonNumber, int episodeNumber, TvFileSortingOptions options) { var currentEpisodes = series.RecursiveChildren.OfType() .Where(i => i.IndexNumber.HasValue && i.IndexNumber.Value == episodeNumber && i.ParentIndexNumber.HasValue && i.ParentIndexNumber.Value == seasonNumber) @@ -295,7 +330,7 @@ namespace MediaBrowser.Server.Implementations.FileSorting /// The season number. /// The options. /// System.String. - private string GetSeasonFolderPath(Series series, int seasonNumber, FileSortingOptions options) + private string GetSeasonFolderPath(Series series, int seasonNumber, TvFileSortingOptions options) { // If there's already a season folder, use that var season = series -- cgit v1.2.3