diff options
Diffstat (limited to 'MediaBrowser.Server.Implementations/Library')
5 files changed, 92 insertions, 62 deletions
diff --git a/MediaBrowser.Server.Implementations/Library/CoreResolutionIgnoreRule.cs b/MediaBrowser.Server.Implementations/Library/CoreResolutionIgnoreRule.cs index 95ec416b6..5268faa4f 100644 --- a/MediaBrowser.Server.Implementations/Library/CoreResolutionIgnoreRule.cs +++ b/MediaBrowser.Server.Implementations/Library/CoreResolutionIgnoreRule.cs @@ -114,6 +114,12 @@ namespace MediaBrowser.Server.Implementations.Library { return true; } + + // Don't misidentify xbmc trailers as a movie + if (filename.IndexOf(BaseItem.XbmcTrailerFileSuffix, StringComparison.OrdinalIgnoreCase) != -1) + { + return true; + } } } diff --git a/MediaBrowser.Server.Implementations/Library/LibraryManager.cs b/MediaBrowser.Server.Implementations/Library/LibraryManager.cs index 41694765d..11c99a32c 100644 --- a/MediaBrowser.Server.Implementations/Library/LibraryManager.cs +++ b/MediaBrowser.Server.Implementations/Library/LibraryManager.cs @@ -899,6 +899,15 @@ namespace MediaBrowser.Server.Implementations.Library } /// <summary> + /// Queues the library scan. + /// </summary> + public void QueueLibraryScan() + { + // Just run the scheduled task so that the user can see it + _taskManager.QueueScheduledTask<RefreshMediaLibraryTask>(); + } + + /// <summary> /// Validates the media library internal. /// </summary> /// <param name="progress">The progress.</param> @@ -1311,11 +1320,6 @@ namespace MediaBrowser.Server.Implementations.Library { var list = items.ToList(); - foreach (var item in list) - { - item.DateLastSaved = DateTime.UtcNow; - } - await ItemRepository.SaveItems(list, cancellationToken).ConfigureAwait(false); foreach (var item in list) diff --git a/MediaBrowser.Server.Implementations/Library/Resolvers/Movies/MovieResolver.cs b/MediaBrowser.Server.Implementations/Library/Resolvers/Movies/MovieResolver.cs index 03e29dd38..3d6f7e66a 100644 --- a/MediaBrowser.Server.Implementations/Library/Resolvers/Movies/MovieResolver.cs +++ b/MediaBrowser.Server.Implementations/Library/Resolvers/Movies/MovieResolver.cs @@ -91,31 +91,43 @@ namespace MediaBrowser.Server.Implementations.Library.Resolvers.Movies if (args.Path.IndexOf("[trailers]", StringComparison.OrdinalIgnoreCase) != -1 || string.Equals(collectionType, CollectionType.Trailers, StringComparison.OrdinalIgnoreCase)) { - return FindMovie<Trailer>(args.Path, args.FileSystemChildren); + return FindMovie<Trailer>(args.Path, args.Parent, args.FileSystemChildren); } if (args.Path.IndexOf("[musicvideos]", StringComparison.OrdinalIgnoreCase) != -1 || string.Equals(collectionType, CollectionType.MusicVideos, StringComparison.OrdinalIgnoreCase)) { - return FindMovie<MusicVideo>(args.Path, args.FileSystemChildren); + return FindMovie<MusicVideo>(args.Path, args.Parent, args.FileSystemChildren); } if (args.Path.IndexOf("[adultvideos]", StringComparison.OrdinalIgnoreCase) != -1 || string.Equals(collectionType, CollectionType.AdultVideos, StringComparison.OrdinalIgnoreCase)) { - return FindMovie<AdultVideo>(args.Path, args.FileSystemChildren); + return FindMovie<AdultVideo>(args.Path, args.Parent, args.FileSystemChildren); } + if (string.Equals(collectionType, CollectionType.HomeVideos, StringComparison.OrdinalIgnoreCase)) + { + return FindMovie<Video>(args.Path, args.Parent, args.FileSystemChildren); + } + if (string.IsNullOrEmpty(collectionType) || string.Equals(collectionType, CollectionType.Movies, StringComparison.OrdinalIgnoreCase) || string.Equals(collectionType, CollectionType.BoxSets, StringComparison.OrdinalIgnoreCase)) { - return FindMovie<Movie>(args.Path, args.FileSystemChildren); + return FindMovie<Movie>(args.Path, args.Parent, args.FileSystemChildren); } return null; } + var filename = Path.GetFileName(args.Path); + // Don't misidentify xbmc trailers as a movie + if (filename.IndexOf(BaseItem.XbmcTrailerFileSuffix, StringComparison.OrdinalIgnoreCase) != -1) + { + return null; + } + // Find movies that are mixed in the same folder if (args.Path.IndexOf("[trailers]", StringComparison.OrdinalIgnoreCase) != -1 || string.Equals(collectionType, CollectionType.Trailers, StringComparison.OrdinalIgnoreCase)) @@ -172,7 +184,7 @@ namespace MediaBrowser.Server.Implementations.Library.Resolvers.Movies private void SetProviderIdFromPath(Video item) { //we need to only look at the name of this actual item (not parents) - var justName = item.IsInMixedFolder ? Path.GetFileName(item.Path) : Path.GetFileName(Path.GetDirectoryName(item.Path)); + var justName = item.IsInMixedFolder ? Path.GetFileName(item.Path) : Path.GetFileName(item.MetaLocation); var id = justName.GetAttributeValue("tmdbid"); @@ -187,9 +199,10 @@ namespace MediaBrowser.Server.Implementations.Library.Resolvers.Movies /// </summary> /// <typeparam name="T"></typeparam> /// <param name="path">The path.</param> + /// <param name="parent">The parent.</param> /// <param name="fileSystemEntries">The file system entries.</param> /// <returns>Movie.</returns> - private T FindMovie<T>(string path, IEnumerable<FileSystemInfo> fileSystemEntries) + private T FindMovie<T>(string path, Folder parent, IEnumerable<FileSystemInfo> fileSystemEntries) where T : Video, new() { var movies = new List<T>(); @@ -237,7 +250,8 @@ namespace MediaBrowser.Server.Implementations.Library.Resolvers.Movies var childArgs = new ItemResolveArgs(_applicationPaths, _libraryManager) { FileInfo = child, - Path = child.FullName + Path = child.FullName, + Parent = parent }; var item = ResolveVideo<T>(childArgs); @@ -261,7 +275,9 @@ namespace MediaBrowser.Server.Implementations.Library.Resolvers.Movies if (multiDiscFolders.Count > 0) { - return GetMultiDiscMovie<T>(multiDiscFolders); + var folders = fileSystemEntries.Where(child => (child.Attributes & FileAttributes.Directory) == FileAttributes.Directory); + + return GetMultiDiscMovie<T>(multiDiscFolders, folders); } return null; @@ -271,25 +287,26 @@ namespace MediaBrowser.Server.Implementations.Library.Resolvers.Movies /// Gets the multi disc movie. /// </summary> /// <typeparam name="T"></typeparam> - /// <param name="folders">The folders.</param> + /// <param name="multiDiscFolders">The folders.</param> + /// <param name="allFolders">All folders.</param> /// <returns>``0.</returns> - private T GetMultiDiscMovie<T>(List<FileSystemInfo> folders) + private T GetMultiDiscMovie<T>(List<FileSystemInfo> multiDiscFolders, IEnumerable<FileSystemInfo> allFolders) where T : Video, new() { - var videoType = VideoType.BluRay; + var videoTypes = new List<VideoType>(); - var folderPaths = folders.Select(i => i.FullName).Where(i => + var folderPaths = multiDiscFolders.Select(i => i.FullName).Where(i => { var subfolders = Directory.GetDirectories(i).Select(Path.GetFileName).ToList(); if (subfolders.Any(IsDvdDirectory)) { - videoType = VideoType.Dvd; + videoTypes.Add(VideoType.Dvd); return true; } if (subfolders.Any(IsBluRayDirectory)) { - videoType = VideoType.BluRay; + videoTypes.Add(VideoType.BluRay); return true; } @@ -297,18 +314,46 @@ namespace MediaBrowser.Server.Implementations.Library.Resolvers.Movies }).OrderBy(i => i).ToList(); + // If different video types were found, don't allow this + if (videoTypes.Count > 0 && videoTypes.Any(i => i != videoTypes[0])) + { + return null; + } + if (folderPaths.Count == 0) { return null; } + // If there are other folders side by side that are folder rips, don't allow it + // TODO: Improve this to return null if any folder is present aside from our regularly ignored folders + if (allFolders.Except(multiDiscFolders).Any(i => + { + var subfolders = Directory.GetDirectories(i.FullName).Select(Path.GetFileName).ToList(); + + if (subfolders.Any(IsDvdDirectory)) + { + return true; + } + if (subfolders.Any(IsBluRayDirectory)) + { + return true; + } + + return false; + + })) + { + return null; + } + return new T { Path = folderPaths[0], IsMultiPart = true, - VideoType = videoType + VideoType = videoTypes[0] }; } diff --git a/MediaBrowser.Server.Implementations/Library/UserDataManager.cs b/MediaBrowser.Server.Implementations/Library/UserDataManager.cs index 8d010aecc..79f126511 100644 --- a/MediaBrowser.Server.Implementations/Library/UserDataManager.cs +++ b/MediaBrowser.Server.Implementations/Library/UserDataManager.cs @@ -49,7 +49,7 @@ namespace MediaBrowser.Server.Implementations.Library /// userId /// or /// key</exception> - public async Task SaveUserData(Guid userId, BaseItem item, UserItemData userData, UserDataSaveReason reason, CancellationToken cancellationToken) + public async Task SaveUserData(Guid userId, IHasUserData item, UserItemData userData, UserDataSaveReason reason, CancellationToken cancellationToken) { if (userData == null) { diff --git a/MediaBrowser.Server.Implementations/Library/UserManager.cs b/MediaBrowser.Server.Implementations/Library/UserManager.cs index 4243aecfe..d4a74f2b6 100644 --- a/MediaBrowser.Server.Implementations/Library/UserManager.cs +++ b/MediaBrowser.Server.Implementations/Library/UserManager.cs @@ -22,39 +22,10 @@ namespace MediaBrowser.Server.Implementations.Library public class UserManager : IUserManager { /// <summary> - /// The _users - /// </summary> - private IEnumerable<User> _users; - /// <summary> - /// The _user lock - /// </summary> - private object _usersSyncLock = new object(); - /// <summary> - /// The _users initialized - /// </summary> - private bool _usersInitialized; - /// <summary> /// Gets the users. /// </summary> /// <value>The users.</value> - public IEnumerable<User> Users - { - get - { - // Call ToList to exhaust the stream because we'll be iterating over this multiple times - LazyInitializer.EnsureInitialized(ref _users, ref _usersInitialized, ref _usersSyncLock, LoadUsers); - return _users; - } - internal set - { - _users = value; - - if (value == null) - { - _usersInitialized = false; - } - } - } + public IEnumerable<User> Users { get; private set; } /// <summary> /// The _logger @@ -78,11 +49,13 @@ namespace MediaBrowser.Server.Implementations.Library /// </summary> /// <param name="logger">The logger.</param> /// <param name="configurationManager">The configuration manager.</param> + /// <param name="userRepository">The user repository.</param> public UserManager(ILogger logger, IServerConfigurationManager configurationManager, IUserRepository userRepository) { _logger = logger; UserRepository = userRepository; ConfigurationManager = configurationManager; + Users = new List<User>(); } #region UserUpdated Event @@ -132,6 +105,11 @@ namespace MediaBrowser.Server.Implementations.Library return Users.FirstOrDefault(u => u.Id == id); } + public async Task Initialize() + { + Users = await LoadUsers().ConfigureAwait(false); + } + /// <summary> /// Authenticates a User and returns a result indicating whether or not it succeeded /// </summary> @@ -185,7 +163,7 @@ namespace MediaBrowser.Server.Implementations.Library /// Loads the users from the repository /// </summary> /// <returns>IEnumerable{User}.</returns> - private IEnumerable<User> LoadUsers() + private async Task<IEnumerable<User>> LoadUsers() { var users = UserRepository.RetrieveAllUsers().ToList(); @@ -198,10 +176,7 @@ namespace MediaBrowser.Server.Implementations.Library user.DateLastSaved = DateTime.UtcNow; - var task = UserRepository.SaveUser(user, CancellationToken.None); - - // Hate having to block threads - Task.WaitAll(task); + await UserRepository.SaveUser(user, CancellationToken.None).ConfigureAwait(false); users.Add(user); } @@ -284,7 +259,7 @@ namespace MediaBrowser.Server.Implementations.Library } public event EventHandler<GenericEventArgs<User>> UserCreated; - + /// <summary> /// Creates the user. /// </summary> @@ -311,11 +286,11 @@ namespace MediaBrowser.Server.Implementations.Library Users = list; user.DateLastSaved = DateTime.UtcNow; - + await UserRepository.SaveUser(user, CancellationToken.None).ConfigureAwait(false); EventHelper.QueueEventIfNotNull(UserCreated, this, new GenericEventArgs<User> { Argument = user }, _logger); - + return user; } @@ -377,10 +352,10 @@ namespace MediaBrowser.Server.Implementations.Library } } - OnUserDeleted(user); - // Force this to be lazy loaded again - Users = null; + Users = await LoadUsers().ConfigureAwait(false); + + OnUserDeleted(user); } /// <summary> |
