|
@@ -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;
|
|
|
|
+ }
|
|
}
|
|
}
|
|
}
|
|
}
|