diff --git a/MediaBrowser.Server.Implementations/FileOrganization/TvFolderOrganizer.cs b/MediaBrowser.Server.Implementations/FileOrganization/TvFolderOrganizer.cs index 83fca9939..81f767e91 100644 --- a/MediaBrowser.Server.Implementations/FileOrganization/TvFolderOrganizer.cs +++ b/MediaBrowser.Server.Implementations/FileOrganization/TvFolderOrganizer.cs @@ -46,6 +46,8 @@ namespace MediaBrowser.Server.Implementations.FileOrganization .Where(i => _libraryManager.IsVideoFile(i.FullName) && i.Length >= minFileBytes) .ToList(); + var processedFolders = new HashSet(); + progress.Report(10); if (eligibleFiles.Count > 0) @@ -59,7 +61,11 @@ namespace MediaBrowser.Server.Implementations.FileOrganization try { - await organizer.OrganizeEpisodeFile(file.FullName, options, options.OverwriteExistingEpisodes, cancellationToken).ConfigureAwait(false); + var result = await organizer.OrganizeEpisodeFile(file.FullName, options, options.OverwriteExistingEpisodes, cancellationToken).ConfigureAwait(false); + if (result.Status == FileSortingStatus.Success && !processedFolders.Contains(file.DirectoryName)) + { + processedFolders.Add(file.DirectoryName); + } } catch (Exception ex) { @@ -77,7 +83,7 @@ namespace MediaBrowser.Server.Implementations.FileOrganization cancellationToken.ThrowIfCancellationRequested(); progress.Report(99); - foreach (var path in watchLocations) + foreach (var path in processedFolders) { var deleteExtensions = options.LeftOverFileExtensionsToDelete .Select(i => i.Trim().TrimStart('.')) @@ -92,9 +98,9 @@ namespace MediaBrowser.Server.Implementations.FileOrganization if (options.DeleteEmptyFolders) { - foreach (var subfolder in GetDirectories(path).ToList()) + if (!IsWatchFolder(path, watchLocations)) { - DeleteEmptyFolders(subfolder); + DeleteEmptyFolders(path); } } } @@ -102,27 +108,6 @@ namespace MediaBrowser.Server.Implementations.FileOrganization progress.Report(100); } - /// - /// Gets the directories. - /// - /// The path. - /// IEnumerable{System.String}. - private IEnumerable GetDirectories(string path) - { - try - { - return _fileSystem - .GetDirectoryPaths(path) - .ToList(); - } - catch (IOException ex) - { - _logger.ErrorException("Error getting files from {0}", ex, path); - - return new List(); - } - } - /// /// Gets the files to organize. /// @@ -195,5 +180,26 @@ namespace MediaBrowser.Server.Implementations.FileOrganization } catch (UnauthorizedAccessException) { } } + + /// + /// Determines if a given folder path is contained in a folder list + /// + /// The folder path to check. + /// A list of folders. + private bool IsWatchFolder(string path, IEnumerable watchLocations) + { + // Use GetFullPath to resolve 8.3 naming and path indirections + path = Path.GetFullPath(path); + + foreach (var watchFolder in watchLocations) + { + if (String.Equals(path, Path.GetFullPath(watchFolder), StringComparison.OrdinalIgnoreCase)) + { + return true; + } + } + + return false; + } } }