瀏覽代碼

fix scan stopping and restarting itself multiple times when adding/removing collections

Luke Pulverenti 11 年之前
父節點
當前提交
f1a7d90640

+ 0 - 52
MediaBrowser.Api/Library/LibraryHelpers.cs

@@ -1,7 +1,6 @@
 using MediaBrowser.Common.IO;
 using MediaBrowser.Controller;
 using MediaBrowser.Controller.Entities;
-using MediaBrowser.Controller.IO;
 using System;
 using System.IO;
 using System.Linq;
@@ -22,57 +21,6 @@ namespace MediaBrowser.Api.Library
         /// </summary>
         private const string ShortcutFileSearch = "*" + ShortcutFileExtension;
 
-        /// <summary>
-        /// Adds the virtual folder.
-        /// </summary>
-        /// <param name="fileSystem">The file system.</param>
-        /// <param name="name">The name.</param>
-        /// <param name="collectionType">Type of the collection.</param>
-        /// <param name="user">The user.</param>
-        /// <param name="appPaths">The app paths.</param>
-        /// <exception cref="System.ArgumentException">There is already a media collection with the name  + name + .</exception>
-        public static void AddVirtualFolder(IFileSystem fileSystem, string name, string collectionType, User user, IServerApplicationPaths appPaths)
-        {
-            name = fileSystem.GetValidFilename(name);
-
-            var rootFolderPath = user != null ? user.RootFolderPath : appPaths.DefaultUserViewsPath;
-            var virtualFolderPath = Path.Combine(rootFolderPath, name);
-
-            if (Directory.Exists(virtualFolderPath))
-            {
-                throw new ArgumentException("There is already a media collection with the name " + name + ".");
-            }
-
-            Directory.CreateDirectory(virtualFolderPath);
-
-            if (!string.IsNullOrEmpty(collectionType))
-            {
-                var path = Path.Combine(virtualFolderPath, collectionType + ".collection");
-
-                File.Create(path);
-            }
-        }
-
-        /// <summary>
-        /// Removes the virtual folder.
-        /// </summary>
-        /// <param name="name">The name.</param>
-        /// <param name="user">The user.</param>
-        /// <param name="appPaths">The app paths.</param>
-        /// <exception cref="System.IO.DirectoryNotFoundException">The media folder does not exist</exception>
-        public static void RemoveVirtualFolder(string name, User user, IServerApplicationPaths appPaths)
-        {
-            var rootFolderPath = user != null ? user.RootFolderPath : appPaths.DefaultUserViewsPath;
-            var path = Path.Combine(rootFolderPath, name);
-
-            if (!Directory.Exists(path))
-            {
-                throw new DirectoryNotFoundException("The media folder does not exist");
-            }
-
-            Directory.Delete(path, true);
-        }
-
         /// <summary>
         /// Renames the virtual folder.
         /// </summary>

+ 60 - 21
MediaBrowser.Api/Library/LibraryStructureService.cs

@@ -1,8 +1,10 @@
-using MediaBrowser.Common.IO;
+using System.IO;
+using MediaBrowser.Common.IO;
 using MediaBrowser.Controller;
 using MediaBrowser.Controller.IO;
 using MediaBrowser.Controller.Library;
 using MediaBrowser.Model.Entities;
+using MediaBrowser.Model.Logging;
 using ServiceStack.ServiceHost;
 using System;
 using System.Collections.Generic;
@@ -188,6 +190,7 @@ namespace MediaBrowser.Api.Library
         private readonly IDirectoryWatchers _directoryWatchers;
 
         private readonly IFileSystem _fileSystem;
+        private readonly ILogger _logger;
 
         /// <summary>
         /// Initializes a new instance of the <see cref="LibraryStructureService"/> class.
@@ -196,7 +199,7 @@ namespace MediaBrowser.Api.Library
         /// <param name="userManager">The user manager.</param>
         /// <param name="libraryManager">The library manager.</param>
         /// <exception cref="System.ArgumentNullException">appPaths</exception>
-        public LibraryStructureService(IServerApplicationPaths appPaths, IUserManager userManager, ILibraryManager libraryManager, IDirectoryWatchers directoryWatchers, IFileSystem fileSystem)
+        public LibraryStructureService(IServerApplicationPaths appPaths, IUserManager userManager, ILibraryManager libraryManager, IDirectoryWatchers directoryWatchers, IFileSystem fileSystem, ILogger logger)
         {
             if (appPaths == null)
             {
@@ -208,6 +211,7 @@ namespace MediaBrowser.Api.Library
             _libraryManager = libraryManager;
             _directoryWatchers = directoryWatchers;
             _fileSystem = fileSystem;
+            _logger = logger;
         }
 
         /// <summary>
@@ -239,19 +243,40 @@ namespace MediaBrowser.Api.Library
         /// <param name="request">The request.</param>
         public void Post(AddVirtualFolder request)
         {
+            var name = _fileSystem.GetValidFilename(request.Name);
+
+            string rootFolderPath;
+
+            if (string.IsNullOrEmpty(request.UserId))
+            {
+                rootFolderPath = _appPaths.DefaultUserViewsPath;
+            }
+            else
+            {
+                var user = _userManager.GetUserById(new Guid(request.UserId));
+
+                rootFolderPath = user.RootFolderPath;
+            }
+
+            var virtualFolderPath = Path.Combine(rootFolderPath, name);
+
+            if (Directory.Exists(virtualFolderPath))
+            {
+                throw new ArgumentException("There is already a media collection with the name " + name + ".");
+            }
+
             _directoryWatchers.Stop();
+            _directoryWatchers.TemporarilyIgnore(virtualFolderPath);
 
             try
             {
-                if (string.IsNullOrEmpty(request.UserId))
-                {
-                    LibraryHelpers.AddVirtualFolder(_fileSystem, request.Name, request.CollectionType, null, _appPaths);
-                }
-                else
+                Directory.CreateDirectory(virtualFolderPath);
+
+                if (!string.IsNullOrEmpty(request.CollectionType))
                 {
-                    var user = _userManager.GetUserById(new Guid(request.UserId));
+                    var path = Path.Combine(virtualFolderPath, request.CollectionType + ".collection");
 
-                    LibraryHelpers.AddVirtualFolder(_fileSystem, request.Name, request.CollectionType, user, _appPaths);
+                    File.Create(path);
                 }
 
                 // Need to add a delay here or directory watchers may still pick up the changes
@@ -262,6 +287,7 @@ namespace MediaBrowser.Api.Library
             finally
             {
                 _directoryWatchers.Start();
+                _directoryWatchers.RemoveTempIgnore(virtualFolderPath);
             }
 
             if (request.RefreshLibrary)
@@ -313,29 +339,42 @@ namespace MediaBrowser.Api.Library
         /// <param name="request">The request.</param>
         public void Delete(RemoveVirtualFolder request)
         {
+            string rootFolderPath;
+
+            if (string.IsNullOrEmpty(request.UserId))
+            {
+                rootFolderPath = _appPaths.DefaultUserViewsPath;
+            }
+            else
+            {
+                var user = _userManager.GetUserById(new Guid(request.UserId));
+
+                rootFolderPath = user.RootFolderPath;
+            }
+
+            var path = Path.Combine(rootFolderPath, request.Name);
+
+            if (!Directory.Exists(path))
+            {
+                throw new DirectoryNotFoundException("The media folder does not exist");
+            }
+
             _directoryWatchers.Stop();
+            _directoryWatchers.TemporarilyIgnore(path);
 
             try
             {
-                if (string.IsNullOrEmpty(request.UserId))
-                {
-                    LibraryHelpers.RemoveVirtualFolder(request.Name, null, _appPaths);
-                }
-                else
-                {
-                    var user = _userManager.GetUserById(new Guid(request.UserId));
-
-                    LibraryHelpers.RemoveVirtualFolder(request.Name, user, _appPaths);
-                }
+                Directory.Delete(path, true);
 
                 // Need to add a delay here or directory watchers may still pick up the changes
-                var task = Task.Delay(1000);
+                var delayTask = Task.Delay(1000);
                 // Have to block here to allow exceptions to bubble
-                Task.WaitAll(task);
+                Task.WaitAll(delayTask);
             }
             finally
             {
                 _directoryWatchers.Start();
+                _directoryWatchers.RemoveTempIgnore(path);
             }
 
             if (request.RefreshLibrary)

+ 1 - 2
MediaBrowser.Api/LibraryService.cs

@@ -495,8 +495,7 @@ namespace MediaBrowser.Api
                 {
                     try
                     {
-                        await
-                            parent.ValidateChildren(new Progress<double>(), CancellationToken.None)
+                        await parent.ValidateChildren(new Progress<double>(), CancellationToken.None)
                                   .ConfigureAwait(false);
                     }
                     catch (Exception ex)

+ 5 - 3
MediaBrowser.Controller/Entities/Folder.cs

@@ -1347,12 +1347,14 @@ namespace MediaBrowser.Controller.Entities
 
             try
             {
-                if (LocationType == LocationType.Remote && string.Equals(Path, path, StringComparison.OrdinalIgnoreCase))
+                var locationType = LocationType;
+
+                if (locationType == LocationType.Remote && string.Equals(Path, path, StringComparison.OrdinalIgnoreCase))
                 {
                     return this;
                 }
-                
-                if (LocationType != LocationType.Virtual && ResolveArgs.PhysicalLocations.Contains(path, StringComparer.OrdinalIgnoreCase))
+
+                if (locationType != LocationType.Virtual && ResolveArgs.PhysicalLocations.Contains(path, StringComparer.OrdinalIgnoreCase))
                 {
                     return this;
                 }

+ 21 - 24
MediaBrowser.Server.Implementations/IO/DirectoryWatchers.cs

@@ -358,39 +358,36 @@ namespace MediaBrowser.Server.Implementations.IO
 
             var tempIgnorePaths = _tempIgnoredPaths.Keys.ToList();
 
-            if (e.ChangeType == WatcherChangeTypes.Changed)
+            // If the parent of an ignored path has a change event, ignore that too
+            if (tempIgnorePaths.Any(i =>
             {
-                // If the parent of an ignored path has a change event, ignore that too
-                if (tempIgnorePaths.Any(i =>
+                if (string.Equals(i, e.FullPath, StringComparison.OrdinalIgnoreCase))
                 {
-                    if (string.Equals(i, e.FullPath, StringComparison.OrdinalIgnoreCase))
-                    {
-                        return true;
-                    }
+                    return true;
+                }
 
-                    // Go up a level
-                    var parent = Path.GetDirectoryName(i);
+                // Go up a level
+                var parent = Path.GetDirectoryName(i);
+                if (string.Equals(parent, e.FullPath, StringComparison.OrdinalIgnoreCase))
+                {
+                    return true;
+                }
+
+                // Go up another level
+                if (!string.IsNullOrEmpty(parent))
+                {
+                    parent = Path.GetDirectoryName(i);
                     if (string.Equals(parent, e.FullPath, StringComparison.OrdinalIgnoreCase))
                     {
                         return true;
                     }
+                }
 
-                    // Go up another level
-                    if (!string.IsNullOrEmpty(parent))
-                    {
-                        parent = Path.GetDirectoryName(i);
-                        if (string.Equals(parent, e.FullPath, StringComparison.OrdinalIgnoreCase))
-                        {
-                            return true;
-                        }
-                    }
-
-                    return false;
+                return false;
 
-                }))
-                {
-                    return;
-                }
+            }))
+            {
+                return;
             }
 
             if (tempIgnorePaths.Contains(e.FullPath, StringComparer.OrdinalIgnoreCase))

+ 14 - 2
MediaBrowser.Server.Implementations/Library/LibraryManager.cs

@@ -1430,10 +1430,22 @@ namespace MediaBrowser.Server.Implementations.Library
                 .OfType<CollectionFolder>()
                 .Where(i =>
                 {
+                    var locationType = i.LocationType;
+
+                    if (locationType == LocationType.Remote || locationType == LocationType.Virtual)
+                    {
+                        return false;
+                    }
+
+                    if (string.Equals(i.Path, item.Path, StringComparison.OrdinalIgnoreCase))
+                    {
+                        return true;
+                    }
+
                     try
                     {
-                        return i.LocationType != LocationType.Remote && i.LocationType != LocationType.Virtual &&
-                               i.ResolveArgs.PhysicalLocations.Contains(item.Path);
+                        
+                        return i.ResolveArgs.PhysicalLocations.Contains(item.Path);
                     }
                     catch (IOException ex)
                     {