Auto-Organize: Perform leftover-file and empty-folder deletion in processed folders only

During Auto-Organize, Emby should maintain a list of folders which were
processed successfully. Only these folders should be used with the
DeleteLeftOverFiles and DeleteEmptyFolders functions.
pull/702/head
softworkz 9 years ago committed by softworkz
parent 3dce39b396
commit 1ddce23086

@ -46,6 +46,8 @@ namespace MediaBrowser.Server.Implementations.FileOrganization
.Where(i => _libraryManager.IsVideoFile(i.FullName) && i.Length >= minFileBytes) .Where(i => _libraryManager.IsVideoFile(i.FullName) && i.Length >= minFileBytes)
.ToList(); .ToList();
var processedFolders = new HashSet<string>();
progress.Report(10); progress.Report(10);
if (eligibleFiles.Count > 0) if (eligibleFiles.Count > 0)
@ -59,7 +61,11 @@ namespace MediaBrowser.Server.Implementations.FileOrganization
try 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) catch (Exception ex)
{ {
@ -77,7 +83,7 @@ namespace MediaBrowser.Server.Implementations.FileOrganization
cancellationToken.ThrowIfCancellationRequested(); cancellationToken.ThrowIfCancellationRequested();
progress.Report(99); progress.Report(99);
foreach (var path in watchLocations) foreach (var path in processedFolders)
{ {
var deleteExtensions = options.LeftOverFileExtensionsToDelete var deleteExtensions = options.LeftOverFileExtensionsToDelete
.Select(i => i.Trim().TrimStart('.')) .Select(i => i.Trim().TrimStart('.'))
@ -92,9 +98,9 @@ namespace MediaBrowser.Server.Implementations.FileOrganization
if (options.DeleteEmptyFolders) 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); progress.Report(100);
} }
/// <summary>
/// Gets the directories.
/// </summary>
/// <param name="path">The path.</param>
/// <returns>IEnumerable{System.String}.</returns>
private IEnumerable<string> GetDirectories(string path)
{
try
{
return _fileSystem
.GetDirectoryPaths(path)
.ToList();
}
catch (IOException ex)
{
_logger.ErrorException("Error getting files from {0}", ex, path);
return new List<string>();
}
}
/// <summary> /// <summary>
/// Gets the files to organize. /// Gets the files to organize.
/// </summary> /// </summary>
@ -195,5 +180,26 @@ namespace MediaBrowser.Server.Implementations.FileOrganization
} }
catch (UnauthorizedAccessException) { } catch (UnauthorizedAccessException) { }
} }
/// <summary>
/// Determines if a given folder path is contained in a folder list
/// </summary>
/// <param name="path">The folder path to check.</param>
/// <param name="watchLocations">A list of folders.</param>
private bool IsWatchFolder(string path, IEnumerable<string> 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;
}
} }
} }

Loading…
Cancel
Save