diff options
Diffstat (limited to 'MediaBrowser.Api/Library/LibraryStructureService.cs')
| -rw-r--r-- | MediaBrowser.Api/Library/LibraryStructureService.cs | 81 |
1 files changed, 60 insertions, 21 deletions
diff --git a/MediaBrowser.Api/Library/LibraryStructureService.cs b/MediaBrowser.Api/Library/LibraryStructureService.cs index 0126586ab..5738dcb11 100644 --- a/MediaBrowser.Api/Library/LibraryStructureService.cs +++ b/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) |
