diff options
Diffstat (limited to 'MediaBrowser.Server.Implementations/Library')
4 files changed, 87 insertions, 111 deletions
diff --git a/MediaBrowser.Server.Implementations/Library/LibraryManager.cs b/MediaBrowser.Server.Implementations/Library/LibraryManager.cs index 6a2df70b1..58a2fcd7e 100644 --- a/MediaBrowser.Server.Implementations/Library/LibraryManager.cs +++ b/MediaBrowser.Server.Implementations/Library/LibraryManager.cs @@ -391,10 +391,23 @@ namespace MediaBrowser.Server.Implementations.Library /// <param name="item">The item.</param> private void UpdateItemInLibraryCache(BaseItem item) { - if (!(item is IItemByName)) + if (item is IItemByName) { - LibraryItemsCache.AddOrUpdate(item.Id, item, delegate { return item; }); + var hasDualAccess = item as IHasDualAccess; + if (hasDualAccess != null) + { + if (hasDualAccess.IsAccessedByName) + { + return; + } + } + else + { + return; + } } + + LibraryItemsCache.AddOrUpdate(item.Id, item, delegate { return item; }); } /// <summary> @@ -657,16 +670,6 @@ namespace MediaBrowser.Server.Implementations.Library } /// <summary> - /// Gets a Genre - /// </summary> - /// <param name="name">The name.</param> - /// <returns>Task{Genre}.</returns> - public Artist GetArtist(string name) - { - return GetItemByName<Artist>(ConfigurationManager.ApplicationPaths.ArtistsPath, name); - } - - /// <summary> /// The us culture /// </summary> private static readonly CultureInfo UsCulture = new CultureInfo("en-US"); @@ -688,6 +691,16 @@ namespace MediaBrowser.Server.Implementations.Library } /// <summary> + /// Gets a Genre + /// </summary> + /// <param name="name">The name.</param> + /// <returns>Task{Genre}.</returns> + public MusicArtist GetArtist(string name) + { + return GetItemByName<MusicArtist>(ConfigurationManager.ApplicationPaths.ArtistsPath, name); + } + + /// <summary> /// The images by name item cache /// </summary> private readonly ConcurrentDictionary<string, BaseItem> _itemsByName = new ConcurrentDictionary<string, BaseItem>(StringComparer.OrdinalIgnoreCase); @@ -697,12 +710,12 @@ namespace MediaBrowser.Server.Implementations.Library { if (string.IsNullOrEmpty(path)) { - throw new ArgumentNullException(); + throw new ArgumentNullException("path"); } if (string.IsNullOrEmpty(name)) { - throw new ArgumentNullException(); + throw new ArgumentNullException("name"); } var validFilename = _fileSystem.GetValidFilename(name).Trim(); @@ -743,6 +756,20 @@ namespace MediaBrowser.Server.Implementations.Library private Tuple<bool, T> CreateItemByName<T>(string path, string name) where T : BaseItem, new() { + var isArtist = typeof(T) == typeof(MusicArtist); + + if (isArtist) + { + var existing = RootFolder.RecursiveChildren + .OfType<T>() + .FirstOrDefault(i => string.Equals(i.Name, name, StringComparison.OrdinalIgnoreCase)); + + if (existing != null) + { + return new Tuple<bool, T>(false, existing); + } + } + var fileInfo = new DirectoryInfo(path); var isNew = false; @@ -779,6 +806,11 @@ namespace MediaBrowser.Server.Implementations.Library isNew = true; } + if (isArtist) + { + (item as MusicArtist).IsAccessedByName = true; + } + // Set this now so we don't cause additional file system access during provider executions item.ResetResolveArgs(fileInfo); @@ -1363,16 +1395,19 @@ namespace MediaBrowser.Server.Implementations.Library { var item = ItemRepository.RetrieveItem(id); - var folder = item as Folder; - - if (folder != null) + if (item != null && item.IsFolder) { - folder.LoadSavedChildren(); + LoadSavedChildren(item as Folder); } return item; } + private void LoadSavedChildren(Folder item) + { + item.LoadSavedChildren(); + } + private readonly ConcurrentDictionary<string, SemaphoreSlim> _fileLocks = new ConcurrentDictionary<string, SemaphoreSlim>(); /// <summary> @@ -1470,5 +1505,30 @@ namespace MediaBrowser.Server.Implementations.Library return collectionTypes.Count == 1 ? collectionTypes[0] : null; } + + + public IEnumerable<string> GetAllArtists() + { + return GetAllArtists(RootFolder.RecursiveChildren); + } + + public IEnumerable<string> GetAllArtists(IEnumerable<BaseItem> items) + { + return items + .OfType<Audio>() + .SelectMany(i => + { + var list = new List<string>(); + + if (!string.IsNullOrEmpty(i.AlbumArtist)) + { + list.Add(i.AlbumArtist); + } + list.AddRange(i.Artists); + + return list; + }) + .Distinct(StringComparer.OrdinalIgnoreCase); + } } } diff --git a/MediaBrowser.Server.Implementations/Library/LuceneSearchEngine.cs b/MediaBrowser.Server.Implementations/Library/LuceneSearchEngine.cs index d5fccc6fd..b194b2e94 100644 --- a/MediaBrowser.Server.Implementations/Library/LuceneSearchEngine.cs +++ b/MediaBrowser.Server.Implementations/Library/LuceneSearchEngine.cs @@ -74,21 +74,7 @@ namespace MediaBrowser.Server.Implementations.Library })); // Find artists - var artists = items.OfType<Audio>() - .SelectMany(i => - { - var list = new List<string>(); - - if (!string.IsNullOrEmpty(i.AlbumArtist)) - { - list.Add(i.AlbumArtist); - } - list.AddRange(i.Artists); - - return list; - }) - .Where(i => !string.IsNullOrEmpty(i)) - .Distinct(StringComparer.OrdinalIgnoreCase) + var artists = _libraryManager.GetAllArtists(items) .ToList(); foreach (var item in artists) diff --git a/MediaBrowser.Server.Implementations/Library/Resolvers/Movies/MovieResolver.cs b/MediaBrowser.Server.Implementations/Library/Resolvers/Movies/MovieResolver.cs index 0f87b9d33..07beabb83 100644 --- a/MediaBrowser.Server.Implementations/Library/Resolvers/Movies/MovieResolver.cs +++ b/MediaBrowser.Server.Implementations/Library/Resolvers/Movies/MovieResolver.cs @@ -345,26 +345,17 @@ namespace MediaBrowser.Server.Implementations.Library.Resolvers.Movies /// <returns><c>true</c> if [is DVD directory] [the specified directory name]; otherwise, <c>false</c>.</returns> private bool IsDvdDirectory(string directoryName) { - return directoryName.Equals("video_ts", StringComparison.OrdinalIgnoreCase); + return string.Equals(directoryName, "video_ts", StringComparison.OrdinalIgnoreCase); } /// <summary> - /// Determines whether [is hd DVD directory] [the specified directory name]. - /// </summary> - /// <param name="directoryName">Name of the directory.</param> - /// <returns><c>true</c> if [is hd DVD directory] [the specified directory name]; otherwise, <c>false</c>.</returns> - private bool IsHdDvdDirectory(string directoryName) - { - return directoryName.Equals("hvdvd_ts", StringComparison.OrdinalIgnoreCase); - } - /// <summary> /// Determines whether [is blu ray directory] [the specified directory name]. /// </summary> /// <param name="directoryName">Name of the directory.</param> /// <returns><c>true</c> if [is blu ray directory] [the specified directory name]; otherwise, <c>false</c>.</returns> private bool IsBluRayDirectory(string directoryName) { - return directoryName.Equals("bdmv", StringComparison.OrdinalIgnoreCase); + return string.Equals(directoryName, "bdmv", StringComparison.OrdinalIgnoreCase); } } } diff --git a/MediaBrowser.Server.Implementations/Library/Validators/ArtistsValidator.cs b/MediaBrowser.Server.Implementations/Library/Validators/ArtistsValidator.cs index 7d46d7060..1984a2420 100644 --- a/MediaBrowser.Server.Implementations/Library/Validators/ArtistsValidator.cs +++ b/MediaBrowser.Server.Implementations/Library/Validators/ArtistsValidator.cs @@ -57,7 +57,6 @@ namespace MediaBrowser.Server.Implementations.Library.Validators { var allItems = _libraryManager.RootFolder.GetRecursiveChildren(); - var allMusicArtists = allItems.OfType<MusicArtist>().ToList(); var allSongs = allItems.OfType<Audio>().ToList(); var innerProgress = new ActionableProgress<double>(); @@ -80,36 +79,8 @@ namespace MediaBrowser.Server.Implementations.Library.Validators { cancellationToken.ThrowIfCancellationRequested(); - artist.ValidateImages(); - artist.ValidateBackdrops(); - - var musicArtist = Artist.FindMusicArtist(artist, allMusicArtists); - - if (musicArtist != null) - { - MergeImages(musicArtist.Images, artist.Images); - - // Merge backdrops - var additionalBackdrops = musicArtist - .BackdropImagePaths - .Except(artist.BackdropImagePaths) - .ToList(); - - var sources = additionalBackdrops - .Select(musicArtist.GetImageSourceInfo) - .Where(i => i != null) - .ToList(); - - foreach (var path in additionalBackdrops) - { - artist.RemoveImageSourceForPath(path); - } - - artist.BackdropImagePaths.AddRange(additionalBackdrops); - artist.ImageSources.AddRange(sources); - } - - if (!artist.LockedFields.Contains(MetadataFields.Genres)) + // Only do this for artists accessed by name. Folder-based artists use ArtistInfoFromSongsProvider + if (artist.IsAccessedByName && !artist.LockedFields.Contains(MetadataFields.Genres)) { // Avoid implicitly captured closure var artist1 = artist; @@ -145,7 +116,7 @@ namespace MediaBrowser.Server.Implementations.Library.Validators /// <param name="artist">The artist.</param> /// <param name="userId">The user id.</param> /// <param name="allItems">All items.</param> - private void SetItemCounts(Artist artist, Guid? userId, IEnumerable<IHasArtist> allItems) + private void SetItemCounts(MusicArtist artist, Guid? userId, IEnumerable<IHasArtist> allItems) { var name = artist.Name; @@ -171,50 +142,18 @@ namespace MediaBrowser.Server.Implementations.Library.Validators } /// <summary> - /// Merges the images. - /// </summary> - /// <param name="source">The source.</param> - /// <param name="target">The target.</param> - private void MergeImages(Dictionary<ImageType, string> source, Dictionary<ImageType, string> target) - { - foreach (var key in source.Keys - .Where(k => !target.ContainsKey(k))) - { - string path; - - if (source.TryGetValue(key, out path)) - { - target[key] = path; - } - } - } - - /// <summary> /// Gets all artists. /// </summary> /// <param name="allSongs">All songs.</param> /// <param name="cancellationToken">The cancellation token.</param> /// <param name="progress">The progress.</param> /// <returns>Task{Artist[]}.</returns> - private async Task<List<Artist>> GetAllArtists(IEnumerable<Audio> allSongs, CancellationToken cancellationToken, IProgress<double> progress) + private async Task<List<MusicArtist>> GetAllArtists(IEnumerable<Audio> allSongs, CancellationToken cancellationToken, IProgress<double> progress) { - var allArtists = allSongs - .SelectMany(i => - { - var list = new List<string>(); - - if (!string.IsNullOrEmpty(i.AlbumArtist)) - { - list.Add(i.AlbumArtist); - } - list.AddRange(i.Artists); - - return list; - }) - .Distinct(StringComparer.OrdinalIgnoreCase) + var allArtists = _libraryManager.GetAllArtists(allSongs) .ToList(); - var returnArtists = new List<Artist>(allArtists.Count); + var returnArtists = new List<MusicArtist>(allArtists.Count); var numComplete = 0; var numArtists = allArtists.Count; |
