using MediaBrowser.Controller; using MediaBrowser.Controller.IO; using MediaBrowser.Controller.Library; using MediaBrowser.Model.Entities; using ServiceStack.ServiceHost; using System; using System.Collections.Generic; using System.Linq; using System.Threading; using System.Threading.Tasks; namespace MediaBrowser.Api.Library { /// /// Class GetDefaultVirtualFolders /// [Route("/Library/VirtualFolders", "GET")] [Route("/Users/{UserId}/VirtualFolders", "GET")] public class GetVirtualFolders : IReturn> { /// /// Gets or sets the user id. /// /// The user id. public string UserId { get; set; } } [Route("/Library/VirtualFolders/{Name}", "POST")] [Route("/Users/{UserId}/VirtualFolders/{Name}", "POST")] public class AddVirtualFolder : IReturnVoid { /// /// Gets or sets the user id. /// /// The user id. public string UserId { get; set; } /// /// Gets or sets the name. /// /// The name. public string Name { get; set; } /// /// Gets or sets the type of the collection. /// /// The type of the collection. public string CollectionType { get; set; } /// /// Gets or sets a value indicating whether [refresh library]. /// /// true if [refresh library]; otherwise, false. public bool RefreshLibrary { get; set; } } [Route("/Library/VirtualFolders/{Name}", "DELETE")] [Route("/Users/{UserId}/VirtualFolders/{Name}", "DELETE")] public class RemoveVirtualFolder : IReturnVoid { /// /// Gets or sets the user id. /// /// The user id. public string UserId { get; set; } /// /// Gets or sets the name. /// /// The name. public string Name { get; set; } /// /// Gets or sets a value indicating whether [refresh library]. /// /// true if [refresh library]; otherwise, false. public bool RefreshLibrary { get; set; } } [Route("/Library/VirtualFolders/{Name}/Name", "POST")] [Route("/Users/{UserId}/VirtualFolders/{Name}/Name", "POST")] public class RenameVirtualFolder : IReturnVoid { /// /// Gets or sets the user id. /// /// The user id. public string UserId { get; set; } /// /// Gets or sets the name. /// /// The name. public string Name { get; set; } /// /// Gets or sets the name. /// /// The name. public string NewName { get; set; } /// /// Gets or sets a value indicating whether [refresh library]. /// /// true if [refresh library]; otherwise, false. public bool RefreshLibrary { get; set; } } [Route("/Library/VirtualFolders/{Name}/Paths", "POST")] [Route("/Users/{UserId}/VirtualFolders/{Name}/Paths", "POST")] public class AddMediaPath : IReturnVoid { /// /// Gets or sets the user id. /// /// The user id. public string UserId { get; set; } /// /// Gets or sets the name. /// /// The name. public string Name { get; set; } /// /// Gets or sets the name. /// /// The name. public string Path { get; set; } /// /// Gets or sets a value indicating whether [refresh library]. /// /// true if [refresh library]; otherwise, false. public bool RefreshLibrary { get; set; } } [Route("/Library/VirtualFolders/{Name}/Paths", "DELETE")] [Route("/Users/{UserId}/VirtualFolders/{Name}/Paths", "DELETE")] public class RemoveMediaPath : IReturnVoid { /// /// Gets or sets the user id. /// /// The user id. public string UserId { get; set; } /// /// Gets or sets the name. /// /// The name. public string Name { get; set; } /// /// Gets or sets the name. /// /// The name. public string Path { get; set; } /// /// Gets or sets a value indicating whether [refresh library]. /// /// true if [refresh library]; otherwise, false. public bool RefreshLibrary { get; set; } } /// /// Class LibraryStructureService /// public class LibraryStructureService : BaseApiService { /// /// The _app paths /// private readonly IServerApplicationPaths _appPaths; /// /// The _user manager /// private readonly IUserManager _userManager; /// /// The _library manager /// private readonly ILibraryManager _libraryManager; private readonly IDirectoryWatchers _directoryWatchers; /// /// Initializes a new instance of the class. /// /// The app paths. /// The user manager. /// The library manager. /// appPaths public LibraryStructureService(IServerApplicationPaths appPaths, IUserManager userManager, ILibraryManager libraryManager, IDirectoryWatchers directoryWatchers) { if (appPaths == null) { throw new ArgumentNullException("appPaths"); } _userManager = userManager; _appPaths = appPaths; _libraryManager = libraryManager; _directoryWatchers = directoryWatchers; } /// /// Gets the specified request. /// /// The request. /// System.Object. public object Get(GetVirtualFolders request) { if (string.IsNullOrEmpty(request.UserId)) { var result = _libraryManager.GetDefaultVirtualFolders().OrderBy(i => i.Name).ToList(); return ToOptimizedResult(result); } else { var user = _userManager.GetUserById(new Guid(request.UserId)); var result = _libraryManager.GetVirtualFolders(user).OrderBy(i => i.Name).ToList(); return ToOptimizedResult(result); } } /// /// Posts the specified request. /// /// The request. public void Post(AddVirtualFolder request) { _directoryWatchers.Stop(); try { if (string.IsNullOrEmpty(request.UserId)) { LibraryHelpers.AddVirtualFolder(request.Name, request.CollectionType, null, _appPaths); } else { var user = _userManager.GetUserById(new Guid(request.UserId)); LibraryHelpers.AddVirtualFolder(request.Name, request.CollectionType, user, _appPaths); } // Need to add a delay here or directory watchers may still pick up the changes var task = Task.Delay(1000); // Have to block here to allow exceptions to bubble Task.WaitAll(task); } finally { _directoryWatchers.Start(); } if (request.RefreshLibrary) { _libraryManager.ValidateMediaLibrary(new Progress(), CancellationToken.None); } } /// /// Posts the specified request. /// /// The request. public void Post(RenameVirtualFolder request) { _directoryWatchers.Stop(); try { if (string.IsNullOrEmpty(request.UserId)) { LibraryHelpers.RenameVirtualFolder(request.Name, request.NewName, null, _appPaths); } else { var user = _userManager.GetUserById(new Guid(request.UserId)); LibraryHelpers.RenameVirtualFolder(request.Name, request.NewName, user, _appPaths); } // Need to add a delay here or directory watchers may still pick up the changes var task = Task.Delay(1000); // Have to block here to allow exceptions to bubble Task.WaitAll(task); } finally { _directoryWatchers.Start(); } if (request.RefreshLibrary) { _libraryManager.ValidateMediaLibrary(new Progress(), CancellationToken.None); } } /// /// Deletes the specified request. /// /// The request. public void Delete(RemoveVirtualFolder request) { _directoryWatchers.Stop(); 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); } // Need to add a delay here or directory watchers may still pick up the changes var task = Task.Delay(1000); // Have to block here to allow exceptions to bubble Task.WaitAll(task); } finally { _directoryWatchers.Start(); } if (request.RefreshLibrary) { _libraryManager.ValidateMediaLibrary(new Progress(), CancellationToken.None); } } /// /// Posts the specified request. /// /// The request. public void Post(AddMediaPath request) { _directoryWatchers.Stop(); try { if (string.IsNullOrEmpty(request.UserId)) { LibraryHelpers.AddMediaPath(request.Name, request.Path, null, _appPaths); } else { var user = _userManager.GetUserById(new Guid(request.UserId)); LibraryHelpers.AddMediaPath(request.Name, request.Path, user, _appPaths); } // Need to add a delay here or directory watchers may still pick up the changes var task = Task.Delay(1000); // Have to block here to allow exceptions to bubble Task.WaitAll(task); } finally { _directoryWatchers.Start(); } if (request.RefreshLibrary) { _libraryManager.ValidateMediaLibrary(new Progress(), CancellationToken.None); } } /// /// Deletes the specified request. /// /// The request. public void Delete(RemoveMediaPath request) { _directoryWatchers.Stop(); try { if (string.IsNullOrEmpty(request.UserId)) { LibraryHelpers.RemoveMediaPath(request.Name, request.Path, null, _appPaths); } else { var user = _userManager.GetUserById(new Guid(request.UserId)); LibraryHelpers.RemoveMediaPath(request.Name, request.Path, user, _appPaths); } // Need to add a delay here or directory watchers may still pick up the changes var task = Task.Delay(1000); // Have to block here to allow exceptions to bubble Task.WaitAll(task); } finally { _directoryWatchers.Start(); } if (request.RefreshLibrary) { _libraryManager.ValidateMediaLibrary(new Progress(), CancellationToken.None); } } } }