diff options
| author | Luke Pulverenti <luke.pulverenti@gmail.com> | 2014-06-04 22:32:40 -0400 |
|---|---|---|
| committer | Luke Pulverenti <luke.pulverenti@gmail.com> | 2014-06-04 22:32:40 -0400 |
| commit | 7049ad66f47f4de3a62e0cc10ca8911f1dc454a7 (patch) | |
| tree | 1984bb5f9780b0c413bbb62dcc66d91d2cb1d27e /MediaBrowser.Controller | |
| parent | 39547de1f8ece19e609fe248514684c2f394ac2b (diff) | |
added library grouping settings.
Diffstat (limited to 'MediaBrowser.Controller')
| -rw-r--r-- | MediaBrowser.Controller/Entities/Folder.cs | 7 | ||||
| -rw-r--r-- | MediaBrowser.Controller/Entities/User.cs | 8 | ||||
| -rw-r--r-- | MediaBrowser.Controller/Entities/UserRootFolder.cs | 93 | ||||
| -rw-r--r-- | MediaBrowser.Controller/Entities/UserView.cs | 67 | ||||
| -rw-r--r-- | MediaBrowser.Controller/MediaBrowser.Controller.csproj | 1 |
5 files changed, 173 insertions, 3 deletions
diff --git a/MediaBrowser.Controller/Entities/Folder.cs b/MediaBrowser.Controller/Entities/Folder.cs index 5b5747b8f1..87b1cc7a3d 100644 --- a/MediaBrowser.Controller/Entities/Folder.cs +++ b/MediaBrowser.Controller/Entities/Folder.cs @@ -790,6 +790,11 @@ namespace MediaBrowser.Controller.Entities return hasLinkedChildren ? list.DistinctBy(i => i.Id).ToList() : list; } + protected virtual IEnumerable<BaseItem> GetEligibleChildrenForRecursiveChildren(User user) + { + return Children; + } + /// <summary> /// Adds the children to list. /// </summary> @@ -803,7 +808,7 @@ namespace MediaBrowser.Controller.Entities { var hasLinkedChildren = false; - foreach (var child in Children) + foreach (var child in GetEligibleChildrenForRecursiveChildren(user)) { if (child.IsVisible(user)) { diff --git a/MediaBrowser.Controller/Entities/User.cs b/MediaBrowser.Controller/Entities/User.cs index 0a34b80168..a2803d2cec 100644 --- a/MediaBrowser.Controller/Entities/User.cs +++ b/MediaBrowser.Controller/Entities/User.cs @@ -4,6 +4,7 @@ using MediaBrowser.Controller.Providers; using MediaBrowser.Model.Configuration; using MediaBrowser.Model.Serialization; using System; +using System.Collections.Generic; using System.IO; using System.Runtime.Serialization; using System.Threading; @@ -182,7 +183,7 @@ namespace MediaBrowser.Controller.Entities /// </summary> /// <value>The configuration directory path.</value> [IgnoreDataMember] - private string ConfigurationDirectoryPath + internal string ConfigurationDirectoryPath { get { @@ -246,5 +247,10 @@ namespace MediaBrowser.Controller.Entities Configuration = config; SaveConfiguration(); } + + public IEnumerable<Folder> GetViews() + { + return ((UserRootFolder)RootFolder).GetViews(this, CancellationToken.None).Result; + } } } diff --git a/MediaBrowser.Controller/Entities/UserRootFolder.cs b/MediaBrowser.Controller/Entities/UserRootFolder.cs index e5a8135c2d..ec7c02cfa3 100644 --- a/MediaBrowser.Controller/Entities/UserRootFolder.cs +++ b/MediaBrowser.Controller/Entities/UserRootFolder.cs @@ -1,6 +1,12 @@ -using MediaBrowser.Controller.Providers; +using MediaBrowser.Common.Extensions; +using MediaBrowser.Controller.Entities.Audio; +using MediaBrowser.Controller.Entities.Movies; +using MediaBrowser.Controller.Entities.TV; +using MediaBrowser.Controller.Providers; +using MediaBrowser.Model.Entities; using System; using System.Collections.Generic; +using System.IO; using System.Linq; using System.Threading; using System.Threading.Tasks; @@ -51,5 +57,90 @@ namespace MediaBrowser.Controller.Entities LibraryManager.RegisterItem(item); } } + + public async Task<IEnumerable<Folder>> GetViews(User user, CancellationToken cancellationToken) + { + var folders = user.RootFolder + .GetChildren(user, true) + .OfType<Folder>() + .ToList(); + + var list = new List<Folder>(); + + var excludeFolderIds = user.Configuration.ExcludeFoldersFromGrouping.Select(i => new Guid(i)).ToList(); + + var standaloneFolders = folders.Where(i => UserView.IsExcludedFromGrouping(i) || excludeFolderIds.Contains(i.Id)).ToList(); + + list.AddRange(standaloneFolders); + + var recursiveChildren = folders + .Except(standaloneFolders) + .SelectMany(i => i.GetRecursiveChildren(user, false)) + .ToList(); + + if (recursiveChildren.OfType<Series>().Any()) + { + list.Add(await GetUserView(CollectionType.TvShows, user, cancellationToken).ConfigureAwait(false)); + } + + if (recursiveChildren.OfType<MusicAlbum>().Any() || + recursiveChildren.OfType<MusicVideo>().Any()) + { + list.Add(await GetUserView(CollectionType.Music, user, cancellationToken).ConfigureAwait(false)); + } + + if (recursiveChildren.OfType<Movie>().Any()) + { + list.Add(await GetUserView(CollectionType.Movies, user, cancellationToken).ConfigureAwait(false)); + } + + if (recursiveChildren.OfType<Game>().Any()) + { + list.Add(await GetUserView(CollectionType.Games, user, cancellationToken).ConfigureAwait(false)); + } + + if (recursiveChildren.OfType<BoxSet>().Any()) + { + list.Add(await GetUserView(CollectionType.BoxSets, user, cancellationToken).ConfigureAwait(false)); + } + + return list.OrderBy(i => i.SortName); + } + + // Use this to force new entity creation, as needed + private const string DataVersion = "5"; + private async Task<UserView> GetUserView(string type, User user, CancellationToken cancellationToken) + { + var name = LocalizationManager.GetLocalizedString("ViewType" + type); + + var id = "view" + name + DataVersion + user.Id.ToString("N"); + var guid = id.GetMD5(); + + var item = LibraryManager.GetItemById(guid) as UserView; + + if (item == null) + { + var path = System.IO.Path.Combine(user.ConfigurationDirectoryPath, + "views", + FileSystem.GetValidFilename(name)); + + Directory.CreateDirectory(System.IO.Path.GetDirectoryName(path)); + + item = new UserView + { + Path = path, + Id = guid, + DateCreated = DateTime.UtcNow, + Name = name, + ViewType = type + }; + + await LibraryManager.CreateItem(item, cancellationToken).ConfigureAwait(false); + + await item.RefreshMetadata(cancellationToken).ConfigureAwait(false); + } + + return item; + } } } diff --git a/MediaBrowser.Controller/Entities/UserView.cs b/MediaBrowser.Controller/Entities/UserView.cs new file mode 100644 index 0000000000..ce188554cd --- /dev/null +++ b/MediaBrowser.Controller/Entities/UserView.cs @@ -0,0 +1,67 @@ +using MediaBrowser.Controller.Entities.Movies; +using MediaBrowser.Controller.Entities.TV; +using MediaBrowser.Model.Entities; +using System; +using System.Collections.Generic; +using System.Linq; + +namespace MediaBrowser.Controller.Entities +{ + public class UserView : Folder + { + public string ViewType { get; set; } + + public override IEnumerable<BaseItem> GetChildren(User user, bool includeLinkedChildren) + { + var mediaFolders = GetMediaFolders(user); + + switch (ViewType) + { + case CollectionType.Games: + return mediaFolders.SelectMany(i => i.GetRecursiveChildren(user, includeLinkedChildren)).OfType<GameSystem>(); + case CollectionType.BoxSets: + return mediaFolders.SelectMany(i => i.GetRecursiveChildren(user, includeLinkedChildren)).OfType<BoxSet>(); + case CollectionType.TvShows: + return mediaFolders.SelectMany(i => i.GetRecursiveChildren(user, includeLinkedChildren)).OfType<Series>(); + default: + return mediaFolders.SelectMany(i => i.GetChildren(user, includeLinkedChildren)); + } + } + + protected override IEnumerable<BaseItem> GetEligibleChildrenForRecursiveChildren(User user) + { + return GetChildren(user, false); + } + + private IEnumerable<Folder> GetMediaFolders(User user) + { + var excludeFolderIds = user.Configuration.ExcludeFoldersFromGrouping.Select(i => new Guid(i)).ToList(); + + return user.RootFolder + .GetChildren(user, true) + .OfType<Folder>() + .Where(i => !excludeFolderIds.Contains(i.Id) && !IsExcludedFromGrouping(i)); + } + + public static bool IsExcludedFromGrouping(Folder folder) + { + var standaloneTypes = new List<string> + { + CollectionType.AdultVideos, + CollectionType.Books, + CollectionType.HomeVideos, + CollectionType.Photos, + CollectionType.Trailers + }; + + var collectionFolder = folder as CollectionFolder; + + if (collectionFolder == null) + { + return false; + } + + return standaloneTypes.Contains(collectionFolder.CollectionType ?? string.Empty); + } + } +} diff --git a/MediaBrowser.Controller/MediaBrowser.Controller.csproj b/MediaBrowser.Controller/MediaBrowser.Controller.csproj index 1d3c007a70..38db9e8816 100644 --- a/MediaBrowser.Controller/MediaBrowser.Controller.csproj +++ b/MediaBrowser.Controller/MediaBrowser.Controller.csproj @@ -144,6 +144,7 @@ <Compile Include="Entities\MusicVideo.cs" /> <Compile Include="Entities\IHasAwards.cs" /> <Compile Include="Entities\Photo.cs" /> + <Compile Include="Entities\UserView.cs" /> <Compile Include="FileOrganization\IFileOrganizationService.cs" /> <Compile Include="Library\DeleteOptions.cs" /> <Compile Include="Library\ILibraryPostScanTask.cs" /> |
