diff options
Diffstat (limited to 'MediaBrowser.Server.Implementations/Library/LibraryManager.cs')
| -rw-r--r-- | MediaBrowser.Server.Implementations/Library/LibraryManager.cs | 96 |
1 files changed, 78 insertions, 18 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); + } } } |
