浏览代码

Merge pull request #724 from Tensre/master

Auto-Organize Copy/Move Option, Fix for Overwrite Existing File
Luke 11 年之前
父节点
当前提交
aea62df07f

+ 4 - 0
MediaBrowser.Model/Configuration/AutoOrganize.cs

@@ -19,6 +19,8 @@ namespace MediaBrowser.Model.Configuration
 
         public bool DeleteEmptyFolders { get; set; }
 
+        public bool CopyOriginalFile { get; set; }
+
         public TvFileOrganizationOptions()
         {
             MinFileSizeMb = 50;
@@ -31,6 +33,8 @@ namespace MediaBrowser.Model.Configuration
             MultiEpisodeNamePattern = "%sn - %sx%0e-x%0ed - %en.%ext";
             SeasonFolderPattern = "Season %s";
             SeasonZeroFolderName = "Season 0";
+
+            CopyOriginalFile = false;
         }
     }
 }

+ 42 - 7
MediaBrowser.Server.Implementations/FileOrganization/EpisodeFileOrganizer.cs

@@ -171,14 +171,27 @@ namespace MediaBrowser.Server.Implementations.FileOrganization
             var fileExists = File.Exists(result.TargetPath);
             var otherDuplicatePaths = GetOtherDuplicatePaths(result.TargetPath, series, seasonNumber, episodeNumber, endingEpiosdeNumber);
 
-            if (!overwriteExisting && (fileExists || otherDuplicatePaths.Count > 0))
+            if (!overwriteExisting)
             {
-                result.Status = FileSortingStatus.SkippedExisting;
-                result.StatusMessage = string.Empty;
-                result.DuplicatePaths = otherDuplicatePaths;
-                return;
+                if (fileExists || otherDuplicatePaths.Count > 0)
+                {
+                    result.Status = FileSortingStatus.SkippedExisting;
+                    result.StatusMessage = string.Empty;
+                    result.DuplicatePaths = otherDuplicatePaths;
+                    return;
+                }
+
+                if (options.CopyOriginalFile && fileExists && IsSameEpisode(sourcePath, newPath))
+                {
+                    _logger.Info("File {0} already copied to new path {1}, stopping organization", sourcePath, newPath);
+                    result.Status = FileSortingStatus.SkippedExisting;
+                    result.StatusMessage = string.Empty;
+                    return;
+                }
             }
 
+   
+
             PerformFileSorting(options, result);
 
             if (overwriteExisting)
@@ -266,7 +279,7 @@ namespace MediaBrowser.Server.Implementations.FileOrganization
 
             try
             {
-                if (copy)
+                if (copy || options.CopyOriginalFile)
                 {
                     File.Copy(result.OriginalPath, result.TargetPath, true);
                 }
@@ -293,7 +306,7 @@ namespace MediaBrowser.Server.Implementations.FileOrganization
                 _libraryMonitor.ReportFileSystemChangeComplete(result.TargetPath, true);
             }
 
-            if (copy)
+            if (copy && !options.CopyOriginalFile)
             {
                 try
                 {
@@ -439,5 +452,27 @@ namespace MediaBrowser.Server.Implementations.FileOrganization
                 .Replace("%0e", episodeNumber.ToString("00", _usCulture))
                 .Replace("%00e", episodeNumber.ToString("000", _usCulture));
         }
+
+        private bool IsSameEpisode(string sourcePath, string newPath)
+        {
+
+                FileInfo sourceFileInfo = new FileInfo(sourcePath);
+                FileInfo destinationFileInfo = new FileInfo(newPath);
+
+                try
+                {
+                    if (sourceFileInfo.Length == destinationFileInfo.Length)
+                    {
+                        return true;
+                    }
+                }
+                catch (FileNotFoundException)
+                {
+                    return false;
+                }
+
+                return false;
+
+        }
     }
 }

+ 1 - 1
MediaBrowser.Server.Implementations/FileOrganization/TvFolderOrganizer.cs

@@ -61,7 +61,7 @@ namespace MediaBrowser.Server.Implementations.FileOrganization
                     var organizer = new EpisodeFileOrganizer(_organizationService, _config, _fileSystem, _logger, _libraryManager,
                         _libraryMonitor, _providerManager);
 
-                    var result = await organizer.OrganizeEpisodeFile(file.FullName, options, false, cancellationToken).ConfigureAwait(false);
+                    var result = await organizer.OrganizeEpisodeFile(file.FullName, options, options.OverwriteExistingEpisodes, cancellationToken).ConfigureAwait(false);
 
                     if (result.Status == FileSortingStatus.Success)
                     {