Преглед на файлове

Merge branch 'master' of https://github.com/MediaBrowser/MediaBrowser

Luke Pulverenti преди 11 години
родител
ревизия
f69151fc42

+ 7 - 0
MediaBrowser.Api/UserLibrary/BaseItemsByNameService.cs

@@ -174,6 +174,10 @@ namespace MediaBrowser.Api.UserLibrary
             {
             {
                 items = items.Where(i => string.Compare(request.NameStartsWithOrGreater, i.SortName, StringComparison.CurrentCultureIgnoreCase) < 1);
                 items = items.Where(i => string.Compare(request.NameStartsWithOrGreater, i.SortName, StringComparison.CurrentCultureIgnoreCase) < 1);
             }
             }
+            if (!string.IsNullOrEmpty(request.NameStartsWith))
+            {
+               items = items.Where(i => string.Compare(request.NameStartsWith, i.SortName.Substring(0, 1), StringComparison.CurrentCultureIgnoreCase) == 0);
+            }
 
 
             if (!string.IsNullOrEmpty(request.NameLessThan))
             if (!string.IsNullOrEmpty(request.NameLessThan))
             {
             {
@@ -313,6 +317,9 @@ namespace MediaBrowser.Api.UserLibrary
         [ApiMember(Name = "NameStartsWithOrGreater", Description = "Optional filter by items whose name is sorted equally or greater than a given input string.", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET")]
         [ApiMember(Name = "NameStartsWithOrGreater", Description = "Optional filter by items whose name is sorted equally or greater than a given input string.", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET")]
         public string NameStartsWithOrGreater { get; set; }
         public string NameStartsWithOrGreater { get; set; }
 
 
+        [ApiMember(Name = "NameStartsWith", Description = "Optional filter by items whose name is sorted equally than a given input string.", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET")]
+        public string NameStartsWith { get; set; }
+
         [ApiMember(Name = "NameLessThan", Description = "Optional filter by items whose name is sorted less than a given input string.", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET")]
         [ApiMember(Name = "NameLessThan", Description = "Optional filter by items whose name is sorted less than a given input string.", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET")]
         public string NameLessThan { get; set; }
         public string NameLessThan { get; set; }
         
         

+ 15 - 0
MediaBrowser.Api/UserLibrary/ItemsService.cs

@@ -111,6 +111,12 @@ namespace MediaBrowser.Api.UserLibrary
         [ApiMember(Name = "NameStartsWithOrGreater", Description = "Optional filter by items whose name is sorted equally or greater than a given input string.", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET")]
         [ApiMember(Name = "NameStartsWithOrGreater", Description = "Optional filter by items whose name is sorted equally or greater than a given input string.", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET")]
         public string NameStartsWithOrGreater { get; set; }
         public string NameStartsWithOrGreater { get; set; }
 
 
+        [ApiMember(Name = "NameStartsWith", Description = "Optional filter by items whose name is sorted equally than a given input string.", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET")]
+        public string NameStartsWith { get; set; }
+        
+        [ApiMember(Name = "NameLessThan", Description = "Optional filter by items whose name is equally or lesser than a given input string.", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET")]
+        public string NameLessThan { get; set; }
+
         [ApiMember(Name = "AlbumArtistStartsWithOrGreater", Description = "Optional filter by items whose album artist is sorted equally or greater than a given input string.", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET")]
         [ApiMember(Name = "AlbumArtistStartsWithOrGreater", Description = "Optional filter by items whose album artist is sorted equally or greater than a given input string.", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET")]
         public string AlbumArtistStartsWithOrGreater { get; set; }
         public string AlbumArtistStartsWithOrGreater { get; set; }
 
 
@@ -768,6 +774,15 @@ namespace MediaBrowser.Api.UserLibrary
             {
             {
                 items = items.Where(i => string.Compare(request.NameStartsWithOrGreater, i.SortName, StringComparison.CurrentCultureIgnoreCase) < 1);
                 items = items.Where(i => string.Compare(request.NameStartsWithOrGreater, i.SortName, StringComparison.CurrentCultureIgnoreCase) < 1);
             }
             }
+            if (!string.IsNullOrEmpty(request.NameStartsWith))
+            {
+                items = items.Where(i => string.Compare(request.NameStartsWith, i.SortName.Substring(0, 1), StringComparison.CurrentCultureIgnoreCase) == 0);
+            }
+            
+            if (!string.IsNullOrEmpty(request.NameLessThan))
+            {
+                items = items.Where(i => string.Compare(request.NameLessThan, i.SortName, StringComparison.CurrentCultureIgnoreCase) == 1);
+            }
 
 
             if (!string.IsNullOrEmpty(request.AlbumArtistStartsWithOrGreater))
             if (!string.IsNullOrEmpty(request.AlbumArtistStartsWithOrGreater))
             {
             {

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

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

+ 12 - 0
MediaBrowser.Model/Querying/ItemQuery.cs

@@ -218,6 +218,18 @@ namespace MediaBrowser.Model.Querying
         /// <value>The name starts with or greater.</value>
         /// <value>The name starts with or greater.</value>
         public string NameStartsWithOrGreater { get; set; }
         public string NameStartsWithOrGreater { get; set; }
 
 
+        /// <summary>
+        /// Gets or sets the name starts with.
+        /// </summary>
+        /// <value>The name starts with or greater.</value>
+        public string NameStartsWith { get; set; }
+        
+        /// <summary>
+        /// Gets or sets the name starts with.
+        /// </summary>
+        /// <value>The name lessthan.</value>
+        public string NameLessThan { get; set; }
+
         /// <summary>
         /// <summary>
         /// Gets or sets the album artist starts with or greater.
         /// Gets or sets the album artist starts with or greater.
         /// </summary>
         /// </summary>

+ 4 - 0
MediaBrowser.Model/Querying/ItemsByNameQuery.cs

@@ -86,6 +86,10 @@ namespace MediaBrowser.Model.Querying
         public string NameStartsWithOrGreater { get; set; }
         public string NameStartsWithOrGreater { get; set; }
 
 
         /// <summary>
         /// <summary>
+        /// Gets or sets the name starts with
+        /// </summary>
+        /// <value>The name starts with or greater.</value>
+        public string NameStartsWith { get; set; }
         /// Gets or sets the name less than.
         /// Gets or sets the name less than.
         /// </summary>
         /// </summary>
         /// <value>The name less than.</value>
         /// <value>The name less than.</value>

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

@@ -171,14 +171,27 @@ namespace MediaBrowser.Server.Implementations.FileOrganization
             var fileExists = File.Exists(result.TargetPath);
             var fileExists = File.Exists(result.TargetPath);
             var otherDuplicatePaths = GetOtherDuplicatePaths(result.TargetPath, series, seasonNumber, episodeNumber, endingEpiosdeNumber);
             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);
             PerformFileSorting(options, result);
 
 
             if (overwriteExisting)
             if (overwriteExisting)
@@ -266,7 +279,7 @@ namespace MediaBrowser.Server.Implementations.FileOrganization
 
 
             try
             try
             {
             {
-                if (copy)
+                if (copy || options.CopyOriginalFile)
                 {
                 {
                     File.Copy(result.OriginalPath, result.TargetPath, true);
                     File.Copy(result.OriginalPath, result.TargetPath, true);
                 }
                 }
@@ -293,7 +306,7 @@ namespace MediaBrowser.Server.Implementations.FileOrganization
                 _libraryMonitor.ReportFileSystemChangeComplete(result.TargetPath, true);
                 _libraryMonitor.ReportFileSystemChangeComplete(result.TargetPath, true);
             }
             }
 
 
-            if (copy)
+            if (copy && !options.CopyOriginalFile)
             {
             {
                 try
                 try
                 {
                 {
@@ -439,5 +452,27 @@ namespace MediaBrowser.Server.Implementations.FileOrganization
                 .Replace("%0e", episodeNumber.ToString("00", _usCulture))
                 .Replace("%0e", episodeNumber.ToString("00", _usCulture))
                 .Replace("%00e", episodeNumber.ToString("000", _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,
                     var organizer = new EpisodeFileOrganizer(_organizationService, _config, _fileSystem, _logger, _libraryManager,
                         _libraryMonitor, _providerManager);
                         _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)
                     if (result.Status == FileSortingStatus.Success)
                     {
                     {