From b52d99568b8917e5743dd67e531604753a16bb4e Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Sat, 22 Feb 2014 15:20:22 -0500 Subject: consolidate ibn api a bit --- .../Library/LibraryManager.cs | 85 ++++++++++++---------- 1 file changed, 46 insertions(+), 39 deletions(-) (limited to 'MediaBrowser.Server.Implementations') diff --git a/MediaBrowser.Server.Implementations/Library/LibraryManager.cs b/MediaBrowser.Server.Implementations/Library/LibraryManager.cs index 5bc1ff45a..b59e95c72 100644 --- a/MediaBrowser.Server.Implementations/Library/LibraryManager.cs +++ b/MediaBrowser.Server.Implementations/Library/LibraryManager.cs @@ -279,7 +279,7 @@ namespace MediaBrowser.Server.Implementations.Library if (ibnPathChanged) { - _itemsByName.Clear(); + RemoveItemsByNameFromCache(); } var newSeasonZeroName = ConfigurationManager.Configuration.SeasonZeroDisplayName; @@ -302,6 +302,32 @@ namespace MediaBrowser.Server.Implementations.Library }); } + private void RemoveItemsByNameFromCache() + { + RemoveItemsFromCache(i => i is Person); + RemoveItemsFromCache(i => i is Year); + RemoveItemsFromCache(i => i is Genre); + RemoveItemsFromCache(i => i is MusicGenre); + RemoveItemsFromCache(i => i is GameGenre); + RemoveItemsFromCache(i => i is Studio); + RemoveItemsFromCache(i => + { + var artist = i as MusicArtist; + return artist != null && artist.IsAccessedByName; + }); + } + + private void RemoveItemsFromCache(Func remove) + { + var items = _libraryItemsCache.ToList().Where(i => remove(i.Value)).ToList(); + + foreach (var item in items) + { + BaseItem value; + _libraryItemsCache.TryRemove(item.Key, out value); + } + } + /// /// Updates the season zero names. /// @@ -378,28 +404,17 @@ namespace MediaBrowser.Server.Implementations.Library /// The item. private void UpdateItemInLibraryCache(BaseItem item) { - if (item is IItemByName) - { - var hasDualAccess = item as IHasDualAccess; - if (hasDualAccess != null) - { - if (hasDualAccess.IsAccessedByName) - { - return; - } - } - else - { - return; - } - } - RegisterItem(item); } public void RegisterItem(BaseItem item) { - LibraryItemsCache.AddOrUpdate(item.Id, item, delegate { return item; }); + RegisterItem(item.Id, item); + } + + private void RegisterItem(Guid id, BaseItem item) + { + LibraryItemsCache.AddOrUpdate(id, item, delegate { return item; }); } public async Task DeleteItem(BaseItem item, DeleteOptions options) @@ -580,7 +595,7 @@ namespace MediaBrowser.Server.Implementations.Library var flattenFolderDepth = isPhysicalRoot ? 2 : 0; var fileSystemDictionary = FileData.GetFilteredFileSystemEntries(directoryService, args.Path, _fileSystem, _logger, args, flattenFolderDepth: flattenFolderDepth, resolveShortcuts: isPhysicalRoot || args.IsVf); - + // Need to remove subpaths that may have been resolved from shortcuts // Example: if \\server\movies exists, then strip out \\server\movies\action if (isPhysicalRoot) @@ -790,11 +805,6 @@ namespace MediaBrowser.Server.Implementations.Library return GetItemByName(ConfigurationManager.ApplicationPaths.ArtistsPath, name); } - /// - /// The images by name item cache - /// - private readonly ConcurrentDictionary _itemsByName = new ConcurrentDictionary(StringComparer.OrdinalIgnoreCase); - private T GetItemByName(string path, string name) where T : BaseItem, new() { @@ -812,24 +822,26 @@ namespace MediaBrowser.Server.Implementations.Library string subFolderPrefix = null; - if (typeof(T) == typeof(Person) && ConfigurationManager.Configuration.EnablePeoplePrefixSubFolders) + var type = typeof(T); + + if (type == typeof(Person) && ConfigurationManager.Configuration.EnablePeoplePrefixSubFolders) { subFolderPrefix = validFilename.Substring(0, 1); } - var key = string.IsNullOrEmpty(subFolderPrefix) ? + var fullPath = string.IsNullOrEmpty(subFolderPrefix) ? Path.Combine(path, validFilename) : Path.Combine(path, subFolderPrefix, validFilename); + var id = fullPath.GetMBId(type); + BaseItem obj; - if (!_itemsByName.TryGetValue(key, out obj)) + if (!_libraryItemsCache.TryGetValue(id, out obj)) { - var tuple = CreateItemByName(key, name); + obj = CreateItemByName(fullPath, name, id); - obj = tuple.Item2; - - _itemsByName.AddOrUpdate(key, obj, (keyName, oldValue) => obj); + RegisterItem(id, obj); } return obj as T; @@ -843,7 +855,7 @@ namespace MediaBrowser.Server.Implementations.Library /// The name. /// Task{``0}. /// Path not created: + path - private Tuple CreateItemByName(string path, string name) + private T CreateItemByName(string path, string name, Guid id) where T : BaseItem, new() { var isArtist = typeof(T) == typeof(MusicArtist); @@ -856,7 +868,7 @@ namespace MediaBrowser.Server.Implementations.Library if (existing != null) { - return new Tuple(false, existing); + return existing; } } @@ -877,10 +889,6 @@ namespace MediaBrowser.Server.Implementations.Library isNew = true; } - var type = typeof(T); - - var id = path.GetMBId(type); - var item = isNew ? null : RetrieveItem(id) as T; if (item == null) @@ -893,7 +901,6 @@ namespace MediaBrowser.Server.Implementations.Library DateModified = _fileSystem.GetLastWriteTimeUtc(fileInfo), Path = path }; - isNew = true; } if (isArtist) @@ -901,7 +908,7 @@ namespace MediaBrowser.Server.Implementations.Library (item as MusicArtist).IsAccessedByName = true; } - return new Tuple(isNew, item); + return item; } /// -- cgit v1.2.3