diff options
Diffstat (limited to 'MediaBrowser.Controller/Entities/UserRootFolder.cs')
| -rw-r--r-- | MediaBrowser.Controller/Entities/UserRootFolder.cs | 93 |
1 files changed, 92 insertions, 1 deletions
diff --git a/MediaBrowser.Controller/Entities/UserRootFolder.cs b/MediaBrowser.Controller/Entities/UserRootFolder.cs index e5a8135c2..ec7c02cfa 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; + } } } |
