Browse Source

added new parent methods

Luke Pulverenti 9 years ago
parent
commit
cc19ce0daf
48 changed files with 189 additions and 143 deletions
  1. 10 2
      Emby.Drawing/ImageProcessor.cs
  2. 2 2
      MediaBrowser.Api/GamesService.cs
  3. 1 1
      MediaBrowser.Api/Images/ImageService.cs
  4. 7 7
      MediaBrowser.Api/Library/LibraryService.cs
  5. 2 2
      MediaBrowser.Api/Movies/MoviesService.cs
  6. 1 1
      MediaBrowser.Api/SearchService.cs
  7. 1 1
      MediaBrowser.Api/StartupWizardService.cs
  8. 1 0
      MediaBrowser.Api/UserLibrary/UserViewsService.cs
  9. 2 2
      MediaBrowser.Controller/Entities/Audio/MusicAlbum.cs
  10. 29 30
      MediaBrowser.Controller/Entities/BaseItem.cs
  11. 1 1
      MediaBrowser.Controller/Entities/Book.cs
  12. 6 22
      MediaBrowser.Controller/Entities/Folder.cs
  13. 18 0
      MediaBrowser.Controller/Entities/IHiddenFromDisplay.cs
  14. 1 1
      MediaBrowser.Controller/Entities/Movies/Movie.cs
  15. 1 1
      MediaBrowser.Controller/Entities/Photo.cs
  16. 1 1
      MediaBrowser.Controller/Entities/TV/Episode.cs
  17. 1 1
      MediaBrowser.Controller/Entities/TV/Season.cs
  18. 1 1
      MediaBrowser.Controller/Entities/Trailer.cs
  19. 10 2
      MediaBrowser.Controller/Entities/UserView.cs
  20. 2 2
      MediaBrowser.Controller/Entities/UserViewBuilder.cs
  21. 1 1
      MediaBrowser.Controller/Entities/Video.cs
  22. 1 2
      MediaBrowser.Controller/Library/ILibraryManager.cs
  23. 1 1
      MediaBrowser.Controller/Library/ItemResolveArgs.cs
  24. 1 0
      MediaBrowser.Controller/MediaBrowser.Controller.csproj
  25. 1 1
      MediaBrowser.Dlna/Didl/DidlBuilder.cs
  26. 1 1
      MediaBrowser.Model/Configuration/ServerConfiguration.cs
  27. 6 0
      MediaBrowser.Model/Library/UserViewQuery.cs
  28. 1 1
      MediaBrowser.Providers/Manager/ProviderManager.cs
  29. 1 1
      MediaBrowser.Server.Implementations/Collections/CollectionImageProvider.cs
  30. 3 3
      MediaBrowser.Server.Implementations/Collections/ManualCollectionsFolder.cs
  31. 13 13
      MediaBrowser.Server.Implementations/Dto/DtoService.cs
  32. 1 1
      MediaBrowser.Server.Implementations/EntryPoints/UserDataChangeNotifier.cs
  33. 3 3
      MediaBrowser.Server.Implementations/IO/LibraryMonitor.cs
  34. 1 1
      MediaBrowser.Server.Implementations/Intros/DefaultIntroProvider.cs
  35. 19 8
      MediaBrowser.Server.Implementations/Library/LibraryManager.cs
  36. 1 1
      MediaBrowser.Server.Implementations/Library/MusicManager.cs
  37. 2 2
      MediaBrowser.Server.Implementations/Library/ResolverHelper.cs
  38. 1 1
      MediaBrowser.Server.Implementations/Library/Resolvers/Movies/MovieResolver.cs
  39. 1 1
      MediaBrowser.Server.Implementations/Library/Resolvers/TV/EpisodeResolver.cs
  40. 1 1
      MediaBrowser.Server.Implementations/Library/SearchEngine.cs
  41. 13 4
      MediaBrowser.Server.Implementations/Library/UserViewManager.cs
  42. 6 5
      MediaBrowser.Server.Implementations/LiveTv/LiveTvManager.cs
  43. 3 2
      MediaBrowser.Server.Implementations/Persistence/SqliteItemRepository.cs
  44. 1 1
      MediaBrowser.Server.Implementations/Playlists/PlaylistImageProvider.cs
  45. 3 3
      MediaBrowser.Server.Implementations/Session/SessionManager.cs
  46. 2 2
      MediaBrowser.Server.Implementations/Sync/SyncManager.cs
  47. 2 2
      MediaBrowser.Server.Implementations/TV/TVSeriesManager.cs
  48. 1 1
      MediaBrowser.Server.Startup.Common/ApplicationHost.cs

+ 10 - 2
Emby.Drawing/ImageProcessor.cs

@@ -259,6 +259,16 @@ namespace Emby.Drawing
 
                     _imageEncoder.EncodeImage(originalImagePath, cacheFilePath, newWidth, newHeight, quality, options, outputFormat);
                 }
+
+                return new Tuple<string, string>(cacheFilePath, GetMimeType(outputFormat, cacheFilePath));
+            }
+            catch (Exception ex)
+            {
+                // If it fails for whatever reason, return the original image
+                _logger.ErrorException("Error encoding image", ex);
+
+                // Just spit out the original file if all the options are default
+                return new Tuple<string, string>(originalImagePath, MimeTypes.GetMimeType(originalImagePath));
             }
             finally
             {
@@ -269,8 +279,6 @@ namespace Emby.Drawing
 
                 semaphore.Release();
             }
-
-            return new Tuple<string, string>(cacheFilePath, GetMimeType(outputFormat, cacheFilePath));
         }
 
         private string GetMimeType(ImageFormat format, string path)

+ 2 - 2
MediaBrowser.Api/GamesService.cs

@@ -108,7 +108,7 @@ namespace MediaBrowser.Api
                 IncludeItemTypes = new[] { typeof(GameSystem).Name }
             };
             var parentIds = new string[] { } ;
-            var gameSystems = _libraryManager.GetItems(query, user, parentIds)
+            var gameSystems = _libraryManager.GetItems(query, parentIds)
                 .Cast<GameSystem>()
                 .ToList();
 
@@ -129,7 +129,7 @@ namespace MediaBrowser.Api
                 IncludeItemTypes = new[] { typeof(Game).Name }
             };
             var parentIds = new string[] { };
-            var games = _libraryManager.GetItems(query, user, parentIds)
+            var games = _libraryManager.GetItems(query, parentIds)
                 .Cast<Game>()
                 .ToList();
 

+ 1 - 1
MediaBrowser.Api/Images/ImageService.cs

@@ -698,7 +698,7 @@ namespace MediaBrowser.Api.Images
 
             var userAgent = Request.UserAgent ?? string.Empty;
 
-            if (userAgent.IndexOf("crosswalk", StringComparison.OrdinalIgnoreCase) != -1 &&
+            if (userAgent.IndexOf("dalvik", StringComparison.OrdinalIgnoreCase) != -1 &&
                 userAgent.IndexOf("android", StringComparison.OrdinalIgnoreCase) != -1)
             {
                 supportsWebP = true;

+ 7 - 7
MediaBrowser.Api/Library/LibraryService.cs

@@ -610,7 +610,7 @@ namespace MediaBrowser.Api.Library
 
             var dtoOptions = GetDtoOptions(request);
 
-            BaseItem parent = item.Parent;
+            BaseItem parent = item.GetParent();
 
             while (parent != null)
             {
@@ -621,7 +621,7 @@ namespace MediaBrowser.Api.Library
 
                 baseItemDtos.Add(_dtoService.GetBaseItemDto(parent, dtoOptions, user));
 
-                parent = parent.Parent;
+                parent = parent.GetParent();
             }
 
             return baseItemDtos.ToList();
@@ -629,7 +629,7 @@ namespace MediaBrowser.Api.Library
 
         private BaseItem TranslateParentItem(BaseItem item, User user)
         {
-            if (item.Parent is AggregateFolder)
+            if (item.GetParent() is AggregateFolder)
             {
                 return user.RootFolder.GetChildren(user, true).FirstOrDefault(i => i.PhysicalLocations.Contains(item.Path));
             }
@@ -861,9 +861,9 @@ namespace MediaBrowser.Api.Library
                                   : (Folder)_libraryManager.RootFolder)
                            : _libraryManager.GetItemById(request.Id);
 
-            while (GetThemeSongIds(item).Count == 0 && request.InheritFromParent && item.Parent != null)
+            while (GetThemeSongIds(item).Count == 0 && request.InheritFromParent && item.GetParent() != null)
             {
-                item = item.Parent;
+                item = item.GetParent();
             }
 
             var dtoOptions = GetDtoOptions(request);
@@ -904,9 +904,9 @@ namespace MediaBrowser.Api.Library
                                   : (Folder)_libraryManager.RootFolder)
                            : _libraryManager.GetItemById(request.Id);
 
-            while (GetThemeVideoIds(item).Count == 0 && request.InheritFromParent && item.Parent != null)
+            while (GetThemeVideoIds(item).Count == 0 && request.InheritFromParent && item.GetParent() != null)
             {
-                item = item.Parent;
+                item = item.GetParent();
             }
 
             var dtoOptions = GetDtoOptions(request);

+ 2 - 2
MediaBrowser.Api/Movies/MoviesService.cs

@@ -139,7 +139,7 @@ namespace MediaBrowser.Api.Movies
                 IncludeItemTypes = new[] { typeof(Movie).Name }
             };
             var parentIds = string.IsNullOrWhiteSpace(request.ParentId) ? new string[] { } : new[] { request.ParentId };
-            var movies = _libraryManager.GetItems(query, user, parentIds);
+            var movies = _libraryManager.GetItems(query, parentIds);
             movies = _libraryManager.ReplaceVideosWithPrimaryVersions(movies);
 
             var listEligibleForCategories = new List<BaseItem>();
@@ -195,7 +195,7 @@ namespace MediaBrowser.Api.Movies
                 IncludeItemTypes = new[] { typeof(Movie).Name }
             };
             var parentIds = new string[] { };
-            var list = _libraryManager.GetItems(query, user, parentIds)
+            var list = _libraryManager.GetItems(query, parentIds)
                 .Where(i =>
                 {
                     // Strip out secondary versions

+ 1 - 1
MediaBrowser.Api/SearchService.cs

@@ -283,7 +283,7 @@ namespace MediaBrowser.Api
         private T GetParentWithImage<T>(BaseItem item, ImageType type)
             where T : BaseItem
         {
-            return item.Parents.OfType<T>().FirstOrDefault(i => i.HasImage(type));
+            return item.GetParents().OfType<T>().FirstOrDefault(i => i.HasImage(type));
         }
     }
 }

+ 1 - 1
MediaBrowser.Api/StartupWizardService.cs

@@ -70,10 +70,10 @@ namespace MediaBrowser.Api
             _config.Configuration.EnableStandaloneMetadata = true;
             _config.Configuration.EnableLibraryMetadataSubFolder = true;
             _config.Configuration.EnableCustomPathSubFolders = true;
-            _config.Configuration.DisableXmlSavers = true;
             _config.Configuration.DisableStartupScan = true;
             _config.Configuration.EnableUserViews = true;
             _config.Configuration.EnableDateLastRefresh = true;
+            _config.Configuration.EnableSharedCollectionViewImage = true;
             _config.SaveConfiguration();
         }
 

+ 1 - 0
MediaBrowser.Api/UserLibrary/UserViewsService.cs

@@ -80,6 +80,7 @@ namespace MediaBrowser.Api.UserLibrary
             var dtoOptions = GetDtoOptions(request);
             dtoOptions.Fields = new List<ItemFields>();
             dtoOptions.Fields.Add(ItemFields.PrimaryImageAspectRatio);
+            dtoOptions.Fields.Add(ItemFields.DisplayPreferencesId);
 
             var user = _userManager.GetUserById(request.UserId);
 

+ 2 - 2
MediaBrowser.Controller/Entities/Audio/MusicAlbum.cs

@@ -30,7 +30,7 @@ namespace MediaBrowser.Controller.Entities.Audio
         {
             get
             {
-                return Parents.OfType<MusicArtist>().FirstOrDefault();
+                return GetParents().OfType<MusicArtist>().FirstOrDefault();
             }
         }
 
@@ -121,7 +121,7 @@ namespace MediaBrowser.Controller.Entities.Audio
 
             id.AlbumArtists = AlbumArtists;
 
-            var artist = Parents.OfType<MusicArtist>().FirstOrDefault();
+            var artist = GetParents().OfType<MusicArtist>().FirstOrDefault();
 
             if (artist != null)
             {

+ 29 - 30
MediaBrowser.Controller/Entities/BaseItem.cs

@@ -214,11 +214,6 @@ namespace MediaBrowser.Controller.Entities
             }
         }
 
-        public virtual bool IsHiddenFromUser(User user)
-        {
-            return false;
-        }
-
         [IgnoreDataMember]
         public virtual bool IsOwnedItem
         {
@@ -519,15 +514,7 @@ namespace MediaBrowser.Controller.Entities
         [IgnoreDataMember]
         public Folder Parent
         {
-            get
-            {
-                if (ParentId != Guid.Empty)
-                {
-                    return LibraryManager.GetItemById(ParentId) as Folder;
-                }
-
-                return null;
-            }
+            get { return GetParent() as Folder; }
             set
             {
 
@@ -542,16 +529,28 @@ namespace MediaBrowser.Controller.Entities
         [IgnoreDataMember]
         public IEnumerable<Folder> Parents
         {
-            get
+            get { return GetParents().OfType<Folder>(); }
+        }
+
+        public BaseItem GetParent()
+        {
+            if (ParentId != Guid.Empty)
             {
-                var parent = Parent;
+                return LibraryManager.GetItemById(ParentId);
+            }
 
-                while (parent != null)
-                {
-                    yield return parent;
+            return null;
+        }
 
-                    parent = parent.Parent;
-                }
+        public IEnumerable<BaseItem> GetParents()
+        {
+            var parent = GetParent();
+
+            while (parent != null)
+            {
+                yield return parent;
+
+                parent = parent.GetParent();
             }
         }
 
@@ -563,13 +562,13 @@ namespace MediaBrowser.Controller.Entities
         public T FindParent<T>()
             where T : Folder
         {
-            return Parents.OfType<T>().FirstOrDefault();
+            return GetParents().OfType<T>().FirstOrDefault();
         }
 
         [IgnoreDataMember]
         public virtual BaseItem DisplayParent
         {
-            get { return Parent; }
+            get { return GetParent(); }
         }
 
         /// <summary>
@@ -869,7 +868,7 @@ namespace MediaBrowser.Controller.Entities
         [IgnoreDataMember]
         protected virtual bool SupportsOwnedItems
         {
-            get { return IsFolder || Parent != null; }
+            get { return IsFolder || GetParent() != null; }
         }
 
         [IgnoreDataMember]
@@ -894,7 +893,7 @@ namespace MediaBrowser.Controller.Entities
 
             var localTrailersChanged = false;
 
-            if (LocationType == LocationType.FileSystem && Parent != null)
+            if (LocationType == LocationType.FileSystem && GetParent() != null)
             {
                 var hasThemeMedia = this as IHasThemeMedia;
                 if (hasThemeMedia != null)
@@ -1056,7 +1055,7 @@ namespace MediaBrowser.Controller.Entities
 
             if (string.IsNullOrWhiteSpace(lang))
             {
-                lang = Parents
+                lang = GetParents()
                     .Select(i => i.PreferredMetadataLanguage)
                     .FirstOrDefault(i => !string.IsNullOrWhiteSpace(i));
             }
@@ -1086,7 +1085,7 @@ namespace MediaBrowser.Controller.Entities
 
             if (string.IsNullOrWhiteSpace(lang))
             {
-                lang = Parents
+                lang = GetParents()
                     .Select(i => i.PreferredMetadataCountryCode)
                     .FirstOrDefault(i => !string.IsNullOrWhiteSpace(i));
             }
@@ -1276,14 +1275,14 @@ namespace MediaBrowser.Controller.Entities
                 return false;
             }
 
-            if (Parents.Any(i => !i.IsVisible(user)))
+            if (GetParents().Any(i => !i.IsVisible(user)))
             {
                 return false;
             }
 
             if (checkFolders)
             {
-                var topParent = Parents.LastOrDefault() ?? this;
+                var topParent = GetParents().LastOrDefault() ?? this;
 
                 if (string.IsNullOrWhiteSpace(topParent.Path))
                 {
@@ -1937,7 +1936,7 @@ namespace MediaBrowser.Controller.Entities
 
         public virtual IEnumerable<Guid> GetAncestorIds()
         {
-            return Parents.Select(i => i.Id).Concat(LibraryManager.GetCollectionFolders(this).Select(i => i.Id));
+            return GetParents().Select(i => i.Id).Concat(LibraryManager.GetCollectionFolders(this).Select(i => i.Id));
         }
 
         [IgnoreDataMember]

+ 1 - 1
MediaBrowser.Controller/Entities/Book.cs

@@ -37,7 +37,7 @@ namespace MediaBrowser.Controller.Entities
 
             if (string.IsNullOrEmpty(SeriesName))
             {
-                info.SeriesName = Parents.Select(i => i.Name).FirstOrDefault();
+                info.SeriesName = GetParents().Select(i => i.Name).FirstOrDefault();
             }
             else
             {

+ 6 - 22
MediaBrowser.Controller/Entities/Folder.cs

@@ -825,19 +825,7 @@ namespace MediaBrowser.Controller.Entities
             return UserViewBuilder.PostFilterAndSort(items, this, null, query, LibraryManager);
         }
 
-        /// <summary>
-        /// Gets allowed children of an item
-        /// </summary>
-        /// <param name="user">The user.</param>
-        /// <param name="includeLinkedChildren">if set to <c>true</c> [include linked children].</param>
-        /// <returns>IEnumerable{BaseItem}.</returns>
-        /// <exception cref="System.ArgumentNullException"></exception>
         public virtual IEnumerable<BaseItem> GetChildren(User user, bool includeLinkedChildren)
-        {
-            return GetChildren(user, includeLinkedChildren, false);
-        }
-
-        internal IEnumerable<BaseItem> GetChildren(User user, bool includeLinkedChildren, bool includeHidden)
         {
             if (user == null)
             {
@@ -849,7 +837,7 @@ namespace MediaBrowser.Controller.Entities
 
             var result = new Dictionary<Guid, BaseItem>();
 
-            AddChildren(user, includeLinkedChildren, result, includeHidden, false, null);
+            AddChildren(user, includeLinkedChildren, result, false, null);
 
             return result.Values;
         }
@@ -865,29 +853,25 @@ namespace MediaBrowser.Controller.Entities
         /// <param name="user">The user.</param>
         /// <param name="includeLinkedChildren">if set to <c>true</c> [include linked children].</param>
         /// <param name="result">The result.</param>
-        /// <param name="includeHidden">if set to <c>true</c> [include hidden].</param>
         /// <param name="recursive">if set to <c>true</c> [recursive].</param>
         /// <param name="filter">The filter.</param>
         /// <returns><c>true</c> if XXXX, <c>false</c> otherwise</returns>
-        private void AddChildren(User user, bool includeLinkedChildren, Dictionary<Guid, BaseItem> result, bool includeHidden, bool recursive, Func<BaseItem, bool> filter)
+        private void AddChildren(User user, bool includeLinkedChildren, Dictionary<Guid, BaseItem> result, bool recursive, Func<BaseItem, bool> filter)
         {
             foreach (var child in GetEligibleChildrenForRecursiveChildren(user))
             {
                 if (child.IsVisible(user))
                 {
-                    if (includeHidden || !child.IsHiddenFromUser(user))
+                    if (filter == null || filter(child))
                     {
-                        if (filter == null || filter(child))
-                        {
-                            result[child.Id] = child;
-                        }
+                        result[child.Id] = child;
                     }
 
                     if (recursive && child.IsFolder)
                     {
                         var folder = (Folder)child;
 
-                        folder.AddChildren(user, includeLinkedChildren, result, includeHidden, true, filter);
+                        folder.AddChildren(user, includeLinkedChildren, result, true, filter);
                     }
                 }
             }
@@ -928,7 +912,7 @@ namespace MediaBrowser.Controller.Entities
 
             var result = new Dictionary<Guid, BaseItem>();
 
-            AddChildren(user, true, result, false, true, filter);
+            AddChildren(user, true, result, true, filter);
 
             return result.Values;
         }

+ 18 - 0
MediaBrowser.Controller/Entities/IHiddenFromDisplay.cs

@@ -0,0 +1,18 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace MediaBrowser.Controller.Entities
+{
+    public interface IHiddenFromDisplay
+    {
+        /// <summary>
+        /// Determines whether the specified user is hidden.
+        /// </summary>
+        /// <param name="user">The user.</param>
+        /// <returns><c>true</c> if the specified user is hidden; otherwise, <c>false</c>.</returns>
+        bool IsHiddenFromUser(User user);
+    }
+}

+ 1 - 1
MediaBrowser.Controller/Entities/Movies/Movie.cs

@@ -130,7 +130,7 @@ namespace MediaBrowser.Controller.Entities.Movies
 
             // Must have a parent to have special features
             // In other words, it must be part of the Parent/Child tree
-            if (LocationType == LocationType.FileSystem && Parent != null && !IsInMixedFolder)
+            if (LocationType == LocationType.FileSystem && GetParent() != null && !IsInMixedFolder)
             {
                 var specialFeaturesChanged = await RefreshSpecialFeatures(options, fileSystemChildren, cancellationToken).ConfigureAwait(false);
 

+ 1 - 1
MediaBrowser.Controller/Entities/Photo.cs

@@ -49,7 +49,7 @@ namespace MediaBrowser.Controller.Entities
         {
             get
             {
-                return Parents.OfType<PhotoAlbum>().FirstOrDefault();
+                return GetParents().OfType<PhotoAlbum>().FirstOrDefault();
             }
         }
 

+ 1 - 1
MediaBrowser.Controller/Entities/TV/Episode.cs

@@ -95,7 +95,7 @@ namespace MediaBrowser.Controller.Entities.TV
         {
             get
             {
-                return Season ?? Parent;
+                return Season ?? GetParent();
             }
         }
 

+ 1 - 1
MediaBrowser.Controller/Entities/TV/Season.cs

@@ -33,7 +33,7 @@ namespace MediaBrowser.Controller.Entities.TV
         [IgnoreDataMember]
         public override BaseItem DisplayParent
         {
-            get { return Series ?? Parent; }
+            get { return Series ?? GetParent(); }
         }
 
         // Genre, Rating and Stuido will all be the same

+ 1 - 1
MediaBrowser.Controller/Entities/Trailer.cs

@@ -73,7 +73,7 @@ namespace MediaBrowser.Controller.Entities
             get
             {
                 // Local trailers are not part of children
-                return Parent == null;
+                return GetParent() == null;
             }
         }
 

+ 10 - 2
MediaBrowser.Controller/Entities/UserView.cs

@@ -38,6 +38,10 @@ namespace MediaBrowser.Controller.Entities
             {
                 list.Add(ParentId);
             }
+            else
+            {
+                list.Add(Id);
+            }
             return list;
         }
 
@@ -125,10 +129,14 @@ namespace MediaBrowser.Controller.Entities
         {
             var standaloneTypes = new List<string>
             {
-                CollectionType.Playlists,
-                CollectionType.BoxSets
+                CollectionType.Playlists
             };
 
+            if (!ConfigurationManager.Configuration.EnableSharedCollectionViewImage)
+            {
+                standaloneTypes.Add(CollectionType.BoxSets);
+            }
+
             var collectionFolder = folder as ICollectionFolder;
 
             if (collectionFolder == null)

+ 2 - 2
MediaBrowser.Controller/Entities/UserViewBuilder.cs

@@ -1073,7 +1073,7 @@ namespace MediaBrowser.Controller.Entities
             if (query.IsInBoxSet.HasValue)
             {
                 var val = query.IsInBoxSet.Value;
-                if (item.Parents.OfType<BoxSet>().Any() != val)
+                if (item.GetParents().OfType<BoxSet>().Any() != val)
                 {
                     return false;
                 }
@@ -1511,7 +1511,7 @@ namespace MediaBrowser.Controller.Entities
                     .Where(i => !UserView.IsExcludedFromGrouping(i));
             }
             return user.RootFolder
-                .GetChildren(user, true, true)
+                .GetChildren(user, true)
                 .OfType<Folder>()
                 .Where(i => user.IsFolderGrouped(i.Id) && !UserView.IsExcludedFromGrouping(i));
         }

+ 1 - 1
MediaBrowser.Controller/Entities/Video.cs

@@ -352,7 +352,7 @@ namespace MediaBrowser.Controller.Entities
             // Must have a parent to have additional parts or alternate versions
             // In other words, it must be part of the Parent/Child tree
             // The additional parts won't have additional parts themselves
-            if (LocationType == LocationType.FileSystem && Parent != null)
+            if (LocationType == LocationType.FileSystem && GetParent() != null)
             {
                 if (!IsStacked)
                 {

+ 1 - 2
MediaBrowser.Controller/Library/ILibraryManager.cs

@@ -548,10 +548,9 @@ namespace MediaBrowser.Controller.Library
         /// Gets the items.
         /// </summary>
         /// <param name="query">The query.</param>
-        /// <param name="user">The user.</param>
         /// <param name="parentIds">The parent ids.</param>
         /// <returns>List&lt;BaseItem&gt;.</returns>
-        IEnumerable<BaseItem> GetItems(InternalItemsQuery query, User user, IEnumerable<string> parentIds);
+        IEnumerable<BaseItem> GetItems(InternalItemsQuery query, IEnumerable<string> parentIds);
 
         /// <summary>
         /// Gets the items result.

+ 1 - 1
MediaBrowser.Controller/Library/ItemResolveArgs.cs

@@ -155,7 +155,7 @@ namespace MediaBrowser.Controller.Library
                 // Not officially supported but in some cases we can handle it.
                 if (item == null)
                 {
-                    item = parent.Parents.OfType<T>().FirstOrDefault();
+                    item = parent.GetParents().OfType<T>().FirstOrDefault();
                 }
 
                 return item != null;

+ 1 - 0
MediaBrowser.Controller/MediaBrowser.Controller.csproj

@@ -162,6 +162,7 @@
     <Compile Include="Entities\IHasThemeMedia.cs" />
     <Compile Include="Entities\IHasTrailers.cs" />
     <Compile Include="Entities\IHasUserData.cs" />
+    <Compile Include="Entities\IHiddenFromDisplay.cs" />
     <Compile Include="Entities\IItemByName.cs" />
     <Compile Include="Entities\ILibraryItem.cs" />
     <Compile Include="Entities\ImageSourceInfo.cs" />

+ 1 - 1
MediaBrowser.Dlna/Didl/DidlBuilder.cs

@@ -959,7 +959,7 @@ namespace MediaBrowser.Dlna.Didl
                 }
             }
 
-            item = item.Parents.FirstOrDefault(i => i.HasImage(ImageType.Primary));
+            item = item.GetParents().FirstOrDefault(i => i.HasImage(ImageType.Primary));
 
             if (item != null)
             {

+ 1 - 1
MediaBrowser.Model/Configuration/ServerConfiguration.cs

@@ -225,7 +225,6 @@ namespace MediaBrowser.Model.Configuration
 
         public int SharingExpirationDays { get; set; }
 
-        public bool DisableXmlSavers { get; set; }
         public bool EnableWindowsShortcuts { get; set; }
 
         public bool EnableVideoFrameByFrameAnalysis { get; set; }
@@ -236,6 +235,7 @@ namespace MediaBrowser.Model.Configuration
 
         public int MigrationVersion { get; set; }
         public bool EnableImagePreDownloading { get; set; }
+        public bool EnableSharedCollectionViewImage { get; set; }
 
         /// <summary>
         /// Initializes a new instance of the <see cref="ServerConfiguration" /> class.

+ 6 - 0
MediaBrowser.Model/Library/UserViewQuery.cs

@@ -15,6 +15,12 @@ namespace MediaBrowser.Model.Library
         /// <value><c>true</c> if [include external content]; otherwise, <c>false</c>.</value>
         public bool IncludeExternalContent { get; set; }
 
+        /// <summary>
+        /// Gets or sets a value indicating whether [include hidden].
+        /// </summary>
+        /// <value><c>true</c> if [include hidden]; otherwise, <c>false</c>.</value>
+        public bool IncludeHidden { get; set; }
+
         public UserViewQuery()
         {
             IncludeExternalContent = true;

+ 1 - 1
MediaBrowser.Providers/Manager/ProviderManager.cs

@@ -1035,7 +1035,7 @@ namespace MediaBrowser.Providers.Manager
                                         .ToList();
 
             var musicArtists = albums
-                .Select(i => i.Parent)
+                .Select(i => i.GetParent())
                 .OfType<MusicArtist>()
                 .ToList();
 

+ 1 - 1
MediaBrowser.Server.Implementations/Collections/CollectionImageProvider.cs

@@ -59,7 +59,7 @@ namespace MediaBrowser.Server.Implementations.Collections
                         return subItem;
                     }
 
-                    var parent = subItem.Parent;
+                    var parent = subItem.GetParent();
 
                     if (parent != null && parent.HasImage(ImageType.Primary))
                     {

+ 3 - 3
MediaBrowser.Server.Implementations/Collections/ManualCollectionsFolder.cs

@@ -3,7 +3,7 @@ using System.Linq;
 
 namespace MediaBrowser.Server.Implementations.Collections
 {
-    public class ManualCollectionsFolder : BasePluginFolder
+    public class ManualCollectionsFolder : BasePluginFolder, IHiddenFromDisplay
     {
         public ManualCollectionsFolder()
         {
@@ -19,7 +19,7 @@ namespace MediaBrowser.Server.Implementations.Collections
             }
         }
 
-        public override bool IsHiddenFromUser(User user)
+        public bool IsHiddenFromUser(User user)
         {
             return !user.Configuration.DisplayCollectionsView;
         }
@@ -31,7 +31,7 @@ namespace MediaBrowser.Server.Implementations.Collections
 
         public override string GetClientTypeName()
         {
-            return typeof (CollectionFolder).Name;
+            return typeof(CollectionFolder).Name;
         }
     }
 }

+ 13 - 13
MediaBrowser.Server.Implementations/Dto/DtoService.cs

@@ -167,7 +167,7 @@ namespace MediaBrowser.Server.Implementations.Dto
                 {
                     Person = byName.Name
 
-                }, user, new string[] { });
+                }, new string[] { });
 
                 return items.ToList();
             }
@@ -812,7 +812,7 @@ namespace MediaBrowser.Server.Implementations.Dto
         /// <returns>BaseItem.</returns>
         private BaseItem GetParentBackdropItem(BaseItem item, BaseItem owner)
         {
-            var parent = item.Parent ?? owner;
+            var parent = item.GetParent() ?? owner;
 
             while (parent != null)
             {
@@ -821,7 +821,7 @@ namespace MediaBrowser.Server.Implementations.Dto
                     return parent;
                 }
 
-                parent = parent.Parent;
+                parent = parent.GetParent();
             }
 
             return null;
@@ -836,7 +836,7 @@ namespace MediaBrowser.Server.Implementations.Dto
         /// <returns>BaseItem.</returns>
         private BaseItem GetParentImageItem(BaseItem item, ImageType type, BaseItem owner)
         {
-            var parent = item.Parent ?? owner;
+            var parent = item.GetParent() ?? owner;
 
             while (parent != null)
             {
@@ -845,7 +845,7 @@ namespace MediaBrowser.Server.Implementations.Dto
                     return parent;
                 }
 
-                parent = parent.Parent;
+                parent = parent.GetParent();
             }
 
             return null;
@@ -1210,15 +1210,15 @@ namespace MediaBrowser.Server.Implementations.Dto
                 dto.VoteCount = item.VoteCount;
             }
 
-            if (item.IsFolder)
-            {
-                var folder = (Folder)item;
+            //if (item.IsFolder)
+            //{
+            //    var folder = (Folder)item;
 
-                if (fields.Contains(ItemFields.IndexOptions))
-                {
-                    dto.IndexOptions = folder.IndexByOptionStrings.ToArray();
-                }
-            }
+            //    if (fields.Contains(ItemFields.IndexOptions))
+            //    {
+            //        dto.IndexOptions = folder.IndexByOptionStrings.ToArray();
+            //    }
+            //}
 
             var supportsPlaceHolders = item as ISupportsPlaceHolders;
             if (supportsPlaceHolders != null)

+ 1 - 1
MediaBrowser.Server.Implementations/EntryPoints/UserDataChangeNotifier.cs

@@ -74,7 +74,7 @@ namespace MediaBrowser.Server.Implementations.EntryPoints
                 // Go up one level for indicators
                 if (baseItem != null)
                 {
-                    var parent = baseItem.Parent;
+                    var parent = baseItem.GetParent();
 
                     if (parent != null)
                     {

+ 3 - 3
MediaBrowser.Server.Implementations/IO/LibraryMonitor.cs

@@ -217,7 +217,7 @@ namespace MediaBrowser.Server.Implementations.IO
         /// <param name="e">The <see cref="ItemChangeEventArgs"/> instance containing the event data.</param>
         void LibraryManager_ItemRemoved(object sender, ItemChangeEventArgs e)
         {
-            if (e.Item.Parent is AggregateFolder)
+            if (e.Item.GetParent() is AggregateFolder)
             {
                 StopWatchingPath(e.Item.Path);
             }
@@ -230,7 +230,7 @@ namespace MediaBrowser.Server.Implementations.IO
         /// <param name="e">The <see cref="ItemChangeEventArgs"/> instance containing the event data.</param>
         void LibraryManager_ItemAdded(object sender, ItemChangeEventArgs e)
         {
-            if (e.Item.Parent is AggregateFolder)
+            if (e.Item.GetParent() is AggregateFolder)
             {
                 StartWatchingPath(e.Item.Path);
             }
@@ -658,7 +658,7 @@ namespace MediaBrowser.Server.Implementations.IO
                 // If the item has been deleted find the first valid parent that still exists
 				while (!_fileSystem.DirectoryExists(item.Path) && !_fileSystem.FileExists(item.Path))
                 {
-                    item = item.Parent;
+                    item = item.GetParent();
 
                     if (item == null)
                     {

+ 1 - 1
MediaBrowser.Server.Implementations/Intros/DefaultIntroProvider.cs

@@ -87,7 +87,7 @@ namespace MediaBrowser.Server.Implementations.Intros
                 {
                     IncludeItemTypes = new[] { typeof(Movie).Name }
 
-                }, user, new string[]{});
+                }, new string[]{});
 
                 var itemsWithTrailers = inputItems
                     .Where(i =>

+ 19 - 8
MediaBrowser.Server.Implementations/Library/LibraryManager.cs

@@ -27,6 +27,7 @@ using MediaBrowser.Server.Implementations.Library.Validators;
 using MediaBrowser.Server.Implementations.Logging;
 using MediaBrowser.Server.Implementations.ScheduledTasks;
 using System;
+using System.Collections;
 using System.Collections.Concurrent;
 using System.Collections.Generic;
 using System.Globalization;
@@ -36,6 +37,7 @@ using System.Threading;
 using System.Threading.Tasks;
 using CommonIO;
 using MediaBrowser.Model.Extensions;
+using MediaBrowser.Model.Library;
 using MoreLinq;
 using SortOrder = MediaBrowser.Model.Entities.SortOrder;
 
@@ -140,6 +142,7 @@ namespace MediaBrowser.Server.Implementations.Library
 
         private readonly Func<ILibraryMonitor> _libraryMonitorFactory;
         private readonly Func<IProviderManager> _providerManagerFactory;
+        private readonly Func<IUserViewManager> _userviewManager;
 
         /// <summary>
         /// The _library items cache
@@ -167,7 +170,7 @@ namespace MediaBrowser.Server.Implementations.Library
         /// <param name="userManager">The user manager.</param>
         /// <param name="configurationManager">The configuration manager.</param>
         /// <param name="userDataRepository">The user data repository.</param>
-        public LibraryManager(ILogger logger, ITaskManager taskManager, IUserManager userManager, IServerConfigurationManager configurationManager, IUserDataManager userDataRepository, Func<ILibraryMonitor> libraryMonitorFactory, IFileSystem fileSystem, Func<IProviderManager> providerManagerFactory)
+        public LibraryManager(ILogger logger, ITaskManager taskManager, IUserManager userManager, IServerConfigurationManager configurationManager, IUserDataManager userDataRepository, Func<ILibraryMonitor> libraryMonitorFactory, IFileSystem fileSystem, Func<IProviderManager> providerManagerFactory, Func<IUserViewManager> userviewManager)
         {
             _logger = logger;
             _taskManager = taskManager;
@@ -177,6 +180,7 @@ namespace MediaBrowser.Server.Implementations.Library
             _libraryMonitorFactory = libraryMonitorFactory;
             _fileSystem = fileSystem;
             _providerManagerFactory = providerManagerFactory;
+            _userviewManager = userviewManager;
             ByReferenceItems = new ConcurrentDictionary<Guid, BaseItem>();
             _libraryItemsCache = new ConcurrentDictionary<Guid, BaseItem>();
 
@@ -1307,7 +1311,7 @@ namespace MediaBrowser.Server.Implementations.Library
             return ItemRepository.GetItemIdsList(query);
         }
 
-        public IEnumerable<BaseItem> GetItems(InternalItemsQuery query, User user, IEnumerable<string> parentIds)
+        public IEnumerable<BaseItem> GetItems(InternalItemsQuery query, IEnumerable<string> parentIds)
         {
             var parents = parentIds.Select(i => GetItemById(new Guid(i))).ToList();
 
@@ -1329,7 +1333,14 @@ namespace MediaBrowser.Server.Implementations.Library
         {
             if (query.AncestorIds.Length == 0 && !query.ParentId.HasValue && query.ChannelIds.Length == 0)
             {
-                // TODO: Need to filter on user folders
+                //var userViews = _userviewManager().GetUserViews(new UserViewQuery
+                //{
+                //    UserId = user.Id.ToString("N"),
+                //    IncludeHidden = true
+
+                //}, CancellationToken.None).Result.ToList();
+
+                //query.AncestorIds = userViews.SelectMany(i => i.GetIdsForAncestorQuery()).Distinct().Select(i => i.ToString("N")).ToArray();
             }
 
             // TODO: handle blocking by tags
@@ -1634,9 +1645,9 @@ namespace MediaBrowser.Server.Implementations.Library
 
         public IEnumerable<Folder> GetCollectionFolders(BaseItem item)
         {
-            while (!(item.Parent is AggregateFolder) && item.Parent != null)
+            while (!(item.GetParent() is AggregateFolder) && item.GetParent() != null)
             {
-                item = item.Parent;
+                item = item.GetParent();
             }
 
             if (item == null)
@@ -1673,7 +1684,7 @@ namespace MediaBrowser.Server.Implementations.Library
                 return type;
             }
 
-            return item.Parents
+            return item.GetParents()
                 .Select(GetConfiguredContentType)
                 .LastOrDefault(i => !string.IsNullOrWhiteSpace(i));
         }
@@ -1710,9 +1721,9 @@ namespace MediaBrowser.Server.Implementations.Library
 
         private string GetTopFolderContentType(BaseItem item)
         {
-            while (!(item.Parent is AggregateFolder) && item.Parent != null)
+            while (!(item.GetParent() is AggregateFolder) && item.GetParent() != null)
             {
-                item = item.Parent;
+                item = item.GetParent();
             }
 
             if (item == null)

+ 1 - 1
MediaBrowser.Server.Implementations/Library/MusicManager.cs

@@ -86,7 +86,7 @@ namespace MediaBrowser.Server.Implementations.Library
 
                 Genres = genreList.ToArray()
 
-            }, user, new string[] { });
+            }, new string[] { });
 
             var genresDictionary = genreList.ToDictionary(i => i, StringComparer.OrdinalIgnoreCase);
 

+ 2 - 2
MediaBrowser.Server.Implementations/Library/ResolverHelper.cs

@@ -41,7 +41,7 @@ namespace MediaBrowser.Server.Implementations.Library
             item.Id = libraryManager.GetNewItemId(item.Path, item.GetType());
 
             item.IsLocked = item.Path.IndexOf("[dontfetchmeta]", StringComparison.OrdinalIgnoreCase) != -1 ||
-                item.Parents.Any(i => i.IsLocked);
+                item.GetParents().Any(i => i.IsLocked);
 
             // Make sure DateCreated and DateModified have values
             var fileInfo = directoryService.GetFile(item.Path);
@@ -78,7 +78,7 @@ namespace MediaBrowser.Server.Implementations.Library
             EnsureName(item, args.FileInfo);
 
             item.IsLocked = item.Path.IndexOf("[dontfetchmeta]", StringComparison.OrdinalIgnoreCase) != -1 ||
-                item.Parents.Any(i => i.IsLocked);
+                item.GetParents().Any(i => i.IsLocked);
 
             // Make sure DateCreated and DateModified have values
             EnsureDates(fileSystem, item, args, true);

+ 1 - 1
MediaBrowser.Server.Implementations/Library/Resolvers/Movies/MovieResolver.cs

@@ -95,7 +95,7 @@ namespace MediaBrowser.Server.Implementations.Library.Resolvers.Movies
                     return ResolveVideos<Video>(parent, files, directoryService, false);
                 }
 
-                if (parent is Series || parent.Parents.OfType<Series>().Any())
+                if (parent is Series || parent.GetParents().OfType<Series>().Any())
                 {
                     return null;
                 }

+ 1 - 1
MediaBrowser.Server.Implementations/Library/Resolvers/TV/EpisodeResolver.cs

@@ -33,7 +33,7 @@ namespace MediaBrowser.Server.Implementations.Library.Resolvers.TV
             // Not officially supported but in some cases we can handle it.
             if (season == null)
             {
-                season = parent.Parents.OfType<Season>().FirstOrDefault();
+                season = parent.GetParents().OfType<Season>().FirstOrDefault();
             }
 
             // If the parent is a Season or Series, then this is an Episode if the VideoResolver returns something

+ 1 - 1
MediaBrowser.Server.Implementations/Library/SearchEngine.cs

@@ -164,7 +164,7 @@ namespace MediaBrowser.Server.Implementations.Library
                 IncludeItemTypes = includeItemTypes.ToArray(),
                 Limit = query.Limit,
 
-            }, user, new string[] { });
+            }, new string[] { });
 
             // Add search hints based on item name
             hints.AddRange(mediaItems.Where(IncludeInSearch).Select(item =>

+ 13 - 4
MediaBrowser.Server.Implementations/Library/UserViewManager.cs

@@ -49,6 +49,15 @@ namespace MediaBrowser.Server.Implementations.Library
                 .OfType<Folder>()
                 .ToList();
 
+            if (!query.IncludeHidden)
+            {
+                folders = folders.Where(i =>
+                {
+                    var hidden = i as IHiddenFromDisplay;
+                    return hidden == null || !hidden.IsHiddenFromUser(user);
+                }).ToList();
+            }
+
             var plainFolderIds = user.Configuration.PlainFolderViews.Select(i => new Guid(i)).ToList();
 
             var standaloneFolders = folders
@@ -121,7 +130,7 @@ namespace MediaBrowser.Server.Implementations.Library
 
             if (parents.Count > 0)
             {
-                list.Add(await GetUserView(parents, list, CollectionType.TvShows, string.Empty, user, enableUserViews, cancellationToken).ConfigureAwait(false));
+                list.Add(await GetUserView(parents, CollectionType.TvShows, string.Empty, user, enableUserViews, cancellationToken).ConfigureAwait(false));
             }
 
             parents = foldersWithViewTypes.Where(i => string.Equals(i.GetViewType(user), CollectionType.Movies, StringComparison.OrdinalIgnoreCase) || string.IsNullOrWhiteSpace(i.GetViewType(user)))
@@ -129,7 +138,7 @@ namespace MediaBrowser.Server.Implementations.Library
 
             if (parents.Count > 0)
             {
-                list.Add(await GetUserView(parents, list, CollectionType.Movies, string.Empty, user, enableUserViews, cancellationToken).ConfigureAwait(false));
+                list.Add(await GetUserView(parents, CollectionType.Movies, string.Empty, user, enableUserViews, cancellationToken).ConfigureAwait(false));
             }
 
             if (user.Configuration.DisplayFoldersView)
@@ -194,7 +203,7 @@ namespace MediaBrowser.Server.Implementations.Library
             return GetUserSubView(name, parentId, type, sortName, cancellationToken);
         }
 
-        private async Task<UserView> GetUserView(List<ICollectionFolder> parents, List<Folder> currentViews, string viewType, string sortName, User user, bool enableUserViews, CancellationToken cancellationToken)
+        private async Task<UserView> GetUserView(List<ICollectionFolder> parents, string viewType, string sortName, User user, bool enableUserViews, CancellationToken cancellationToken)
         {
             if (parents.Count == 1 && parents.All(i => string.Equals((enableUserViews ? i.GetViewType(user) : i.CollectionType), viewType, StringComparison.OrdinalIgnoreCase)))
             {
@@ -305,7 +314,7 @@ namespace MediaBrowser.Server.Implementations.Library
                 ExcludeLocationTypes = new[] { LocationType.Virtual },
                 Limit = limit * 20
 
-            }, user, parentIds);
+            }, parentIds);
         }
     }
 }

+ 6 - 5
MediaBrowser.Server.Implementations/LiveTv/LiveTvManager.cs

@@ -1170,7 +1170,8 @@ namespace MediaBrowser.Server.Implementations.LiveTv
             var list = new List<LiveTvChannel>();
 
             var numComplete = 0;
-            var folder = await GetInternalLiveTvFolder(cancellationToken).ConfigureAwait(false);
+            var parentFolder = await GetInternalLiveTvFolder(cancellationToken).ConfigureAwait(false);
+            var parentFolderId = parentFolder.Id;
 
             foreach (var channelInfo in allChannelsList)
             {
@@ -1178,7 +1179,7 @@ namespace MediaBrowser.Server.Implementations.LiveTv
 
                 try
                 {
-                    var item = await GetChannel(channelInfo.Item2, channelInfo.Item1, folder.Id, cancellationToken).ConfigureAwait(false);
+                    var item = await GetChannel(channelInfo.Item2, channelInfo.Item1, parentFolderId, cancellationToken).ConfigureAwait(false);
 
                     list.Add(item);
 
@@ -1390,7 +1391,7 @@ namespace MediaBrowser.Server.Implementations.LiveTv
                 internalQuery.ChannelIds = new[] { query.ChannelId };
             }
 
-            var queryResult = _libraryManager.GetItems(internalQuery, user, new string[] { });
+            var queryResult = _libraryManager.GetItems(internalQuery, new string[] { });
             IEnumerable<ILiveTvRecording> recordings = queryResult.Cast<ILiveTvRecording>();
 
             if (!string.IsNullOrEmpty(query.Id))
@@ -1802,7 +1803,7 @@ namespace MediaBrowser.Server.Implementations.LiveTv
                 Limit = 1,
                 SortBy = new[] { "StartDate" }
 
-            }, user, new string[] { }).Cast<LiveTvProgram>();
+            }, new string[] { }).Cast<LiveTvProgram>();
 
             var currentProgram = programs.FirstOrDefault();
 
@@ -1826,7 +1827,7 @@ namespace MediaBrowser.Server.Implementations.LiveTv
                 Limit = 1,
                 SortBy = new[] { "StartDate" }
 
-            }, user, new string[] { }).Cast<LiveTvProgram>();
+            }, new string[] { }).Cast<LiveTvProgram>();
 
             var currentProgram = programs.FirstOrDefault();
 

+ 3 - 2
MediaBrowser.Server.Implementations/Persistence/SqliteItemRepository.cs

@@ -82,7 +82,7 @@ namespace MediaBrowser.Server.Implementations.Persistence
 
         private IDbCommand _updateInheritedRatingCommand;
         
-        private const int LatestSchemaVersion = 29;
+        private const int LatestSchemaVersion = 32;
 
         /// <summary>
         /// Initializes a new instance of the <see cref="SqliteItemRepository"/> class.
@@ -136,7 +136,8 @@ namespace MediaBrowser.Server.Implementations.Persistence
                                 "create index if not exists idx_ParentIdTypedBaseItems on TypedBaseItems(ParentId)",
 
                                 "create table if not exists AncestorIds (ItemId GUID, AncestorId GUID, AncestorIdText TEXT, PRIMARY KEY (ItemId, AncestorId))",
-                                "create index if not exists idx_AncestorIds on AncestorIds(ItemId,AncestorId)",
+                                "create index if not exists idx_AncestorIds1 on AncestorIds(AncestorId)",
+                                "create index if not exists idx_AncestorIds2 on AncestorIds(AncestorIdText)",
                                 
                                 "create table if not exists ChildrenIds (ParentId GUID, ItemId GUID, PRIMARY KEY (ParentId, ItemId))",
                                 "create index if not exists idx_ChildrenIds on ChildrenIds(ParentId,ItemId)",

+ 1 - 1
MediaBrowser.Server.Implementations/Playlists/PlaylistImageProvider.cs

@@ -47,7 +47,7 @@ namespace MediaBrowser.Server.Implementations.Playlists
                         return subItem;
                     }
 
-                    var parent = subItem.Parent;
+                    var parent = subItem.GetParent();
 
                     if (parent != null && parent.HasImage(ImageType.Primary))
                     {

+ 3 - 3
MediaBrowser.Server.Implementations/Session/SessionManager.cs

@@ -1621,17 +1621,17 @@ namespace MediaBrowser.Server.Implementations.Session
 
             if (backropItem == null)
             {
-                backropItem = item.Parents.FirstOrDefault(i => i.HasImage(ImageType.Backdrop));
+                backropItem = item.GetParents().FirstOrDefault(i => i.HasImage(ImageType.Backdrop));
             }
 
             if (thumbItem == null)
             {
-                thumbItem = item.Parents.FirstOrDefault(i => i.HasImage(ImageType.Thumb));
+                thumbItem = item.GetParents().FirstOrDefault(i => i.HasImage(ImageType.Thumb));
             }
 
             if (logoItem == null)
             {
-                logoItem = item.Parents.FirstOrDefault(i => i.HasImage(ImageType.Logo));
+                logoItem = item.GetParents().FirstOrDefault(i => i.HasImage(ImageType.Logo));
             }
 
             if (thumbItem != null)

+ 2 - 2
MediaBrowser.Server.Implementations/Sync/SyncManager.cs

@@ -341,7 +341,7 @@ namespace MediaBrowser.Server.Implementations.Sync
 
                 if (primaryImage == null)
                 {
-                    var parentWithImage = item.Parents.FirstOrDefault(i => i.HasImage(ImageType.Primary));
+                    var parentWithImage = item.GetParents().FirstOrDefault(i => i.HasImage(ImageType.Primary));
 
                     if (parentWithImage != null)
                     {
@@ -380,7 +380,7 @@ namespace MediaBrowser.Server.Implementations.Sync
 
             if (primaryImage == null)
             {
-                var parentWithImage = item.Parents.FirstOrDefault(i => i.HasImage(ImageType.Primary));
+                var parentWithImage = item.GetParents().FirstOrDefault(i => i.HasImage(ImageType.Primary));
 
                 if (parentWithImage != null)
                 {

+ 2 - 2
MediaBrowser.Server.Implementations/TV/TVSeriesManager.cs

@@ -41,7 +41,7 @@ namespace MediaBrowser.Server.Implementations.TV
                 IncludeItemTypes = new[] { typeof(Series).Name },
                 SortOrder = SortOrder.Ascending
 
-            }, user, parentIds).Cast<Series>();
+            }, parentIds).Cast<Series>();
 
             // Avoid implicitly captured closure
             var episodes = GetNextUpEpisodes(request, user, items);
@@ -63,7 +63,7 @@ namespace MediaBrowser.Server.Implementations.TV
                 IncludeItemTypes = new[] { typeof(Series).Name },
                 SortOrder = SortOrder.Ascending
 
-            }, user, parentsFolders.Select(i => i.Id.ToString("N"))).Cast<Series>();
+            }, parentsFolders.Select(i => i.Id.ToString("N"))).Cast<Series>();
 
             // Avoid implicitly captured closure
             var episodes = GetNextUpEpisodes(request, user, items);

+ 1 - 1
MediaBrowser.Server.Startup.Common/ApplicationHost.cs

@@ -419,7 +419,7 @@ namespace MediaBrowser.Server.Startup.Common
             UserManager = new UserManager(LogManager.GetLogger("UserManager"), ServerConfigurationManager, UserRepository, XmlSerializer, NetworkManager, () => ImageProcessor, () => DtoService, () => ConnectManager, this, JsonSerializer, FileSystemManager);
             RegisterSingleInstance(UserManager);
 
-            LibraryManager = new LibraryManager(Logger, TaskManager, UserManager, ServerConfigurationManager, UserDataManager, () => LibraryMonitor, FileSystemManager, () => ProviderManager);
+            LibraryManager = new LibraryManager(Logger, TaskManager, UserManager, ServerConfigurationManager, UserDataManager, () => LibraryMonitor, FileSystemManager, () => ProviderManager, () => UserViewManager);
             RegisterSingleInstance(LibraryManager);
 
             var musicManager = new MusicManager(LibraryManager);