@ -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 watchLocation s)
foreach ( var path in processedFolder s)
{
{
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 ;
}
}
}
}
}